作业中还在为如何提效,如何做出作业亮点忧愁吗?仔细发现痛点 + 开发一款 Node Cli 或许是你的挑选,本文将手把手带你完结 Node CLI 中心开发,而且深化运用 Node CLI 生态库(含细节代码示例),文末预备了 190+ 个Node东西包福利~
一、什么是 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.1 、rc.2
|
4.3、供给丰厚且友好的交互
- 供给丰厚的交互,如 select 挑选、filter 挑选、协助提示等,让人操作更快捷
-
供给富有色彩的体会,让人心旷身体
-
供给多样的 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: 中心运用流程
-
validate
、filter
函数:回来 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 02:when
提示列表中,决定是否下一步
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 输入框
inquirer.prompt({
type: 'input',
name: 'name',
message: '请输入',
default: '默许输入的内容'
})
demo 04:input 数值输入框
- 特征:输入非数值不收效
inquirer.prompt({
type: 'number',
name: 'age',
message: '请输入',
default: 111
})
demo 05:password 暗码输入框
- 特征:输入的内容不在终端显现
inquirer.prompt({
type: 'password',
name: 'password',
message: '请输入',
default: '暗码'
})
demo 06:list 单选
- 特征:单选列表,没有序号,没有关键字查找
inquirer.prompt({
type: 'list',
name: 'listAnswer',
message: '单选',
choices: [
{ name: '1', value: 1 },
{ name: '2', value: 2 },
{ name: '3', value: 3 }
]
})
demo 07:rawlist 列表
- 特征:可输入答案的列表,有序号,没有关键字查找
inquirer.prompt({
type: 'rawlist',
name: 'rawlistAnswer',
message: '列表',
choices: [
{ name: '1', value: 1 },
{ name: '2', value: 2 },
{ name: '3', value: 3 }
]
})
- demo 08:checkbox 多选
inquirer.prompt({
type: 'checkbox',
name: 'checkboxAnswer',
message: '多选',
choices: [
{ name: '1', value: 1 },
{ name: '2', value: 2 },
{ name: '3', value: 3 }
]
})
demo 09:confirm 判别
inquirer.prompt({
type: 'confirm',
name: 'confirmAnswer',
message: '判别',
})
demo 10:插件机制、autocomplete 需求单独引进
- 特征:支撑过滤可选项
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 切割线
- 特征:可选列表之间插入切割线
inquirer.prompt([
{
type: 'checkbox',
name: '多选',
message: 'checkbox',
choices: [ "Choice A", new inquirer.Separator(), "choice B" ]
}
])
5.3、指令行提示图标 Ora
场景:指令行提示图标或小动画
demo 版别:0.6.0
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
- 场景:终端打印输出各种样式的字符(色彩、背景色、下划线等)
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
场景如下图
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个异步函数: spawn
、fork
、exec
、execFile
3个同步函数:spawnSync
、execSync
、execFileSync
spawn
是最基本的创立子进程函数,其他办法都是对此的封装
-
spawn
:经过监听子进程目标的stdout
、stderr
,实时接收 指令履行输出、异常
#!/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);
});
-
exec
与spawn
的差异点,如下- 指令描绘简略:更挨近 shell 指令,
spawn
以数组参数描绘,不便利编写 -
exec
方方多一个回调函数,能够统一输出 子进程履行指令的数据 - 统一输出的子进程数据量约束:默许200kb,超出会报错间断程序,默许值能够调大,但总是有危险
- 指令描绘简略:更挨近 shell 指令,
#!/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);
});
-
execFile
与exec
特性共同,用于履行脚本文件 -
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 供给了
pre
和post
两个钩子,别离代表前置钩子、后置钩子 - 自界说指令也能够添加 前置、后置钩子
{
"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 | 主动寻觅 8000 至65535 内可用端口号 |
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 ✨