FIS 源码解析-整体架构
In 未分类 on 2015年05月08日 by view: 1,368
0

序言

这里假设本文读者对 FIS 已经比较熟悉,如还不了解,可猛击官方文档

虽然 FIS 整体的源码结构比较清晰,不过讲解起来也是个系统庞大的工程,笔者尽量的挑重点的讲。如果读者有感兴趣的部分笔者没有提到的,或者是存在疑惑的,可以在评论里跑出来,笔者会试着去覆盖这些点。

下笔匆忙,如有错漏请指出。

Getting started

如在开始剖析 FIS 的源码前,有三点内容首先强调下,这也是解构 FIS 内部设计的基础。

1、 FIS 支持三个命令,分别是 fis releasefis serverfis install。当用户输入 fis xx 的时候,内部调用 fis-command-releasefis-command-serverfis-command-install 这三个插件来完成任务。同时,FIS 的命令行基于 commander 这个插件构建,熟悉这个插件的同学很容易看懂 FIS 命令行相关部分源码。

2、FIS 以 fis-kernel 为核心。fis-kernel 提供了 FIS 的底层能力,包含了一系列模块,如配置、缓存、文件处理、日志等。FIS 的三个命令,最终调用了这些模块来完成构建的任务。参考 fis-kernel/lib/ 目录,下面对每个模块的大致作用做了简单备注,后面的文章再详细展开。

3、FIS 的编译过程,最终可以拆解为细粒度的单文件编译,理解了下面这张图,对于阅读 FIS 的源码有非常大的帮助。(主要是 fis release 这个命令)

enter image description here

一个简单的例子: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 的源码。

  1. 如果是 fis -h 或者 fis --help,打印帮助信息
  2. 如果是 fis -v 或者 fis --version,打印版本信息
  3. 其他情况:加载相关命令对应的插件,并执行命令,比如 fis-command-server

通过 fis.cli.run 的源码,我们可以看到,fis-command-xx 插件,都提供了 register 方法,在这个方法内完成命令的初始化。之后,通过 commander.parse(argv)来执行命令。

整个流程归纳如下:

  1. 用户输入 FIS 命令,如 fis server open
  2. 解析命令,根据指令加载对应插件,如 fis-command-server
  3. 执行命令

fis-command-server 源码

三个命令相关的插件中,fis-command-server 的代码比较简单,这里就通过它来大致介绍下。

根据惯例,同样是抽取一个超级精简版的 fis-command-server,这不影响我们对源码的理解

好了,fis server open 就大致剖析到这里。只要熟悉 commander 这个插件,相信不难看懂上面的代码,这里就不多做展开了,有空也写篇科普文讲下 commander 的使用。

写在后面

如序言所说,欢迎交流探讨。如有错漏,请指出。

文章: casperchen

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2015/05/fis%e6%ba%90%e7%a0%81%e8%a7%a3%e6%9e%90-%e6%95%b4%e4%bd%93%e6%9e%b6%e6%9e%84/

发表评论