序言
这里假设本文读者对 FIS 已经比较熟悉,如还不了解,可猛击官方文档。
虽然 FIS 整体的源码结构比较清晰,不过讲解起来也是个系统庞大的工程,笔者尽量的挑重点的讲。如果读者有感兴趣的部分笔者没有提到的,或者是存在疑惑的,可以在评论里跑出来,笔者会试着去覆盖这些点。
下笔匆忙,如有错漏请指出。
Getting started
如在开始剖析 FIS 的源码前,有三点内容首先强调下,这也是解构 FIS 内部设计的基础。
1、 FIS 支持三个命令,分别是 fis release
、fis server
、fis install
。当用户输入 fis xx
的时候,内部调用 fis-command-release
、fis-command-server
、fis-command-install
这三个插件来完成任务。同时,FIS 的命令行基于 commander
这个插件构建,熟悉这个插件的同学很容易看懂 FIS 命令行相关部分源码。
2、FIS 以 fis-kernel
为核心。fis-kernel
提供了 FIS 的底层能力,包含了一系列模块,如配置、缓存、文件处理、日志等。FIS 的三个命令,最终调用了这些模块来完成构建的任务。参考 fis-kernel/lib/
目录,下面对每个模块的大致作用做了简单备注,后面的文章再详细展开。
3、FIS 的编译过程,最终可以拆解为细粒度的单文件编译,理解了下面这张图,对于阅读 FIS 的源码有非常大的帮助。(主要是 fis release
这个命令)
一个简单的例子:fis server open
开篇的描述可能比较抽象,下面我们来个实际的例子。通过这个简单的例子,我们可以对 FIS 的整体设计有个大致的印象。
下文以 fis server open
为例,逐步剖析 FIS 的整体设计。其实 FIS 比较精华的部分集中在 fis release
这个命令,不过 fis server
这个命令相对简单,更有助于我们从纷繁的细节中跳出来,窥探 FIS 的整体概貌。
假设我们已经安装了 FIS。好,打开控制台,输入下面命令,其实就是打开 FIS 的 server 目录
从 package.json
可以知道,此时调用了 fis/bin/fis
,里面只有一行有效代码,调用 fis.cli.run()
方法,同时将进程参数传进去。
接下来看下../fis.js
。代码结构非常清晰。注意,笔者将一些代码给去掉,避免长串的代码影响理解。同时在关键处加了简单的注释
我们来看下笔者注释过的 fis.cli.run
的源码。
- 如果是
fis -h
或者fis --help
,打印帮助信息 - 如果是
fis -v
或者fis --version
,打印版本信息 - 其他情况:加载相关命令对应的插件,并执行命令,比如
fis-command-server
通过 fis.cli.run
的源码,我们可以看到,fis-command-xx
插件,都提供了 register
方法,在这个方法内完成命令的初始化。之后,通过 commander.parse(argv)
来执行命令。
整个流程归纳如下:
- 用户输入 FIS 命令,如
fis server open
- 解析命令,根据指令加载对应插件,如
fis-command-server
- 执行命令
fis-command-server 源码
三个命令相关的插件中,fis-command-server
的代码比较简单,这里就通过它来大致介绍下。
根据惯例,同样是抽取一个超级精简版的 fis-command-server
,这不影响我们对源码的理解
好了,fis server open
就大致剖析到这里。只要熟悉 commander
这个插件,相信不难看懂上面的代码,这里就不多做展开了,有空也写篇科普文讲下 commander
的使用。
写在后面
如序言所说,欢迎交流探讨。如有错漏,请指出。
文章: casperchen