profile是什麼?
在應用開發中, 總會遇到開發/測試/預發佈/線上環境, 其環境不同, 其具體的配置項也有所不同, 不同環境的配置就可以理解爲是不同的profile.
如何快速的切換各個環境配置, 進行打包配置, 成了一個小痛點. 在Java環境中如果使用maven進行打包,其自帶插件就已經能很好的解決這個問題了,那麼在Nodejs環境是否也有相似的工具呢?這就是接下來本問要介紹的內容了~
使用NODE_ENV來區分不同環境
- 定義: 是nodejs用來區分不同環境的設置,這個變量可以在nodejs的進程信息中(即process對象)查到
- process 對象是一個全局變量,它提供有關當前 Node.js 進程的信息並對其進行控制。 作爲一個全局變量,它始終可供 Node.js 應用程序使用,無需使用 require()。 它也可以使用 require() 顯式地訪問:
const process = require('process');
- 設置方式:在不同的操作系統有不同的方式
- linux & mac: export NODE_ENV=production
- windows: set NODE_ENV=production
- 使用方式:
//在需要用的地方做如下的判斷
//或者把配置放在一個js文件中統一進行判斷,然後需要的地方直接引用該js的變量即可
if (process.env.NODE_ENV === 'production') {
// just for production code
}
- 缺點:需要在部署環境上預先設定好NODE_ENV, 綁定了機器,這樣不是很合理,在本地做開發時使用還差不多。如果在上線的話,萬一哪天上了個新環境,沒設置這個變量,系統會默認設置爲development,就會產生一些預料之外的結果了
使用NPM來區分不同環境
這種方式可以看做是對NODE_ENV使用的進階版,將NODE_ENV的設置通過不同的運行命令來實現。
使用方式:
- 使用cross-env實現跨平臺的NODE_ENV設置
- 使用npm run COMMAND_NAME來實現對不同環境的設置. npm是nodejs使用的一種依賴管理器,具體可以查看參考鏈接1
例子:
{
"name": "nodejs_demos",
"version": "1.0.0",
"scripts": {
"dev": "cross-env NODE_ENV=dev nodemon src/app/app.js",
"prod1": "cross-env NODE_ENV=product1 node src/app/app.js",
"prod2": "cross-env NODE_ENV=product2 node src/app/app.js"
},
"keywords": [
"Koa",
"Node"
],
"author": "Li Yi",
"license": "ISC",
"dependencies": {
"cross-env": "^6.0.3",
"express-validator": "^6.3.0",
"fs.promised": "^3.0.0",
"koa": "^2.3.0",
"koa-body": "^2.3.0",
"koa-bodyparser": "^4.2.1",
"koa-compose": "^4.0.0",
"koa-parameter": "^3.0.1",
"koa-route": "^3.2.0",
"koa-router": "^7.4.0",
"koa-schema": "0.0.1",
"koa-static": "^4.0.1",
"log4js": "^6.1.0"
}
}
例子說明:
* src/app/app.js是啓動程序
* 想要啓動xx環境的配置使用npm run xx命令即可, 譬如啓動dev環境的命令就是npm run dev
代碼實踐
準備
git clone https://gitee.com/oschinaLiyi/nodejs_demos.git
cd nodejs_demos
npm install
以dev環境配置啓動
npm run dev
啓動日誌如下: 可以到看到env中配置的當前的環境爲dev
> [email protected] dev /Users/liyi/workspace_java/gitee/nodejs_demos
> cross-env NODE_ENV=dev node src/app/app.js
env: {"currentEnv":"dev","logLevel":"debug"}
ready for service
執行命令
curl http://localhost:3000/
返回當前的環境爲:dev
同時控制也可以看到這樣的日誌:
currentEnv:dev
以prod1環境配置啓動
npm run prod1
日誌如下:可以到看到env中配置的當前的環境爲prod1
➜ nodejs_demos git:(master) ✗ npm run prod1
> [email protected] prod1 /Users/liyi/workspace_java/gitee/nodejs_demos
> cross-env NODE_ENV=prod1 node src/app/app.js
env: {"currentEnv":"prod1","logLevel":"info"}
ready for service