硅基俊宁.
Skills · 技能体系 ↗
← 返回文章

从零开发一个 Node Cli

俊宁 · 2020-02-17
迁自历史博客,保留原文、署名、引用与原始日期;文中的版本、成果与性能结论不代表重新完成了当前验收。
查看原始出处 ↗ · 查看迁移清单
从零开发一个 Node Cli封面

Node.js 用途很广,常用来开发服务、桌面应用等被开发者熟知,Node.js 还有另外一个非常实用的场景 - 命令行应用(后文统称 CLI)。

本文可参考的源码:https://github.com/youngjuning/cli

HelloWorld

创建一个youngjuning 目录,并使用进入该目录:

$ mkdir youngjuning && cd youngjuning

在该目录下新建 bin/cli.js:

#!/usr/bin/env node
console.log('Hello World')

使用 package.json 的 bin 项是用来指定各个内部命令对应的可执行文件的位置:

"bin": {
  "youngjuning": "./bin/cli.js"
}

在命令行输入 npm link 或 npm install -g 将当前项目安装到全局环境,这样就可以直接使用 youngjuning 来运行文件了。

commander.js

Node.js 为我们提供了 process.argv 来读取命令行参数,这里我们对此不作介绍,有兴趣可以自行研究,我选择了 tj 大神的 commander:

inquire.js

交互命令输入插件!

基本语法

const answers = await inquirer.prompt([
  /* Pass your questions in here */
])
console.log(answers)

参数详解

实现动态模板

const fs = require('fs')
const handlebars = require('handlebars')
const recursive = require('recursive-readdir')

const compile = (meta, file) => {
  const content = fs.readFileSync(file).toString()
  const result = handlebars.compile(content)(meta)
  fs.writeFileSync(file, result)
}

module.exports = (meta, src) => {
  recursive(src, (err, files) => {
    files.forEach(file => {
      compile(meta, file)
    })
  })
}

命令行工具