nodeJs 常用库之 cross-env

楔子

为什么会注意到这个库呢?

起因是因为,在公司的项目 package.json 看到 启动或者编译的命令是这样写的

"start": "cross-env NODE_ENV=development SERVICE_NAME=testServer nest start",
"start:dev": "cross-env NODE_ENV=development SERVICE_NAME=testServer nest start --watch",
"start:debug": "cross-env NODE_ENV=development SERVICE_NAME=testServer nest start --debug --watch",

而正常的NestJs 启动命令是这样的

"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",

有没有发现多点东西,那这些多的东西有啥用呢?

其实就是环境变量,既然是环境变量直接卸载.env 不就行了,为啥要用 cross-env库来实现?带这个问题,我们接着往下看

cross-env 为什么会出现

cross-env 的出现是因为在跨平台开发时,不同的操作系统使用不同的命令语法来设置环境变量

这会导致在编写 npm scripts 时需要编写多个命令,增加了项目维护的难度。

同时,如果我们将项目分享给其他人,他们可能需要对不同的平台进行适配。

为了解决这个问题,cross-env 库被创建出来,它提供了一个简单的解决方案

可以在所有平台上都使用相同的命令语法设置环境变量,而无需担心跨平台问题,大大简化了项目维护的难度,提高了开发效率。

通过使用 cross-env,开发者可以在 npm scripts 中指定环境变量,而无需考虑不同平台下的差异。

同时,cross-env 还支持嵌套命令,可以方便地进行复杂的环境变量设置。

cross-env 解决了那些问题

跨平台环境变量设置问题

在不同的操作系统下,设置环境变量的命令语法是不同的

比如在 Windows 下使用 set 命令,在 Linux 或 Mac 下使用 export 命令。

这会导致在编写 npm scripts 时需要编写多个命令,增加了项目维护的难度。

同时,如果我们将项目分享给其他人,他们可能需要对不同的平台进行适配。

cross-env 可以在所有平台上都使用相同的命令语法设置环境变量,而无需担心跨平台问题,大大简化了项目维护的难度,提高了开发效率。

命令行参数传递问题

在 npm scripts 中,我们可以通过 $npm_package_config_ 前缀来访问 package.json 文件中的配置项

例如 $npm_package_config_port 可以获取 package.json 中定义的 port 配置项的值。

但是如果我们需要传递一些命令行参数,例如 --watch--reporter 等,就不能直接通过 $npm_package_config_ 前缀来访问了。

cross-env 可以帮助我们解决这个问题,它支持嵌套命令,可以方便地进行复杂的环境变量设置,并且支持在命令行中传递参数。

例如:

"scripts": {
  "test": "cross-env NODE_ENV=test mocha --watch --reporter spec"
}

上述代码中,我们在 mocha 命令后添加了 --watch--reporter spec 参数,这些参数可以在 npm scripts 中进行传递,并且能够跨平台正常工作。

cross-env 官网

https://github.com/kentcdodds/cross-env

cross-env 安装

npm install --save-dev cross-env

案例

package.json

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "cross-env NODE_ENV=dev DB_CONNECTION_STRING=mongodb://dev:27017/myapp-dev node app.js",
    "test": "cross-env NODE_ENV=test DB_CONNECTION_STRING=mongodb://test:27017/myapp-test node app.js",
    "prod": "cross-env NODE_ENV=prod DB_CONNECTION_STRING=mongodb://prod:27017/myapp node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "lodash": "^4.17.21",
    "moment": "^2.29.4"
  },
  "devDependencies": {
    "cross-env": "^7.0.3"
  }
}

app.js

console.log(process.env.NODE_ENV,process.env.DB_CONNECTION_STRING);

执行

npm run dev
npm run test
npm run prod

image-20230518172548806

posted @ 2023-05-18 17:26  makalo  阅读(1149)  评论(0编辑  收藏  举报