Node 配置檔案的定製
在任何一個專案中都缺少不了配置檔案\
具有下面的特點: 資料量不大,資訊需要長期儲存,容易維護
現在是大前端的時代,Node 的重要性不言而喻。在使用 Node 作為後端或者中間層的技術架構時,往往需要用到一些可配置的變數,比如資料庫,在開發時我們會連開發的資料庫,生成環境我們需要連生產的資料庫,這樣我們就需要根據不同的環境載入不一樣的配置檔案,從而提高我們的開發效率,接下來我們就一起來定製我們的配置檔案。
環境變數
在 Node 中可以通過process.env
來訪問當前的環境變數資訊。
比如我們在package.json
中通過scripts
定義的shell指令碼執行對應的命令。
// package.json { ... "scripts": { "start": "node ./bin/www", "dev": "NODE_ENV=dev node ./bin/www", "pro": "NODE_ENV=pro node ./bin/www" }, ... }
可以看到,上面有三條條啟動命令,一條是預設的start
,另外兩條我們通過NODE_ENV=xxx
來設定了對應的環境,當我們使用npm run dev
啟動專案的時候,通過process.env.NODE_ENV
就可以取到專案的當前環境。
通過環境變數指定對應的配置檔案
在上面我們通過shell指令碼指定了對應的環境,那我們就可以通過process.env.NODE_ENV
來載入對應的配置檔案了。
// config/index.js module.exports = { dev: { ...省略 mongodb: 'mongodb://localhost:27017/demo' }, build: { ...省略 mongodb: 'mongodb://127.0.0.0:27017/demo' } } // app.js const config = require('./config') const mongodb = process.env.NODE_ENV === 'dev' ? config.build.mongodb : config.dev.mongodb
這樣,我們就可以開開心心的放心的寫程式碼了,但這樣寫還不是很優雅,都寫到一個檔案裡了,不太好維護,接下來我們就真正的動態載入,不需要我們再加判斷了。
config-lite
ofollow,noindex">config-lite : A super simple & flexible & intuitive config module, support yaml & toml.
這一次,我們針對不同的環境,將配置寫入不同的配置檔案中,在專案根目錄下新建config目錄,裡面新建不同環境的配置檔案:default.js、dev.js和pro.js。
// default.js module.exports = { session: { secret: 'config-lite-demo', resave: false, saveUninitialized: true, cookie: { maxAge: 1000*60*60 } } }; // dev.js module.exports = { host: "https://dev.com", mongodb: 'mongodb://localhost:27017/test', ...省略 }; // pro.js module.exports = { host: "https://pro.com", mongodb: 'mongodb://127.0.0.0:27017/test', ...省略 };
好了,配置檔案寫好了,如何使用呢?這裡我們使用的config-lite
外掛,這個外掛依舊是依據我們shell指令碼指定的對應環境來選擇不同的配置檔案。
Install
$ npm i config-lite --save
當我們使用npm run dev
啟動專案的時候,config-lite
會去抓取dev.js配置,並且會與default.js裡配置去合併,如果有相同的物件,會覆蓋default.js裡的配置。同理npm run pro
Usage
// app.js const config = require('config-lite')(__dirname); // 1、如果執行 npm run dev config = { host: "https://dev.com", mongodb: 'mongodb://localhost:27017/test', session: { secret: 'config-lite-demo', resave: false, saveUninitialized: true, cookie: { maxAge: 1000*60*60 } } ...省略 } // 2、如果執行 npm run pro config = { host: "https://pro.com", mongodb: 'mongodb://127.0.0.0:27017/test', session: { secret: 'config-lite-demo', resave: false, saveUninitialized: true, cookie: { maxAge: 1000*60*60 } } ...省略 }
至此,我們就得到了更好維護的動態載入配置檔案。還有一個問題
(大多數情況下,在windows平臺下使用類似於: NODE_ENV=pro的命令列指令會卡住,windows平臺與POSIX在使用命令列時有許多區別(例如在POSIX,使用$ENV_VAR,在windows,使用%ENV_VAR%。。。))。那該如何解決呢?:point_down:
cross-env
cross-env 讓這一切變得簡單,不同平臺使用唯一指令,無需擔心跨平臺問題
Install
$ npm i cross-env --save
Usage
// package.json { ... "scripts": { "start": "node ./bin/www", "dev": "cross-env NODE_ENV=dev node ./bin/www", "pro": "cross-env NODE_ENV=pro node ./bin/www" }, ... }
這樣 NODE_ENV 便設定成功,無需擔心跨平臺問題。
egg 配置檔案的使用
在 config 目錄(腳手架生成的)新增 config.dev.js 和 config.pro.js,然後在檔案內寫我們對應環境的配置。
-
配置環境
// package.json { ... "script": { ... "dev": "EGG_SERVER_ENV=dev egg-bin dev", "pro": "EGG_SERVER_ENV=pro egg-scripts start", ... } ... }
在 egg 中通過EGG_SERVER_ENV
來宣告對應的環境變數。
-
使用
const config = this.app.config // 得到對應環境的配置檔案(也會和 default 進行合併)
完結,好久沒寫了,有點生疏了,苦笑!!!