Skip to content

常用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 中就是用来对数量繁多的子模块进行并行构建和顺序测试。

bash
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

text
    --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,你可以在代码中方便地设置环境变量,而不需要手动在命令行中设置它们。

json
{
  "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

js
const webpack = require('webpack');

module.exports = {
	configureWebpack: {
		plugins: [
			new webpack.DefinePlugin({
				"process.argv": JSON.stringify(process.argv)
			})
		]
	}
}

打包时内存溢出解决方案

在依赖 package.json 中修改 build 为:

json
{
  "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 文件

text
    S3_BUCKET="YOURS3BUCKET"
    SECRET_KEY="YOURSECRETKEYGOESHERE"

使用

js
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。

bash
node -r dotenv/config your_script.js

以下配置选项支持作为以下格式 dotenv_config_<option>=value 的命令行参数

bash
 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

bash
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 。

https://npmmirror.com/package/dotenv-cli

dotenv-expand 扩展计算机上已经存在的环境变量

如果您发现自己需要扩展计算机上已经存在的环境变量,那么 dotenv-expand 就是您的工具。

minimist(命令行解析)

node.js的命令行参数解析工具有很多,比如:argparse、optimist、yars、commander。 optimist和yargs内部使用的解析引擎正是minimist,如果你喜欢轻量级的技术,那么minimist足够简单好用,代码量也很少(只有几百行),非常适合研读。

简单示例:

bash
node minimist.js lushuixi 16 --template vue --name --age=16 -f --price 2.5120

更多参数示例: 参数--sex如果指定了(不管后面有没有值),会解析为true。 而参数--sanhaosheng未指定,被解析为了false。

sh
    node index.js --beep=boop -t -z 12 -n5 foo bar

Node.js 程序启动后可以直接从process.argv中读取到参数列表:

js
 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 中可以得到启动参数列表,但是我们仍需要对参数进行进一步解析处理才行

js
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

text
"cross-env": "^7.0.3",
"nodemon": "^3.0.1",

packages/dev-server/nodemon.json

json
{
  "watch": [
    "src"
  ],
  "ext": ".ts",
  "exec": "ts-node -r tsconfig-paths/register ./src/main.ts"
}
sh
    "dev": "cross-env PORT=8681 nodemon",

pm2

packages/dev-server/pm2.json

sh
{
	"apps": [
		{
			"name": "my-app",
			"script": "npm",
			"args": "run dev",
			"log": "logs/test.log",
			"time": true,
			"env": {
				"NODE_ENV": "production"
			}
		}
	]
}
sh
    "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:

text
{
  "scripts": {
    "preinstall": "npx pm-keeper"
  },
  "pmKeeper": {
    "name": "npm",
    "version": "6.14.1" // optional
  }
}

np

bash
npm install --global np
text
$ 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 helphuize-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

text
"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检查库的更新

js
    // 引用 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

text
   "gh-pages": "^3.0.0",
json
{
  "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"
    ]
  }
}

Contributors

作者:Long Mo
字数统计:2.6k 字
阅读时长:10 分钟
Long Mo
文章作者:Long Mo
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Longmo Docs