常用node库
npm-run-all(脚本运行工具)
这个工具是为了解决官方的 npm run 命令无法同时运行多个脚本的问题,它可以把诸如 npm run clean && npm run build:css && npm run build:js && npm run build:html 的一长串的命令通过 glob 语法简化成 npm-run-all clean build:* 这样精致小巧的模样。 再者大家也知道 shell 的 & 语法实际上是不支持 cmd 的,为了跨平台也最好使用这样的第三方库来提供支持。 preact 中就是用来对数量繁多的子模块进行并行构建和顺序测试。
npm install npm-run-all --save-dev
这个包提供三个命令,分别是 npm-run-all run-s run-p,其中后两个都是 npm-run-all 带参数的简写,分别对应串行和并行。
顺序执行:npm-run-all clean lint build 并行执行:npm-run-all --parallel lint build 也可以混合执行,如:npm-run-all a b --parallel c d --sequential e f --parallel g h i
--parallel: 并行运行多个命令,例如:npm-run-all --parallel lint build
--serial: 多个命令按排列顺序执行,例如:npm-run-all --serial clean lint build:**
--continue-on-error: 是否忽略错误,添加此参数 npm-run-all 会自动退出出错的命令,继续运行正常的
--race: 添加此参数之后,只要有一个命令运行出错,那么 npm-run-all 就会结束掉全部的命令
run-s:为 npm-run-all --serial的缩写;
run-p:为 npm-run-all --parallel的缩写
cross-env(配置环境变量-解决不同系统之前的命令兼容问题)
cross-env 是一个 Node.js 模块,用于在不同的环境中管理运行时变量。 例如,通过 cross-env,你可以在生产环境中设置不同的环境变量,而在开发环境中设置不同的环境变量。 使用 cross-env,你可以在代码中方便地设置环境变量,而不需要手动在命令行中设置它们。
{
"scripts": {
"dev": "cross-env NODE_ENV=development webpack --progress --colors",
"build": "cross-env NODE_ENV=production webpack"
}
}
将process.env.NODE_ENV全局化
如果在业务代码中,需要根据开发环境,动态改变数据请求地址,会更加自动化,所以不仅仅在打包配置中我们需要使用 process.env.NODE_ENV,在其他模块中,仍要使用它,则需要将其全局化。
在webpack.config.js中,全局化process.env.NODE_ENV
const webpack = require('webpack');
module.exports = {
configureWebpack: {
plugins: [
new webpack.DefinePlugin({
"process.argv": JSON.stringify(process.argv)
})
]
}
}
打包时内存溢出解决方案
在依赖 package.json 中修改 build 为:
{
"dev": "node build/dev-server.js",
"build:prod": "cross-env NODE_ENV=production node --max_old_space_size=6144 build/build.js",
"build:sit": "cross-env NODE_ENV=sit node build/build.js",
"build:sit-preview": "cross-env NODE_ENV=sit npm_config_preview=true npm_config_report=true node build/build.js"
}
dotenv(配置文件)
dotenv是一个零依赖模块,它将环境变量从 .env 文件加载到 process.env 中。 dotenv提供许多的方法,最常用的是dotenv.config()。 dotenv.config()读取一个.env文件,解析其内容,将.env文件中声明的环境变量合并进process.env, 然后返回一个对象result。result.parsed是解析出的内容,result.error是在解析失败的时候返回的一个标识。 通常我们只需要进行dotenv.config() 操作,不需要关心result。
如何使用:
创建.env 文件
S3_BUCKET="YOURS3BUCKET"
SECRET_KEY="YOURSECRETKEYGOESHERE"
使用
import * as dotenv from 'dotenv'
dotenv.config()
console.log(process.env)
// 解析
const env = dotenv.parse(
fs.readFileSync(path.resolve(process.cwd(), "env.product"))
);
在根目录新增五个文件(根据自身情况增减) .env 和 .env.dev和 .env.pre和 .env.prod和 .env.sit和 .env.uat,分别为默认配置、本地开发配置、灰度配置、生产配置、测试配置1、测试配置2
您可以使用 --require ( -r ) 命令行选项来预加载 dotenv。通过这样做,您不需要在应用程序代码中要求和加载 dotenv。
node -r dotenv/config your_script.js
以下配置选项支持作为以下格式 dotenv_config_<option>=value
的命令行参数
node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true
dotenv-cli 实现使用环境变量步骤
https://blog.csdn.net/weixin_44058725/article/details/134051772?spm=1001.2014.3001.5502
npm install dotenv-cli --save-dev
新建 .env.xxx的环境文件 比如 .env.dev 开发环境的配置文件。 需要注意的是 只能以REACT_APP_ xxx命名才行,我试了一下,其他名称不起作用!
还需要注意的是 以key=value的形式。末尾后不可以加分号(加上后 值会在前后加上一个 / )。
提示
dotenv: 运行dotenv库的命令。
-e: 是dotenv的选项之一,表示使用一个特定的环境变量文件。
.env.dev是指定的环境变量文件名,这个命令会加载.env.dev文件中定义的环境变量。
node scripts/start.js :运行 start.js 。
dotenv-expand 扩展计算机上已经存在的环境变量
如果您发现自己需要扩展计算机上已经存在的环境变量,那么 dotenv-expand 就是您的工具。
minimist(命令行解析)
node.js的命令行参数解析工具有很多,比如:argparse、optimist、yars、commander。 optimist和yargs内部使用的解析引擎正是minimist,如果你喜欢轻量级的技术,那么minimist足够简单好用,代码量也很少(只有几百行),非常适合研读。
简单示例:
node minimist.js lushuixi 16 --template vue --name --age=16 -f --price 2.5120
更多参数示例: 参数--sex如果指定了(不管后面有没有值),会解析为true。 而参数--sanhaosheng未指定,被解析为了false。
node index.js --beep=boop -t -z 12 -n5 foo bar
Node.js 程序启动后可以直接从process.argv中读取到参数列表:
console.log(process.argv);
// ['/bin/node', '/tmp/index.js', '--beep=boop', '-t', '-z', '12', '-n5', 'foo', 'bar']
从上述代码中可以看到,process.argv 变量是一个数组,数组前两项分别是 node 程序位置和js脚本位置,数组中随后的元素都是我们启动Node.js后的参数,这些参数以空格分隔成数组。
虽然从 process.argv 中可以得到启动参数列表,但是我们仍需要对参数进行进一步解析处理才行
const argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
// { _: [ 'foo', 'bar' ], beep: 'boop', t: true, z: 12, n: 5 }
经过 minimist 解析的process.argv是一个对象,例如,我们可以直接从访问 argv.beep 得到 --beep=boop 参数的值。
listr2
listr2 是一个易于使用的 Node.js 包,可以用来创建生动的、可以交互的 CLI 界面、任务列表。类似的库还有consola。 我们可以利用这个库实现自己的 CLI 、管理任务、优化控制台显示等。
nodemon
"cross-env": "^7.0.3",
"nodemon": "^3.0.1",
packages/dev-server/nodemon.json
{
"watch": [
"src"
],
"ext": ".ts",
"exec": "ts-node -r tsconfig-paths/register ./src/main.ts"
}
"dev": "cross-env PORT=8681 nodemon",
pm2
packages/dev-server/pm2.json
{
"apps": [
{
"name": "my-app",
"script": "npm",
"args": "run dev",
"log": "logs/test.log",
"time": true,
"env": {
"NODE_ENV": "production"
}
}
]
}
"prd": "pm2 start pm2.json --only my-app",
pm-keeper
A simple way to force package-manager in your project.
you can set a options in your package.json, link this:
{
"scripts": {
"preinstall": "npx pm-keeper"
},
"pmKeeper": {
"name": "npm",
"version": "6.14.1" // optional
}
}
np
npm install --global np
$ np --help
Usage
$ np <version>
Version can be:
patch | minor | major | prepatch | preminor | premajor | prerelease | 1.2.3
Options
--any-branch Allow publishing from any branch
--branch Name of the release branch (default: main | master)
--no-cleanup Skips cleanup of node_modules
--no-tests Skips tests
--yolo Skips cleanup and testing
--no-publish Skips publishing
--preview Show tasks without actually executing them
--tag Publish under a given dist-tag
--contents Subdirectory to publish
--no-release-draft Skips opening a GitHub release draft
--release-draft-only Only opens a GitHub release draft for the latest published version
--test-script Name of npm run script to run tests before publishing (default: test)
--no-2fa Don't enable 2FA on new packages (not recommended)
--message Version bump commit message, '%s' will be replaced with version (default: '%s' with npm and 'v%s' with yarn)
--package-manager Use a specific package manager (default: 'packageManager' field in package.json)
Examples
$ np
$ np patch
$ np 1.0.2
$ np 1.0.2-beta.3 --tag=beta
$ np 1.0.2-beta.3 --tag=beta --contents=dist
工具包
包名 | 作用 |
---|---|
commander | 如果我们把 bin 下面的命令 huize-cli 称作一级命令,该命令是创建给系统识别的,那么commander工具包会创建对应的子命令和参数,使用该工具包就可以得到用户的子命令(create)、参数等。以及可以创建该命令的描述:例如huize-cli help 、huize-cli create --help 。具体使用方式,见官方文档 |
@inquirer/prompts | 它是一个用于在命令行端与用户交互的工具包,在使用commander得到用户命令和参数后,我们接下来就需要对用户进行一些提问,比如项目名称是什么、版本等信息。该工具包支持输入、选择、确认等基本交互 |
glob | 查文件的,在该项目中主要是用于查询当前命令行路径下的所有文件名称,避免冲突。 |
execa | 这是一个用于创建 cmd 执行命令的工具。在该项目中主要担任执行 git 克隆和pnpm i 包下载。 |
path | 拼接系统中的绝对路径,由于 windows 和 ios 的路径规则不一样,它就能很好的解决这个问题。 |
fs-extra | 读写文件。在该项目中,主要用于读取 clone 项目的 package.json,修改其 name 属性等。 |
mkdirp
https://github.com/isaacs/node-mkdirp.git
onchange
Use glob patterns to watch file sets and run a command when anything is added, changed or deleted.
使用glob模式监视文件集,并在添加、更改或删除任何内容时运行命令 https://github.com/Qard/onchange.git
"scripts": {
"watch": "onchange -i 'babel-plugins/**/*.ts' 'utils/**/*.ts' -- pnpm compile",
"build:cjs": "tsc",
"build:es": "tsc -m esNext --outDir dist/esm",
"build:clear": "rm -rf dist",
"compile": "pnpm build:cjs && pnpm build:es"
},
log-symbols
日志彩色符号,用来显示√ 或 × 等的图标
update-notifier检查库的更新
// 引用 update-notifier 库,用于检查更新
const updateNotifier = require('update-notifier')
// 引用 chalk 库,用于控制台字符样式
const chalk = require('chalk')
// 引入 package.json 文件,用于 update-notifier 库读取相关信息
const pkg = require('../package.json')
// updateNotifier 是 update-notifier 的方法,其他方法可到 npmjs 查看
const notifier = updateNotifier({
// 从 package.json 获取 name 和 version 进行查询
pkg,
// 设定检查更新周期,默认为 1000 * 60 * 60 * 24(1 天)
// 这里设定为 1000 毫秒(1秒)
updateCheckInterval: 1000,
})
function updateChk() {
// 当检测到版本时,notifier.update 会返回 Object
// 此时可以用 notifier.update.latest 获取最新版本号
if (notifier.update) {
console.log(`New version available: ${chalk.cyan(notifier.update.latest)}, it's recommended that you update before using.`)
notifier.notify()
} else {
console.log('No new version is available.')
}
}
// 将上面的 updateChk() 方法导出
module.exports = updateChk
gh-pages
"gh-pages": "^3.0.0",
{
"repository": {
"type": "git",
"url": "https://github.com/xxx",
"branch": "master"
},
"gitHooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"*.{js,jsx,less,md,json}": [
"prettier --write"
],
"*.ts?(x)": [
"prettier --parser=typescript --write"
]
}
}