虽然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>的使用。
如序言所说,欢迎交流探讨。如有错漏,请指出。