作业中还在为如何提效,如何做出作业亮点忧愁吗?仔细发现痛点 + 开发一款 Node Cli 或许是你的挑选,本文将手把手带你完结 Node CLI 中心开发,而且深化运用 Node CLI 生态库(含细节代码示例),文末预备了 190+ 个Node东西包福利~

前端亮点 or 提效?从开发一款 Node CLI 开始!

一、什么是 CLI

CLI 全称是 Command Line Interface,是一类经过指令行交互的终端东西。Web开发中,咱们无时无刻都在运用CLI 辅助开发,提高操作功率,比如 git、npm、webpack、vite 等

二、为什么需求 CLI

CLI 能够协助咱们更高效的操作计算机体系,作业中,咱们能够咱们将有规则可循的、重复的、繁琐的、模板化的作业,集成到CLI东西中。一个指令,即可快速的完结一些列操作

比较于 GUI 东西(用户图形界面)

  • GUI:更偏重易用性,用户经过点击图形界面,完结相关
  • CLI:更偏重操作功率,经过指令组合主动化操作、批量操作等

三、Node CLI 开发中心过程

前置说明:略过 npm init -y 初始化项目等操作

3.1、界说指令文件

  • 项目中界说 JS指令文件,文件头部必须有 #!/usr/bin/env node
#!/usr/bin/env node
console.log('Hello Node CLI');
  • 头部声明代码,是告知体系运用 NodeJS 履行脚本;如不声明,默许按shell去解析履行
which env ---> /usr/bin/env

3.2、界说终端指令

  • package.json 文件中,声明 bin 字段;格局为:<command>: <JS file>
{
    "bin": {
        "test-cli": "./bin/command.js"
    }
}

3.3、调试 CLI 东西

  • Node CLI 或 依靠包,可经过软链接进行本地调试
  • 创立软链接:在CLI根目录下履行 npm link
  • 调试 CLI:终端运转指令 test-cli,即可看到输出 Hello Node CLI

3.4、发布 CLI 东西

  • 登录 npm:npm login
  • 发布 CLI:npm publish

至此,你已经把握了发布一款简略指令的 Node CLI,但这仅仅一个 DEMO,下面继续学习实操部分吧~

四、Node CLI 最佳实践

4.1、遵循 POSIX 参数

POSIX 语法已被广泛承受为指令行东西的标准,咱们开发指令行东西时,应该恪守它。 常见规则举例如下:

  • 能够指令协助或示例中将选项参数或选项符号为方括号( [] )表明它们是可选的;或带有尖括号( <> )表明它们是必需的。

  • 允许运用短格局的单个字母参数作为长格局参数的别名(请参阅 GNU 编码标准)

  • 运用缩写形式单数指定的选项 – 能够包含一个字母数字字符

  • 指定多个没有值的选项能够进行分组,例如 myCli -abc 等效于 myCli -a -b -c

指令行高级用户期望您的指令行运用程序具有与其他 Unix 运用程序相似的约好

4.2、遵循 Semver 版别

版别格局 X.Y.Z-[state]

  • X 代表 主版别号:功用新增、移除,API不向下兼容
  • Y 代表 次版别号:功用新增,API向下兼容
  • Z 代表 修订版别号:问题修正,API向下兼容
  • [state] 状况解说如下
描绘办法 说明 含义
alpha alpha 版 内测版别:bug 较多
beta beta 版 公测版别:存在bug,有缺点
gamma Gamma 版 相当老练的测验版:与发行版相差无几(一般略过此版别)
rc Release Candidate 发行倒计时版别:实现了悉数功用,修正了大部分 bug,挨近发布倒计时,有时会进一步细分为 rc.1rc.2

4.3、供给丰厚且友好的交互

  • 供给丰厚的交互,如 select 挑选、filter 挑选、协助提示等,让人操作更快捷

前端亮点 or 提效?从开发一款 Node CLI 开始!

  • 供给富有色彩的体会,让人心旷身体

    前端亮点 or 提效?从开发一款 Node CLI 开始!

  • 供给多样的 loading,让人削减等待烦恼

五、Node CLI 生态库(具体用法)

5.1、注册解析指令 commander

描绘:commander 供给了完好的 Node 指令行解决计划,能够更快捷的进行指令注册及解析

