npm 工具包集合,方便大家工作和查找。
- Server Tools 服务相关工具
- File Tools 文件处理相关工具
- Command Line Tools 命令行相关工具
- Promise Tools Promise 相关工具
- Browser Tools 浏览器相关工具
- Counter Tools 计算相关
- Builder Tools 构建相关
- Javascript Tools Javascript 工具(仅限于语言,没有明确的使用场景)
-
portfinder 自由端口查找器。当你所编写的服务需要一个端口,并且,你不确定哪些端口可以使用时。这个包可以找到目前未被占用的端口。
const portfinder = require('portfinder'); portfinder.getPortPromise() .then((port) => // ... 可以使用的端口) .catch((e) => // ... 出问题了);
-
node-schedule NodeJS 定时任务工具。
const schedule = require('node-schedule'); const job = schedule.scheduleJob('42 * * * *', function(){ console.log('The answer to life, the universe, and everything!'); });
* * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) │ │ │ │ └───── month (1 - 12) │ │ │ └────────── day of month (1 - 31) │ │ └─────────────── hour (0 - 23) │ └──────────────────── minute (0 - 59) └───────────────────────── second (0 - 59, OPTIONAL)
-
uuid uuid 生成器
import { v4 as uuidv4 } from 'uuid'; uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
-
pm2 Node.js 应用程序的生产流程管理器,具有内置负载均衡器。它允许您使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务。
pm2 start app.js
-
minimatch 使用 glob 表达式的文件匹配工具。如果你想用 glob 表达式去匹配一下文件用它就 OK 了。
const minimatch = require('minimatch'); minimatch('bar.foo', '*.foo'); // true! minimatch('bar.foo', '*.bar'); // false! minimatch('bar.foo', '*.+(bar|foo)', { debug: true }); // true
-
glob 基于 minimatch 的 glob 表达式文件查找工具。
const glob = require('glob'); // options 是个可选项 glob('**/*.js', options, function (err, files) { // files 是一个文件数组 // err 是一个文件对象 })
-
commander 命令行参数解析工具。支持定义参数规则,还有中文文档
// index.js const { program } = require('commander'); program .option('--first') .option('-s, --separator <char>'); program.parse(); const options = program.opts(); const limit = options.first ? 1 : undefined;
# output $ node split.js -s / --fits a/b/c error: unknown option '--fits' (Did you mean --first?) $ node split.js -s / --first a/b/c [ 'a' ]
-
minimist 轻量级命令行参数解析器
const argv = require('minimist')(process.argv.slice(2)); console.log(argv);
$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz { _: [ 'foo', 'bar', 'baz' ], x: 3, y: 4, n: 5, a: true, b: true, c: true, beep: 'boop' }
-
prompts 命令行交互工具
const prompts = require('prompts'); (async () => { const response = await prompts({ type: 'number', name: 'value', message: 'How old are you?', validate: value => value < 18 ? `Nightclub is 18+ only` : true }); console.log(response); // => { value: 24 } })();
-
chalk 命令行输入彩色文本
import chalk from 'chalk'; console.log(chalk.blue('Hello world!'));
-
semver semver, 是一个语义化版本号管理的模块,可以实现版本号的解析和比较,规范版本号的格式。
const semver = require('semver') semver.valid('1.2.3') // '1.2.3' semver.valid('a.b.c') // null semver.clean(' =v1.2.3 ') // '1.2.3' semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true semver.gt('1.2.3', '9.8.7') // false semver.lt('1.2.3', '9.8.7') // true semver.minVersion('>=1.0.0') // '1.0.0' semver.valid(semver.coerce('v2')) // '2.0.0' semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
了解关于版本号的更多内容,可以点击这里
-
execa execa 是对 child_process 的封装,提供了更友好的方式操作子进程。
import {execa} from 'execa'; const {stdout} = await execa('echo', ['unicorns']); console.log(stdout); //=> 'unicorns'
-
promise-limit 限制 Promise 的并发数量,一般在
Promise.all
发起大量 Promise 时使用.const promiseLimit = require('promise-limit'); const limit = promiseLimit(2); const jobs = ['a', 'b', 'c', 'd', 'e']; Promise.all(jobs.map((name) => { return limit(() => job(name)); })).then(results => { console.log(); console.log('results:', results); }) function job (name) { const text = `job ${name}`; console.log('started', text); return new Promise(function (resolve) { setTimeout(() => { console.log(' ', text, 'finished'); resolve(text); }, 100); }); }
# output started job a started job b job a finished job b finished started job c started job d job c finished job d finished started job e job e finished results: [ 'job a', 'job b', 'job c', 'job d', 'job e' ]
-
ua-parser-js
navigator.userAgent
解析器,能提供详细的数据:浏览器名称、系统名称、设备型号/类型等等。并且可以针对自定义的navigator.userAgent
进行扩展。import UAParser from 'ua-parser-js'; const uaInfo = UAParser; // { ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }
-
web-vitals 用于测量真实用户测的性能指标:CLS、FID、LCP、FCP 和 TTFB。
import {getLCP, getFID, getCLS} from 'web-vitals'; getCLS(console.log); getFID(console.log); getLCP(console.log);
-
bytes 将字符串解析为字节,或者字节解析为字符串。
const bytes = require('bytes'); bytes(1024); // output: '1KB' bytes('1KB'); // output: 1024
bytes 的参数如果是数字,就会返回字符串的单位格式。如果是字符串,就会返回数字格式的字节数。如果我们希望不管是数字还是字符串,都返回字节数。那么可以用
bytes.parse()
。如果你为了方便,也可以使用 humanize-bytes, 它只是对bytes()
做了一个小小的包装。 -
crypto-js js 加密算法标准库,几乎涵盖了工作用到的加密算法。支持 Nodejs 和 浏览器中运行。
import sha256 from 'crypto-js/sha256'; import hmacSHA512 from 'crypto-js/hmac-sha512'; import Base64 from 'crypto-js/enc-base64'; const message, nonce, path, privateKey; // ... const hashDigest = sha256(nonce + message); const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));
-
acorn 把 string javascript 代码解析成 AST 语法树。
let acorn = require("acorn"); console.log(acorn.parse("1 + 1", {ecmaVersion: 2020})); // output // { // "type": "Program", // "start": 0, // "end": 5, // "body": [ // { // "type": "ExpressionStatement", // "start": 0, // "end": 5, // "expression": { // "type": "BinaryExpression", // "start": 0, // "end": 5, // "left": { // "type": "Literal", // "start": 0, // "end": 1, // "value": 1, // "raw": "1" // }, // "operator": "+", // "right": { // "type": "Literal", // "start": 4, // "end": 5, // "value": 1, // "raw": "1" // } // } // } // ], // "sourceType": "module" //}
rollup 和 webpack 内部都在使用
acorn
做 AST 语法树的解析。同样类似功能的还有:recast,它提供了多种解释器,非常的强大。 当然,你也可以选择我们最为熟悉的@babel/paser
,它最初也是对acorn
的一个 fork。 这里有一篇关于各种 js 解释器的介绍,可以了解一下:JavaScript 各种解析器的介绍;很多时候,我们的多数工作仅仅只是对源代码进行轻微的修改,recast 这样的库对我们来说完全没有必要。这里另外推荐一个。 magic-string: 它能让你操作代码字符串和生成源映射。
-
deepmerge js 对象深度合并。支持自定义合并策略。
const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } const output = { foo: { bar: 3, baz: 4 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }, { does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }], quux: 5 } merge(x, y) // => output