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