掌握这些npm包,开发命令行工具手到擒来!!!
前言
现在开发命令行工具基本上是每一个前端同学必会的技能,有些同学想自己开发一个命令行工具,但是却很苦恼不知道有哪些工具包可供选择,这篇文章为大家罗列了一些命令行工具可能会用到的包。
解析参数
commander
node.js命令行界面的完整解决方案。
Weekly Downloads: 11700w+
1.1e多次的下载量,很强大,每一个cli工具必不可少的,用法直接戳官网
minimist
轻量级命令行解析参数引擎
Weekly Downloads: 5690w+
// index.js
const argv = require('minimist')(process.argv.slice(2));
console.log('argv: ', argv);
// node index.js --name=sens
argv: { _: [], name: 'sens' }
执行命令
exec
Process execution for humans
(原文描述),这个包改进了child_process
的一些方法,具体可以看这里
Weekly Downloads: 6700w+
const execa = require('execa');
const run = (bin, args, opts ={}) => execa(bin, args, { stdio: 'inherit', ...opts });
run('yarn', ['add', 'lodash', '-D']);
cross-spawn
是NodeJS
的spawn
和spawnSync
的跨平台解决方案。
Weekly Downloads: 6600w+
const spawn = require('cross-spawn');
const child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
child_process
是NodeJs
自带模块,用来同步或者异步的创建子进程,在可以执行一些命令,更多用法请查看官网
const {exec} = require('child_process');
exec('yarn add dotenv -D', {cwd: process.cwd()}, (error, stdout, stderr) => {
console.log('stderr: ', stderr);
console.log('stdout: ', stdout);
console.log('error: ', error);
})
shelljs
用js
执行shell
命令,shelljs
提供了很多像Unix
的shell
命令,比如echo
、which
、exec
、rm
、cp
等,详细信息查看官网
Weekly Downloads: 780w+
const shell = require('shelljs');
shell.echo('hello sens');
console.log(shell.which('yarn').stdout);
shell.exec('yarn add lodash -D');
彩色文字
chalk
Terminal string styling done right(原文解释)。
Chalk 5 是ESM规范,如果你想用Commonjs规范,可以降到Chalk 4
Weekly Downloads: 24500w+
const chalk=require('chalk');
console.log(chalk.blue('Hello world!'));
kolorist
比chalk更轻量
Weekly Downloads: 34w+
const {red} = require('kolorist');
console.log(red('something failed'))
命令行交互
inquirer
一组常见的交互式命令行用户界面。
Weekly Downloads: 2770w+
prompts
轻便、美观、用户友好的交互式提示。
Weekly Downloads: 2111W+
dotenv
将项目的.env
环境变量设置到process.env
里面,详细文档请看官网。
Weekly Downloads: 3290W+
// .env
NAME=sens
HELLO=hello
// index.js
require('dotenv').config();
console.log('process.env.HELLO', process.env.HELLO); // hello
console.log('process.env.NAME', process.env.NAME); // sens
dotenv-expand
基于dotenv
之上,增加变量扩展,,详细文档请看官网
Weekly Downloads: 1150W+
// .env
NAME=sens
HELLO=${NAME}
// index.js
const dotenvExpand = require('dotenv-expand')
const env = require('dotenv').config();
dotenvExpand.expand(env)
console.log('process.env.NAME', process.env.NAME); // sens
console.log('process.env.HELLO', process.env.HELLO); // sens
read-pkg
在( node
环境)ES module
下获取 packjson
文件内容,提供更友好的错误提示和规范化 packjson
数据。
Weekly Downloads: 3890W+
import {readPackage} from 'read-pkg';
const getPkg = async () => {
console.log(await readPackage());
}
getPkg();
open
可以跨平台的打开URL、文件、可执行文件等内容。
Weekly Downloads: 3029W+
使用场景:启动服务器之后,帮用户打开对应的网页。
portfinder
获取本机可用的端口号,详细文档请看官网
Weekly Downloads: 904W+
const portfinder = require('portfinder');
portfinder.basePort = 8080;
portfinder.getPortPromise()
.then(port => {
// 如果8080端口被占用,会自动检测 basePort + 1的端口号
// 重复上述步骤,直到返回可用的端口号
})
使用场景:在开发cli工具的时候,启动了一个端口,假如端口被占用,可以自动的+1,再次启动服务器。
ora
可以在终端实现loading效果。
Weekly Downloads: 1750W+
import ora from 'ora';
const spinner = ora('Loading unicorns').start();
setTimeout(() => {
spinner.color = 'yellow';
spinner.text = 'Loading rainbows';
}, 1000);
figlet
在 JavaScript
中贯彻 FIGFont
规范。可以在浏览器和 Node.js
中使用。比如可以在终端输出符合规范的文字
Weekly Downloads: 69W+
const figlet = require('figlet');
const {green} = require('kolorist');
function logo() {
console.log(green(figlet.textSync('hello', {
horizontalLayout: 'full',
})))
console.log();
}
logo();
使用场景:创建完项目之后可以将自己cli的名字输出到终端(命令行输入yarn create doves
即可体验)。
npm-run-all
并行或顺序运行多个 npm 脚本的 CLI 工具,特点是跨平台,兼容性好;简化命令。
Weekly Downloads: 317W+
npm run clean && npm run build:css && npm run build:js && npm run build:html
// 使用npm-run-all
npm-run-all clean build:*
总结
可以看到,chalk
全场最佳,weekly downloads
达到了惊人的2.45亿,其次就是commander
,1.17亿。另外平时开发的时候,我们可以优先选择下载量多的,迭代速度快的npm包,这样才能保证项目的稳定性。
转载自:https://juejin.cn/post/7210005376654082109