demo 版别:9.4.1

demo 01:注册主指令 及 相关选项

#!/usr/bin/env node
const { Command } = require('commander')
const pkginfo = require('pkginfo')
const program = new Command()
program.version(pkginfo.version, '-v, --version', '@calmer/terminal-cli 当时版别')
// ⭐ 注册主指令相关选项
program
  // .description('指令描绘') // 指令描绘
  .option('-d, --dir <dirname>', '带参选项描绘', '选项默许值') // 带参选项(选项全称 取值时转成驼峰写法),支撑设置默许值
  .option('-c, --copy', '布尔选项描绘') // 布尔选项(区别于 选项全称后有没有 <xxx>),指令中-c,选项copy特色值为true
  .option('-rm, --remove <dirname...>', '带参选项描绘') // 数组参数必填,指令中多个参数空格切割,不支撑设置默许值
  .option('-i, --ip [dirname...]', '带参选项描绘') // 数组参数,非必填(不填值为true),指令中多个参数空格切割,不支撑设置默许值
  .action(async (options: object) => {
    console.log('action', options) // option.dir   option.copy
  })
// 解析用户履行指令传入的参数
program.parse(process.argv)
/*
    指令行输入option办法
    serve -d 80
    serve -d80
    serve --dir 80
    serve --dir=80
*/
// 扩展:如下获取选项目标
program.opts(); 

demo 02:注册子指令、参数、选项

program
  .command('gen')
  .description('子指令描绘') // 指令描绘
  .option('-e, --ele <ddd>', '布尔选项描绘') // 选项不能和主指令选项重名,否则为空
  .argument('<argument1Name>', '参数1描绘') // 参数,必填
  .argument('<argument2Name>', '参数2描绘') // 参数,必填
  /*
        argument 与 option 共存时:参数1为argument,参数2为option;否则参数1是argument或option
        添加多个argument时,依次为action的参数1、参数2、参数3
    */
  .action(async (argument1Name: string, argument2Name: string, options: object) => {
    console.log('action', argument1Name, argument2Name, options)
  })

demo 03:指令钩子(主指令、子指令)

program
  .option('-t, --trace', 'display trace statements for commands')
  /*
        钩子
            preAction   action函数履行前(主+子指令)(thisCommand, actionCommand)
            postAction  action函数履行后(主+子指令)(thisCommand, actionCommand)
            preSubcommand   action指令解析前(子指令)(thisCommand, subcommand)
        参数
            thisCommand主指令,subCommand子指令、actionCommand 触发action的指令,目标API如下
                name()  指令名
                opts()  选项目标
                args    参数、选项的调集,按指令写入次序以数组办法输出
    */
  .hook(
    'preSubcommand',
    (
      thisCommand: { opts: Function; name: Function },
      actionCommand: { name: Function; opts: Function; args: string[] }
    ) => {
      // 找选项
      console.log('thisCommand', thisCommand.name())
      console.log('actionCommand', actionCommand.name())
    }
  )

demo 04:自界说监听事情(目前只确定 能够监听主指令 option)

program.on('option:dir', function (optionValue: any) {
  console.log('option:dir', optionValue)
})

5.2、交互式指令东西 inquirer

介绍:inquirer 是一个 指令行交互东西,供给多种表单选项,优化指令行交互

demo 版别:8.2.5

demo 01: 中心运用流程

  • validatefilter 函数:回来 true 代表校验经过,回来具体内容作为过错输出 间断程序
