楔子
爲什麼會注意到這個庫呢?
起因是因爲,在公司的項目 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