微信小程序「官方示例代碼」剖析【下】:運(yùn)行機(jī)制

在上一篇《微信小程序「官方示例代碼」淺析【上】》中污淋,我們只是簡(jiǎn)單的羅列了一下代碼,這一篇寸爆,讓我們來(lái)玩點(diǎn)刺激的——就是看看IDE的代碼找田,了解它是怎么運(yùn)行的。

還好微信的開發(fā)團(tuán)隊(duì)在軟件工程的實(shí)踐還有待提高心铃,我們才有機(jī)會(huì)可以深入了解他們的代碼——真想建議他們看看Growth的第二部分樊破,構(gòu)建系統(tǒng)奔滑。

解壓應(yīng)用

首先你需要有下面的工具啦

  • Mac電腦
  • 微信web開發(fā)者工具.app
  • WebStorm / 其他編程器 或 IDE脆炎,最好可以支持重命名

首先,我們需要右鍵微信web開發(fā)者工具.app癞松,然后顯示包的內(nèi)容枫甲,在 Contents/Resources/app.nw下面的內(nèi)容即是我們的代碼,拷貝出來(lái)啦:

drwxr-xr-x@   7 fdhuang  staff   238B Sep 22 19:43 app
drwxr-xr-x@   4 fdhuang  staff   136B Sep 21 13:12 modified_modules
drwxr-xr-x@ 194 fdhuang  staff   6.4K Sep 21 13:12 node_modules
-rw-r--r--    1 fdhuang  staff   900B Sep 22 21:09 package.json

簡(jiǎn)單的說(shuō)明一下:

  • app/ 目錄下放置了app的代碼
  • modified_modules/ 即一些修改后的模塊
  • node_modules/ 地球人都知道
  • package.json 呵呵幔崖,你一定是知道的,配置了NW相關(guān)的內(nèi)容

modified_modules目錄下有兩個(gè)子模塊:

  • anyproxy自娩,從名字就可以看起來(lái)這是一個(gè)代理模塊
  • weinre智什,遠(yuǎn)程調(diào)試工具

IDE運(yùn)行順序

我們已經(jīng)知道了這是一個(gè)NodeWebkit封裝的Web應(yīng)用了。

在package.json中的"main": "app/html/index.html",删豺,即定義了這個(gè)APP的入口是這個(gè)index.html蓬蝶,而不是別的文件。

很順利的我們看到了他們調(diào)用的文件了:

<script src="../dist/app.js"></script>

這里面有一個(gè)init方法定续,看來(lái)他就是NodeWebkit相關(guān)的入口了倡鲸。用WebStorm的shift + f6 RENAME 這些變量好十幾次宁炫,終于看到了下面的代碼了:

var React = require("../dist/lib/react.js");
var reactDom = require("../dist/lib/react-dom.js");
var init = require("../dist/common/loadInit/init.js");
var controller = require("../dist/components/ContainController.js");
var proxy = require("../dist/common/proxy/startProxy.js");
var windowActions = require("../dist/actions/windowActions.js");
var webViewAction = require("../dist/actions/webviewActions.js");
var webViewStore = require("../dist/stroes/webviewStores.js");
var log = require("../dist/common/log/log.js");
var shortCut = require("../dist/common/shortCut/shortCut.js");
var isDev = global.appConfig.isDev;

這是一個(gè)React應(yīng)用竿秆,還好我一年多以前學(xué)得不錯(cuò)傅是。掃視了一下代碼帽驯,終于看到了這一句:

reactDom.render(React.createElement(controller, null), document.querySelector("#container")

直接跳轉(zhuǎn)到ContainController.js,跳轉(zhuǎn)到render方法哀澈,找到了這個(gè):

React.createElement(Main, {
    project: this.state.project,
    appQuit: this.appQuit,
    appMax: this.appMax,
    appMin: this.appMin
})

果然Main里面就是大入口了

React.createElement("div", {className: "main"},
    React.createElement(menuBar, {
        appQuit: this.props.appQuit,
        appMin: this.props.appMin,
        appMax: this.props.appMax,
        showSetting: this.showSetting,
        project: this.props.project
    }),
    React.createElement(toolbar, {project: this.props.project}),
    React.createElement("div", {
            className: "body"
        },
        React.createElement(sidebar, {
            project: this.props.project,
            optProject: this.optProject
        }),
        React.createElement(develop, {
            show: this.state.show,
            optDebugger: this.optDebugger,
            project: this.props.project
        }),
        React.createElement(edit, {
            show: this.state.show,
            project: this.props.project
        }),
        React.createElement(detail, {
            project: this.props.project,
            show: this.state.show
        })),
    React.createElement(toast, null),
    React.createElement(setting, {
        show: this.state.showSetting,
        showSetting: this.showSetting
    }),
    React.createElement(dialog, null),
    React.createElement(popup, null),
    React.createElement(about, null))
}