import inquirer from 'inquirer';
/*
        type 	表单类型
  name	答案变量
  message	提示信息
  default	默许值
*/
inquirer.prompt({
  type: 'input' // 交互组件类型
  name: 'name' // 数据特色称号
  message: '用户名' // 交互提示
  default: '' // 默许值
  choices: '' // 当交互类型为`挑选类型`时, 该特色装备可选项目
  // 校验函数, 函数以当时答复为参数。 回来: true 经过 false 不经过,无提示 Error 不经过,显现过错信息
  validate(value){
    return !value.length ? new Error('项目称号不能为空') : true
  }
  // 过滤器, 回来修改后的答复。优先级高于 `validte`
  filter(value){
     return /vue/.test(value) ? `${value}-demo` : value
  }
  // 转换器, 回来转换后的值,只作为显现,不影响搜集成果
  transformer(value){
     return /vue/.test(value) ? `${value}-demo` : value
  },
  // 是否显现问题
  when(answers){
     return !!answers.company
  },
  // message 前缀
  prefix: '',
  // message 后缀
  suffix: '',
  // 如果答复已存在, 是否依然提问
  askAnswered: false,
}).then((answers) => {
        // answers.project
}).catch((error) => {
  console.error('出错啦!', error);
});
// 运用办法二
(async () => {
  const { project } = await inquirer.prompt({
    type: 'input',
    name: 'project',
    message: '项目称号',
    default: 'copyLeft',
  });
  console.log(project);
});

demo 02when 提示列表中,决定是否下一步

inquirer.prompt([{
    type: "confirm",
    message: "是否发送 Kim 告诉?",
    name: "confirm",
}, {
    type: "checkbox",
    message: "挑选更新类型(可多选):",
    name: "updateTypes",
    when: function (answers) { // 当confirm为true的时分才会提问当时问题
        return answers.confirm
    },
    choices: [
        "feat(新功用)",
        "fix(修补bug)",
        "docs(更新文档)",
        "style(代码格局优化:不影响代码运转的改变,留意这儿指的不是css style)",
        "refactor(重构:即不是新增功用,也不是修改bug的代码改变)",
        "chore(构建优化,东西优化等)",
        "test(添加测验用例,测验代码等)",
        "revert(回滚提交)"
    ],
    validate: (answer) => {
        if (!answer.length) {
            return '请挑选更新类型';
        }
        return true;
    },
}]);

demo 03:input 输入框

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'input',
  name: 'name',
  message: '请输入',
  default: '默许输入的内容'
})

demo 04:input 数值输入框

  • 特征:输入非数值不收效

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'number',
  name: 'age',
  message: '请输入',
  default: 111
})

demo 05:password 暗码输入框

  • 特征:输入的内容不在终端显现

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'password',
  name: 'password',
  message: '请输入',
  default: '暗码'
})

demo 06:list 单选

  • 特征:单选列表,没有序号,没有关键字查找

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'list',
  name: 'listAnswer',
  message: '单选',
  choices: [
    { name: '1', value: 1 },
    { name: '2', value: 2 },
    { name: '3', value: 3 }
  ]
})

demo 07:rawlist 列表

  • 特征:可输入答案的列表,有序号,没有关键字查找

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'rawlist',
  name: 'rawlistAnswer',
  message: '列表',
  choices: [
    { name: '1', value: 1 },
    { name: '2', value: 2 },
    { name: '3', value: 3 }
  ]
})
  • demo 08:checkbox 多选

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'checkbox',
  name: 'checkboxAnswer',
  message: '多选',
  choices: [
    { name: '1', value: 1 },
    { name: '2', value: 2 },
    { name: '3', value: 3 }
  ]
})

demo 09:confirm 判别

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt({
  type: 'confirm',
  name: 'confirmAnswer',
  message: '判别',
})

demo 10:插件机制、autocomplete 需求单独引进

  • 特征:支撑过滤可选项

前端亮点 or 提效?从开发一款 Node CLI 开始!

import inquirer from 'inquirer';
import inquirerPrompt from 'inquirer-autocomplete-prompt';
inquirer.registerPrompt('autocomplete', inquirerPrompt);
inquirer.prompt({
  // @ts-ignore
  type: 'autocomplete',
  name: 'component',
  message: '请挑选要开发的组件',
        source: (answersSoFar, input) => {
    return [1, 2].filter(val => val.includes(input))
  },
}).then((answers) => {
  console.log('inquirer-answers', answers);
})

demo 11: Separator 切割线

  • 特征:可选列表之间插入切割线

前端亮点 or 提效?从开发一款 Node CLI 开始!

inquirer.prompt([
  {
    type: 'checkbox',
    name: '多选',
    message: 'checkbox',
    choices: [ "Choice A", new inquirer.Separator(), "choice B" ]
  }
])

5.3、指令行提示图标 Ora

场景:指令行提示图标或小动画

demo 版别:0.6.0

