雖然fis整體的源碼結構比較清晰,不過講解起來也是個系統龐大的工程,筆者盡量的挑重點的講。如果讀者有感興趣的部分筆者沒有提到的,或者是存在疑惑的,可以在評論裡跑出來,筆者會試着去覆寫這些點。
下筆匆忙,如有錯漏請指出。
如在開始剖析fis的源碼前,有三點内容首先強調下,這也是解構fis内部設計的基礎。
1、 fis支援三個指令,分别是<code>fis release</code>、<code>fis server</code>、<code>fis install</code>。當使用者輸入<code>fis xx</code>的時候,内部調用<code>fis-command-release</code>、<code>fis-command-server</code>、<code>fis-command-install</code>這三個插件來完成任務。同時,fis的指令行基于<code>commander</code>這個插件建構,熟悉這個插件的同學很容易看懂fis指令行相關部分源碼。
2、fis以<code>fis-kernel</code>為核心。<code>fis-kernel</code>提供了fis的底層能力,包含了一系列子產品,如配置、緩存、檔案處理、日志等。fis的三個指令,最終調用了這些子產品來完成建構的任務。參考 <code>fis-kernel/lib/</code> 目錄,下面對每個子產品的大緻作用做了簡單備注,後面的文章再詳細展開。

開篇的描述可能比較抽象,下面我們來個實際的例子。通過這個簡單的例子,我們可以對fis的整體設計有個大緻的印象。
下文以<code>fis server open</code>為例,逐漸剖析fis的整體設計。其實fis比較精華的部分集中在<code>fis release</code>這個指令,不過<code>fis server</code>這個指令相對簡單,更有助于我們從紛繁的細節中跳出來,窺探fis的整體概貌。
假設我們已經安裝了fis。好,打開控制台,輸入下面指令,其實就是打開fis的server目錄
從<code>package.json</code>可以知道,此時調用了 <code>fis/bin/fis</code>,裡面隻有一行有效代碼,調用<code>fis.cli.run()</code>方法,同時将程序參數傳進去。
接下來看下<code>../fis.js</code>。代碼結構非常清晰。注意,筆者将一些代碼給去掉,避免長串的代碼影響了解。同時在關鍵處加了簡單的注釋
我們來看下筆者注釋過的<code>fis.cli.run</code>的源碼。
如果是<code>fis -h</code>或者<code>fis --help</code>,列印幫助資訊
如果是<code>fis -v</code>或者<code>fis --version</code>,列印版本資訊
其他情況:加載相關指令對應的插件,并執行指令,比如 <code>fis-command-server</code>
通過<code>fis.cli.run</code>的源碼,我們可以看到,<code>fis-command-xx</code>插件,都提供了<code>register</code>方法,在這個方法内完成指令的初始化。之後,通過<code>commander.parse(argv)</code>來執行指令。
整個流程歸納如下:
使用者輸入fis指令,如<code>fis server open</code>
解析指令,根據指令加載對應插件,如<code>fis-command-server</code>
執行指令
三個指令相關的插件中,<code>fis-command-server</code>的代碼比較簡單,這裡就通過它來大緻介紹下。
根據慣例,同樣是抽取一個超級精簡版的<code>fis-command-server</code>,這不影響我們對源碼的了解
好了,<code>fis server open</code> 就大緻剖析到這裡。隻要熟悉<code>commander</code>這個插件,相信不難看懂上面的代碼,這裡就不多做展開了,有空也寫篇科普文講下<code>commander</code>的使用。
如序言所說,歡迎交流探讨。如有錯漏,請指出。