使用Meteor建立和運行一個應用是很是簡單的,而簡單的背後就是繁雜的細節。 咱們但願經過分析源碼,抽絲剝繭,來理解這簡單背後的細節之美。node
meteor v0.9.0.1linux
首先咱們得建立一個應用meteor create test
,後面的代碼分析都會用到這個應用。 在Meteor中只要在應用目錄中執行meteor命令就能夠運行這個應用了,應用正常運行以後會有以下打印:web
[[[[[ ~/WCode/test ]]]]] => Started proxy. => Started your app. => App running at: http://localhost:3000/
從上面的打印看Meteor先啓動proxy、而後再啓動app,可是在啓動proxy以前應該還作了一些事的, 好比校驗傳入參數、獲取環境變量、加載Package和Module等等。 根據上述推測,咱們暫時把應用的啓動過程分爲四個步驟:環境配置、加載、啓動proxy和啓動app。app
當咱們執行curl https://install.meteor.com/ | sh
完成meteor安裝以後, 系統中會出現一個/usr/local/bin/meteor
可執行文件和一個~/.meteor/
目錄。 ~/.meteor/
目錄中包含了Meteor運行須要的全部腳本、包和模塊。 /usr/local/bin/meteor
這個Shell腳本作了兩件事:curl
~/.meteor/meteor
。其實這個腳本執行了一次以後,就不須要再執行這個腳本了, 徹底能夠把~/.meteor/
加入到$PATH中或者建立連接來直接執行~/.meteor/meteor
。函數
執行ls ~/.meteor/meteor -al
這個命令就能夠看到其實這只是個連接, 實際的文件是~/.meteor/packages/meteor-tool/1.0.26/meteor-tool-os.linux.x86_32/meteor
。url
這也是個Shell腳本,也作了兩件事:檢查Meteor版本和運行exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@"
其中DEV_BUNDLE="$SCRIPT_DIR/dev_bundle"
,METEOR="$SCRIPT_DIR/tools/main.js"
, $@
是輸入的命令和參數 而SRCIPT_DIR=~/.meteor/packages/meteor-tool/.1.0.26.13pjtg1++os.linux.x86_32+web.browser+web.cordova/meteor-tool-os.linux.x86_32/
code
所以,meteor運行的真正入口是main.js
,這個文件在源碼中位於tools目錄下。cordova
main.js中Fiber(function(){...}).run()
相似於C語言中的main()函數,是全部函數的入口。 這個函數首先檢查Node的版本和ROOT_URL,而後解析並校驗傳入的命令和參數,最後執行命令。 全部命令的實如今tools/command.js中,默認的命令是run。源碼