對(duì)應(yīng)的就是下面這個(gè)界面了:

editor-face.jpg
  • edit 就是編輯器及其相關(guān)的事項(xiàng)
  • detail就是項(xiàng)目的配置

WeApp是如何運(yùn)行的

慢慢的就探索到了打包,其運(yùn)行時(shí)的過(guò)程。由于我并沒有拿到內(nèi)測(cè)資格鱼鼓,所以我只好邊看邊猜測(cè)一下置媳。

在之前的文章中,我們提到了兩點(diǎn)很有意思的東西:wxmlwxss谒拴,這兩個(gè)文件會(huì)被分別轉(zhuǎn)換惭聂,即wxml -> html见剩,wxss -> css。對(duì)應(yīng)的有幾個(gè)不同的transform:

  • transWxmlToJs
  • transWxssToCss
  • transConfigToPf
  • transWxmlToHtml
  • transManager

這里的PF指代的是PageFrame的意思没炒,pageFrame有一個(gè)對(duì)應(yīng)的模板文件:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <link  rel="Shortcut Icon">
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
 <script>
   var __webviewId__;
 </script>
 <!-- percodes -->
 <!--{{WAWebview}}-->
 <!--{{reportSDK}}-->
 <!--{{webviewSDK}}-->
 <!--{{exparser}}-->
 <!--{{components_js}}-->
 <!--{{virtual_dom}}-->
 <!--{{components_css}}-->
 <!--{{allWXML}}-->
 <!--{{eruda}}-->
 <!--{{style}}-->
 <!--{{currentstyle}}-->
 <!--{{generateFunc}}-->
</head>
<body>
 <div></div>
</body>
</html>

這種風(fēng)格一看就是生成字符串Replace的,然后他們寫了一個(gè)名為wcc以及一個(gè)名為wcsc的工具。

  • wcc用于轉(zhuǎn)轉(zhuǎn)wxml中的自定義tag為virtual_dom
  • wcsc破停,我觀察到的現(xiàn)象是它為轉(zhuǎn)換wxss為css

這樣的話,我們就可以理解為微信小應(yīng)用有點(diǎn)類似于 Virtual Dom + WebView,畢竟上面有個(gè)WAWebView文件 ,還有一個(gè)webviewSDK文件 。

當(dāng)然無(wú)論是React + WebView币厕,或者Vue + WebView都不重要,現(xiàn)在有了 WA + WebView了腺兴,哈哈枕扫。

WeApp采用的是如下圖所示的提交方式,所以:

commit.jpg

你在本地寫的WeApp都會(huì)被提交到微信服務(wù)器,然后打包檀夹,上傳到服務(wù)器,交給CDN——畢竟為了分發(fā)宫仗。

上傳的過(guò)程大致如下:

好了俄讹,瞎扯完了延曙,睡覺準(zhǔn)備寫繼續(xù)寫新書了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涛碑,一起剝皮案震驚了整個(gè)濱河市痛悯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仰迁,老刑警劉巖恰起,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忠烛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胯陋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人男杈,你說(shuō)我怎么就攤上這事苞冯♂;模” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵提澎,是天一觀的道長(zhǎng)姚垃。 經(jīng)常有香客問我,道長(zhǎng)盼忌,這世上最難降的妖魔是什么积糯? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任掂墓,我火速辦了婚禮,結(jié)果婚禮上絮宁,老公的妹妹穿的比我還像新娘梆暮。我一直安慰自己,他們只是感情好绍昂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布啦粹。 她就那樣靜靜地躺著,像睡著了一般窘游。 火紅的嫁衣襯著肌膚如雪唠椭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天忍饰,我揣著相機(jī)與錄音贪嫂,去河邊找鬼。 笑死艾蓝,一個(gè)胖子當(dāng)著我的面吹牛力崇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赢织,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亮靴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了于置?” 一聲冷哼從身側(cè)響起茧吊,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎八毯,沒想到半個(gè)月后搓侄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡话速,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年讶踪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泊交。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俊柔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出活合,到底是詐尸還是另有隱情,我是刑警寧澤物赶,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布白指,位于F島的核電站,受9級(jí)特大地震影響酵紫,放射性物質(zhì)發(fā)生泄漏告嘲。R本人自食惡果不足惜错维,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄唬。 院中可真熱鬧赋焕,春花似錦、人聲如沸仰楚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)僧界。三九已至侨嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捂襟,已是汗流浹背咬腕。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葬荷,地道東北人涨共。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宠漩,于是被迫代替她去往敵國(guó)和親举反。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容