antd-tools/lib/cli/index.js 源码解析

富文本编辑器前前后后迭代了一个多月,准备往开源的路上走,发现离开源还有好长的路要走。目前看下来有以下几步:

1. js=>ts化,使代码更规范对IDE也更友好
2. 抽象耦合自己的项目的业务逻辑
3. .d.ts声明文件的生成与DefinetlyTypes的发布
4. npm发布
5. readme.md的文档编写

首当其冲的就是typescript化,于是周末两天浏览完了官网的文档,心里知道概念,以及相应知识点去哪寻找,也跟着做了下miscrosoft的repo下react-with-typescript-sample和node-starter-with-typescript. 感觉都太初级了,无法融入进项目,想找些成熟项目学习一下,于是ant-design这个前端的榜样项目进入了我的法眼。(崇拜偏右~~)
二话不说,fork项目,感觉要从构建学起,好吧,那就从antd-tools开始:

这是源码:

#!/usr/bin/env node

'use strict';

require('colorful').colorful();

const program = require('commander');
const packageInfo = require('../../package.json');

program
  .version(packageInfo.version)
  .command('run [name]', 'run specified task')
  .parse(process.argv);

// https://github.com/tj/commander.js/pull/260
const proc = program.runningCommand;
if (proc) {
  proc.on('close', process.exit.bind(process));
  proc.on('error', () => {
    process.exit(1);
  });
}

const subCmd = program.args[0];
if (!subCmd || subCmd !== 'run') {
  program.help();
}

解析
#!/usr/bin/env node:这种用法是为了防止操作系统用户没有将node装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找node的安装路径,再调用对应路径下的解释器程序完成操作。
require('colorful').colorful();:给终端上色~
const program = require('commander');:node解析命令的工具
.version(packageInfo.version):支持显示版本号参数

const proc = program.runningCommand; if (proc) { proc.on('close', process.exit.bind(process)); proc.on('error', () => { process.exit(1); }); }:一个针对子命令出错却不冒泡的work-around;

const subCmd = program.args[0]; if (!subCmd || subCmd !== 'run') { program.help(); }:如果命令的第一个子命令为空或者不是antd-tools run 的形式,就打印帮助信息.

非常重要的一点:子命令模式:

.command('run [name]', 'run specified task'):由于后面没有跟action作为回调因此采用了子命令模式,换句话说就是调用了antd-tools-run命令,这是一个非常重要的知识点。下面是一个官方commander.js库的例子:

#!/usr/bin/env node

var program = require('..');

program
  .version('0.0.1')
  .description('Fake package manager')
  .command('install [name]', 'install one or more packages').alias('i')
  .command('search [query]', 'search with optional query').alias('s')
  .command('list', 'list packages installed')
  .command('publish', 'publish the package').alias('p')
  .parse(process.argv);

// here .command() is invoked with a description,
// and no .action(callback) calls to handle sub-commands.
// this tells commander that you're going to use separate
// executables for sub-commands, much like git(1) and other
// popular tools.

// here only ./pm-install(1) is implemented, however you
// would define ./pm-search(1) and ./pm-list(1) etc.

// Try the following:
//   ./examples/pm
//   ./examples/pm help install
//   ./examples/pm install -h
//   ./examples/pm install foo bar baz
//   ./examples/pm install foo bar baz --force

你可能感兴趣的:(antd-tools/lib/cli/index.js 源码解析)