解决方案封装
什么时候需要封装?
- 现有解决不能满足你的需求:fis-plus, jello, spmx, phiz, gois。
- 基于某一解决方案,需要配置的东西和安装的插件过多,不便于组内交接。
- 需要覆写某些插件。
- 你想采用更 nice 的命令名字。
如何封装?
- 先取一个名字,以下示例就用 hello 作为命令名字吧。
- 新建一个入口 js 文件。如: index.js
- npm init 初始化项目
~/projects/hello touch index.js
~/projects/hello npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (hello)
version: (0.0.0) 0.0.1
description: hello
entry point: (index.js)
test command:
git repository:
keywords: fis
author: name
license: (ISC) BSD
About to write to /Users/liaoxuezhi/projects/hello/package.json:
{
"name": "hello",
"version": "0.0.1",
"description": "hello",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"fis"
],
"author": "name",
"license": "BSD"
}
Is this ok? (yes) yes
~/projects/hello
- 安装 fis 依赖
npm install fis --save
- 修改 index.js 内容为:
var fis = module.exports = require('fis');
fis.cli.name = 'hello';
fis.cli.info = fis.util.readJSON(__dirname + '/package.json');
- 新建 hello bin 文件。
~/projects/hello mkdir bin
~/projects/hello touch bin/hello
~/projects/hello echo "require('../hello.js').cli.run( process.argv );" >> bin/hello
- 到此一个简单的包装已经完成,此 hello 项目安装到 global 后,已经具有所有 fis 所有的功能。
捆绑插件
可以把一些常用的插件捆绑进来,比如 fis 中没有捆绑 markdown 的解析器,以下示例把 markdown 的解析器捆绑进来。
npm install fis-parser-marked —save
执行完成后可以发现 package.json
文件里面多了一个依赖。
"dependencies": {
"fis": "~1.7.9",
"fis-parser-marked": "0.0.1"
}
- 修改 hello.js, 添加配置项,开启此插件。
fis.config.merge({
roadmap : {
ext : {
md : 'html'
}
},
modules : {
parser : {
md : 'marked'
}
}
});
- 到此
fis-parser-marked
便捆绑进了 hello 工具中,其他人员只需安转 hello 就可以使用 md 文件自动装成 html 的功能。
覆写插件
写过 node 的同学应该都知道 require 的查找顺序,比如 require('fis-command-release')。当第一次加载此模块的时候,先会尝试当前脚本所在的目录下查找 node_modules/fis-command-release 模块,如果没找到,再往上级目录找,直到找到或者没有上级目录了为止。那么,当fis cli执行的时候,require 某个命令模块,其实最先找到的是 fis 模块下的 fis-command-xxx 然后才是 hello 模块的 fis-command-xxx。如是出现了一个问题,就是我们的模块里面只能新加模块,而不能覆写模块。
的确,之前确实是这样的,好在 fis 内部所有 require 模块的地方不是直接使用系统的require 方法,而是 fis.require 方法。如是,小修改了下逻辑,原来是固定查找 fis- 打头的插件,现在你可以控制,让其先加载 hello- 打头的插件,然后才查找 fis- 打头的插件。
fis.require.prefixes.unshift('hello');
如是,在 hello 模块下安装 hello-command-release 便可以优先与 fis-command-release 被加载,如此实现了对 hello release
命令的覆写。
更多扩展
原来写在 fis-conf.js 的内容,如果足够通用,其实可以完全写在 hello.js 文件里面。这样封装好后,其他同学可以减少使用成本。
更多配置移步到配置API页面。有任何问题,请在 https://github.com/fex-team/fis/issues 讨论