前端亮点 or 提效?从开发一款 Node CLI 开始!

import ora from 'ora';
const spinner = ora({
  text: "链接网络中"
}).start(); // 开端状况 => 加载状况
setTimeout(() => {
  spinner.color = "yellow";
  spinner.text = "网速有点慢";
}, 1000); // 仍是 加载状况, 更新案牍和色彩
setTimeout(() => {
  spinner.succeed("下载成功"); // 加载状况 => 成功状况
}, 2000);
import ora from 'ora'
const spinerList = [ // 挑了几个愈加图形化的形式
    'timeTravel',
    'speaker',
    'soccerHeader',
    'fistBump',
    'weather',
    'moon',
    'earth',
    'smiley'
]
let index = 0
const spinner = ora({
    prefixText: 'spinnerName:‘timeTravel’',
    spinner: 'timeTravel'
}).start()
setInterval(function () {
    spinner.prefixText = `spinnerName: timeTravel`
    spinner.spinner = spinerList[index]
    index = ++index % spinerList.length;
}, 1500)

cli-spinners 是 ora 的中心库: 如果场景不杂乱,能够运用它。

const Spinner = require('cli-spinner').Spinner;
const spinner = new Spinner('loading.. %s');
spinner.setSpinnerString('|/-\');
spinner.start()
setTimeout(() => {
    spinner.stop()
}, 3000);

5.4、指令行字符色彩 chalk

  • 场景:终端打印输出各种样式的字符(色彩、背景色、下划线等)

前端亮点 or 提效?从开发一款 Node CLI 开始!

import chalk from 'chalk';
console.log(chalk.blue('Hello world!'));
console.log(chalk.blue.bgRed.bold('Hello world!'));

5.5、指令行进度条 progress

场景:终端展现进度条

var ProgressBar = require('progress');
var bar = new ProgressBar(':bar', { total: 10 });
var timer = setInterval(function () {
  bar.tick();
  if (bar.complete) {
    console.log('\ncomplete\n');
    clearInterval(timer);
  }
}, 100);

5.6、指令行可视化组件 blessed-contrib

场景如下图

前端亮点 or 提效?从开发一款 Node CLI 开始!

5.7、终端耐久化存储 configstore、conf

场景:需求为 CLI 运用程序供给存储耐久性,多次调用CLI指令时,记载用户之前挑选,提高用户体会

configstore 库

import Configstore from 'configstore';
const config = new Configstore('name', {foo: 'bar'});
console.log(config.get('foo'));
//=> 'bar'
config.set('awesome', true);
console.log(config.get('awesome'));
//=> true
// Use dot-notation to access nested properties.
config.set('bar.baz', true);
console.log(config.get('bar'));
//=> {baz: true}
config.delete('awesome');
console.log(config.get('awesome'));
//=> undefined

conf 库

const Conf = require('conf');
const config = new Conf();
config.set('unicorn', '');
console.log(config.get('unicorn'));
//=> ''
// Use dot-notation to access nested properties
config.set('foo.bar', true);
console.log(config.get('foo'));
//=> {bar: true}
config.delete('unicorn');
console.log(config.get('unicorn'));
//=> undefined

5.8、JS 中履行 Shell 脚本

计划一:Node 子进程 child_process

Node 子进程 require('child_process') 有 7个函数 能够履行 shell 句子、文件:

4个异步函数: spawnforkexecexecFile

3个同步函数spawnSyncexecSyncexecFileSync

spawn是最基本的创立子进程函数,其他办法都是对此的封装

  • spawn:经过监听子进程目标的 stdoutstderr,实时接收 指令履行输出、异常
#!/usr/bin/env node
import {
    spawn
} from 'child_process';
const child = spawn('npm', ['install']);
child.stdout.on('data', function (data) {
    console.log(data);
});
child.stderr.on('data', function (data) {
    console.log('Error:', data);
});
  • execspawn 的差异点,如下
    • 指令描绘简略:更挨近 shell 指令,spawn 以数组参数描绘,不便利编写
    • exec方方多一个回调函数,能够统一输出 子进程履行指令的数据
    • 统一输出的子进程数据量约束:默许200kb,超出会报错间断程序,默许值能够调大,但总是有危险
#!/usr/bin/env node
import {
    exec
} from 'child_process';
const child = exec('npm install', function (err, stdout, stderr) {
    if (err) throw err;
    console.log(stdout);
});
child.stdout.on('data', function (data) {
    console.log(data);
});
child.stderr.on('data', function (data) {
    console.log('Error:', data);
});
  • execFileexec 特性共同,用于履行脚本文件
  • fork:与 spawn 的差异点是,父子进程能够主动通讯(EventEmitter 模块接口实现的)
// parent.js
const {fork} = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
    console.log('messsgae from child', msg);
});
forked.send({hello: 'world'});
// child.js
process.on('message', (msg) => {
    console.log('message from parent:', msg);
});
let conter = 0;
setInterval(() => {
    process.send({counter: counter++});
}, 1000);

计划二:东西库 shell.js

shell.js 模块重新包装了 child_process,调用体系指令愈加便利,对Node版别要求不高

const shell = require('shelljs');
// 判别是否有相关开发环境
function hasGitNpm() {
  if (!shell.which('git')) {
    console.log('Sorry, this script requires git');
    shell.exit(1);
  }
  if (!shell.which('npm')) {
    console.log('Sorry, this script requires npm');
    shell.exit(1);
  }
}
hasGitNpm();
// 装置 npm 包
function installPkg(pkg, type) {
  const npm = shell.which('npm');
  if (!npm) {
    console.log('请先装置 npm');
    return;
  }
  const { code } = shell.exec(
    `${npm.stdout} install ${pkg} ${type || '--save'}`
  );
  if (code) {
    console.log(`装置 ${pkg} 失利,请手动装置`);
  }
}

计划三:东西库 zx

zx 根据child_process,调用体系指令,更挨近于写 shell 句子,对Node环境要求 >= 16.0.0

特色:

  • 语法更挨近 shell 句子
  • 支撑 ts,主动编译.ts为.mjs文件,.mjs文件是ESM 文件,直接运用 import,不用东西搬运
  • 自带fetch库,能够进行网络恳求
  • 自带chalk库,能够打印有色彩的字体
  • 自带过错处理nothrow办法,如果bash指令出错,能够包裹在这个办法里疏忽过错
  • 自带支撑管道操作pipe办法

示例:

履行指令 zx ./index.mjs 运转如下脚本

#!/usr/bin/env zx
await $`cat package.json | grep name`
let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`
await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])
let name = 'foo bar'
await $`mkdir /tmp/${name}`

六、npm script 高频操作

6.1、指令行传参

办法一: Node 文件中获取指令行参数,借助 cross-env

  • 传参
{
    "scripts": {
        "test": "cross-env NODE_ENV=production node ./src/index.js"
    }
}
  • 获取:./src/index.js 文件中获取如下
console.log(process.env.NODE_ENV)

办法二: Shell 文件中获取指令行参数,借助 cross-env-shell

  • 传参
{
    "scripts": {
        "test": "cross-env-shell GREETING=Hi sh ./src/index.sh"
    }
}
  • 获取:./src/index.sh 文件中获取如下
echo $GREETING

办法三: Node 文件中获取指令行参数,借助进程参数 process.argv

  • 传参
{
    "scripts": {
        "test": "node ./src/index.js -build --show"
     }
}
  • 获取:./src/index.js 文件中获取如下
#!/usr/bin/env node
import minimist from 'minimist';
// 办法1
console.log('hello ', process.argv.splice(2)); // ['-build', '--show']
// 办法2
const isShow = require('minimist')(process.argv.slice(2)).show;

6.2、自界说指令

界说指令: 在 package.json 文件的 scripts 字段中声明,指令值为 Shell语法

{
  "scripts": {
    "dev": "npm run start"
  }
}

履行指令:项目根目录履行 npm run xxx

履行原理:履行指令时,会主动创立一个临时 Shell 脚本,履行指令

符号 解说
* 表明恣意脚本名,避免被转译,需求 *
** 表明恣意层目录
& 衔接指令,并行履行
&& 衔接指令,串行履行
{
    "scripts": {
        "lint": "jshint **/*.js",
        "test": "tap test/*.js",
        "build1": " npm run script1.js & npm run script2.js"
        "build2": " npm run script1.js && npm run script2.js"
    }
}

6.3、自界说指令钩子

  • npm 供给了 prepost 两个钩子,别离代表前置钩子、后置钩子
  • 自界说指令也能够添加 前置、后置钩子
{
    "scripts": {
        "lint": "jshint **/*.js",
        "test": "tap test/*.js",
        "build": " npm run script1.js & npm run script2.js"
        "prebuild": " npm run script1.js && npm run script2.js"
    }
}
  • 履行 npm run build 时,相当于依次履行如下
npm run prebuild
npm run build 
npm run postbuild

6.4、获取 script 指令名

const TARGET = process.env.npm_lifecycle_event;
if (TARGET === 'test') {
  console.log(`正在履行 npm run test`);
}

七、Node 东西库清单

整理了一份尽量全的 Node东西库清单,期望日后能协助到你在开发中提效哦~ 【彩蛋 ①】

分5类(指令行交互、文件处理、数据处理、邮件处理、网络布置)展现 190+ Node 东西库!

7.1、指令行交互

场景
Commander.js 完好的 node.js 指令行解决计划
Inquirer.js 一组通用的交互式指令行用户界面
cross-spawn 兼容 node 子进程 spawn 跨渠道
semver 依据 Semver 语义标准,比照 获取版别号
pkginfo 获取 package.json 内容
yargs 更简易的处理指令行参数小东西,比 commander.js 优异的是参数不全会主动给出提示
ora 在指令行显现 loading 等动画
minimist 简略的参数处理包,对process.argv.slice(2) 数组进行 key-value 处理
figlet 输出终端图画 FIGlet 初识
TheaterJS 模仿人打字效果的 JS 库
screenfull.js 全屏滚动插件
image-compress-without-backend 浏览器端图片压缩东西 无后端
zooming 前端 zoom 放大、缩小镜功用
html5tooltipsjs 鼠标移入后呈现 tooltip 提示框
ua-parser-js 获取浏览器信息
open 主动翻开浏览器页面
Alertify.js 开发美丽的浏览器对话框和告诉,可替代浏览器默许对话框
browser-sync 取代 LiveReload 为新型浏览器主动改写插件,提高多浏览器开发功率
node-inspector 在浏览器中调试 node 参阅
envinfo 生成故障扫除软件问题(如操作体系、二进制版别、浏览器、已装置言语等)时所需的通用具体信息的陈述
bcat 将指令管道输出到 Web 浏览器
browser-run 在浏览器环境中轻松运转代码
log-symbols 用不同色彩的符号记载不同级别的日志
figures 支援 Windows CMD 回退计划的 Unicode 符号
boxen 在终端中创立方框
terminal-link 在终端中创立可点击的链接
terminal-image 在终端里展现图片
string-width 获取字符串的可视宽度,显现字符串所需的列数
cli-truncate 在终端中将字符串截断为特定宽度
first-run 查看是否是第一次运转该进程
blessed 相似于 Curses 的库
Inquirer.js 交互式的指令行提示东西
yn 将包含 yes/no 语义的字符串解析为布尔值
cli-table3 美丽的 Unicode 表
drawille 运用 Unicode 盲文字符在终端上绘图
update-notifier 晋级 CLI 运用程序的告诉
ascii-charts 终端下的 ASCII 柱状图
progress 灵敏的 ASCII 进度条
insight 运用 metrics 向 Google Analytics 发送匿名陈述来协助你理解你的东西是怎样被运用的
cli-cursor 显现或封闭 CLI 光标
columnify 将操控台文本打印按列输出,支撑单元格修饰
cli-columns 列式输出 Unicode 和 Ansi-safe
cfonts 操控台下的性感 ASCII 字体
multispinner 多样的、可一起独立操控的 CLI 旋转指示器
omelette Shell 下的主动补全
cross-env 跨渠道的环境变量设置
shelljs 可移植的 Unix shell 指令
sudo-block 制止用户用 root 权限运用你的程序
loud-rejection 强制对未加处理的 promise rejections 过错给出提示
sparkly 生成迷你图 ▁▂▃▅▂▇
Bit 在存储库中创立、保护、查找和运用小型模块和组件
gradient-string 为终端输出添加美丽的色彩渐变
oclif CLI 结构,包含解析器、主动文档、测验和插件
term-size 精确地取得终端窗口巨细
Cliffy CLI 的交互式结构
np 更好的 npm publish
npm-name 查看包名在 npm 上是否可用
gh-home 翻开当时目录下项目的 GitHub 主页
npm-home 翻开一个包的 npm 主页
emoj 指令行下从文本中查找相关的 emoji
pageres 获取网站的截图
vtop 有美丽图表的更好用的 top
clipboard-cli 在终端里仿制粘贴
dev-time 获取 GitHub 用户当时的本地时间
David 当 npm 软件包中的依靠过时告诉你
normit 在您的终端中运用语音组成功用进行 Google 翻译
fkill 跨渠道的进程强杀指令
pjs 用 JavaScript 实现的快速过滤、映射和累加器的管道指令
license-checker 对你运用中的依靠进行许可证查看
tmpin 对所有允许文件输入的 CLI 程序添加 stdin 支撑
wallpaper 替换桌面壁纸
brightness 更改屏幕亮度
alex 捕捉写作中呈现的不当表达
subdownloader 电影和电视剧的字幕下载器
dark-mode 开关 macOS 暗黑形式
Jsome 运用自界说色彩和缩进打印美丽的 JSON
itunes-remote 交互式操控 iTunes
mobicon 移动端运用图标生成器
mobisplash 移动端运用发动页生成器
diff2html-cli 生成美丽的 HTML 展现 git diff 指令的成果
Cash 用纯 JavaScript 编写的跨渠道类 Unix Shell
trymodule 在终端中运用 npm 软件包
jscpd 源代码重复代码检测
atmo 模仿服务器端 API
auto-install 编写代码时主动装置依靠
cost-of-modules 查找使性能降低的依靠
localtunnel 向公网开放你的 localhost
svg-term-cli 根据 SVG 分享终端会话
gtop 终端下的体系监控仪表板
themer 为您的编辑器、终端、壁纸、Slack 等生成主题
carbon-now-cli 为你的代码生成精巧的图片
taskbook 指令行环境下的任务、板块和笔记管理器

7.2、文件处理

场景
glob 很快捷的获取文件(循环 + 正则)
fs-extra 读 fs 模块的增强版,兼容 fs
chokidar 监听文件改变,代替 fs.watch 高性能
dotenv 能够将.env 文件内包含的变量,主动注入到 process.env 中
onchange 监听文件改变并主动运转 npm script
cpx2 监听文件改变,主动拷贝
readable-stream stream 处理库
temp 临时文件操作库
mkdirp 新建文件夹,省去 新建、进入、新建 等繁琐过程
ejsExcel 是一个 Excel 模版引擎,能够在格局杂乱的 excel 中填入信息
markdown 把 markdown 字符转为 html 字符
markdown-it 新型 Markdown 解析器,快速,支撑插件
trash rm 更安全的挑选」
cpy 仿制文件
empty-trash 清空文件夹
npkill 轻松查找和删去过时且臃肿的 node_modules 文件夹
pen 用你喜爱的编辑器编写 Markdown,在浏览器中供给实时预览
lessmd 终端环境下的 Markdown 预览器
cpy 文件拷贝
rimraf 像 rm -rf 相同的递归删去
make-dir 像 mkdir -p 相同的递归创立目录
graceful-fs 功用增强版的 fs 模块
chokidar 像 macOS 上运用原生 fsevents 相同监听 fs.watch 和 fs.watchFile 的文件体系监听器
find-up 沿父目录向上查找文件
proper-lockfile 进程间和机器间 lockfile 东西
load-json-file 读取、解析 JSON 文件
write-json-file 主动将 JSON 序列化写入到文件
fs-write-stream-atomic 相似 fs.createWriteStream() 的原子操作
filenamify 将字符串转换为有用的文件名
lnfs 像 ln -fs 相同,强制创立符号链接
istextorbinary 查看文件是文本仍是二进制
fs-jetpack 彻底重新规划的、便利日常运用的文件体系 API
fs-extra 添加额外办法的 fs 模块
pkg-dir 查找 npm 包的根目录
filehound 灵敏、流畅的用于文件体系查找的接口
move-file 甚至能够跨设备运用的移动文件东西
tempy 随机获取临时文件或目录的途径

7.3、数据处理

场景
nanoid 生成唯一的字符串 ID
pinyin 前端/nodejs 汉字转拼音
lunr.js 全文查找引擎,能够为 JSON 创立索引 并 检索
crypto-js crypto-js 是一个强壮的加密库,支撑大量加密算法
decimal.js 是一个科学计算库,能够进行恣意精度的十进制运算
validator 验证库
jsonwebtoken 生成与解析 token 参阅
json5 JSON5 是对 JSON 的扩展,JSON 格局愈加宽泛 参阅
jsondiffpatch 比照 JSON,生成 diff、patch 信息 参阅
joi JavaScript 最强壮的形式描绘言语和数据验证器
ajv JSON Schema 验证东西,最快的 JSON 概要验证器,支撑 v5、v6 和v7 计划
superstruct json/js 目标 验证 validate 库
yaml-front-matter 解析 yaml 或 json
hash-sum 非常快的唯一哈希生成器
deepmerge 深度合并两个或多个目标的可枚举特色。
leven 测量两字符串之间的差异最快的 JS 实现之一
lru cache 删去最近最少运用的项的缓存目标
strip-ansi 从字符串中去掉 ANSI 转义码
is-my-json-valid 极速 JSON 格局校验东西
property-validator 用于 Express 的特色校验东西
schema-inspector JSON API 整理和验证
Superstruct 简略基础的 JavaScript 和 TypeScript 数据验证器

7.4、邮件处理

场景
nodemailer 处理电子邮件的最快办法
emailjs 向任何 SMTP 服务器发送带有附件的文本 / HTML 电子邮件
email-templates 创立、预览和发送自界说电子邮件
MJML 旨在削减创立响应式电子邮件困难的一种符号言语

7.5、网络布置

场景
nodemon 支撑热加载和主动重启,能够检测代码文件改变,并实时重启程序,适合开发阶段运用!
pm2 支撑热发动、负载、集群、监控、重启等功用,一旦 node.js 程序崩溃,pm2 能够主动重启 Node.js 程序
http-server 零装备发动一个 HTTP 服务,访问 html 文件
json-server 发动服务 访问 json
http-proxy node http 署理库,运用起来较原生
http-proxy-middleware http 署理库,express 中间件
socket.io 用极端简略的语法,在服务端与客户端之间,树立可靠的 webSocket 长衔接通讯
oauth oauth 认证库
torrent 下载种子
iponmap IP 地址查找器
speed-test 测验你的互联网衔接速度和 ping 值
discharge 轻松将静态网站布置到 Amazon S3
wifi-password 获取当时 wifi 的暗码
download-git-repo 拉取 Git 代码
default-gateway 经过对 OS 路由接口的 exec 调用取得机器的默许网关
address 获取当时机器的 IP, MAC 和 DNS 服务器。
portfinder 主动寻觅 800065535内可用端口号
is-up 检测网站是否能够正常访问
is-online 检测网络衔接是否正常
public-ip 获取你的公网 IP 地址
got 为内置的 http 模块供给更好的接口
gh-got 为 got 和 GitHub API 交互供给更便利的封装
axios 根据 Promise 的 HTTP 客户端(也能够在浏览器中作业)
wreck HTTP 客户端东西.
download 使下载和提取文件变得轻松
http-proxy HTTP 署理
superagent HTTP 恳求库
node-fetch Node.js 的window.fetch
flashheart REST 客户端
http-fake-backend 运用 JSON 文件或许 JavaScript 目标 树立一个伪装的可自界说路由的后端服务
cacheable-request 运用契合 RFC 的缓存支撑封装原始的 HTTP 恳求.
gotql 根据 got 构建的 GraphQL 恳求库
global-agent 能够运用环境变量装备的全局 HTTP / HTTPS 署理
smoke 可记载的根据文件的模仿 HTTP 服务
http-server 简略、零装备的指令行 HTTP 服务器
Live Server 具有热重启功用的开发环境 HTTP 服务器

八、第②个彩蛋(第①个你找到了吗?)

感谢大家花时间阅览学习,献上 node-cli-template,欢迎 Star ✨