您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Node項目怎么配置環(huán)境并讓其支持可擴(kuò)展”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Node項目怎么配置環(huán)境并讓其支持可擴(kuò)展”這篇文章吧。
因Node項目開發(fā)的較少沒涉及到環(huán)境變量切換,但是經(jīng)常做前端項目開發(fā)總是會遇到,比如在Vue的項目可以配置.env.xxx.xxx并要求環(huán)境變量的配置要以VUE_APP_
開頭,Why?,我們就一起來探索一下Vue項目的環(huán)境變量是怎么加載并解析的,我們再移植到Node項目中。
先來看看Vue CLI關(guān)于模式和環(huán)境變量的說明,我們看到有這么一段話:想要了解解析環(huán)境文件規(guī)則的細(xì)節(jié),請參考 dotenv。我們也使用 dotenv-expand 來實(shí)現(xiàn)變量擴(kuò)展 (Vue CLI 3.5+ 支持)。我們先用Vue Cli來創(chuàng)建一個Vue項目。
探索第一步:
在package.json
中通過執(zhí)行scripts
的命令都使用到了@vue/cli-service
包
探索第二步:
@vue/cli-service
包確實(shí)安裝了官網(wǎng)提示的兩個依賴包,并在bin
目錄下的vue-cli-service.js
文件中找到了關(guān)鍵類Service
。
探索第三步:
在Service
中我們找到了加載環(huán)境配置的關(guān)鍵函數(shù),其中的兩個path
分別指:.env.mode
和.env.mode.local
,也就是我們的環(huán)境變量文件可以支持帶.local
也可以不帶。
思考load
兩次的作用?
探索第三步:
指定的前綴是怎么回事?我們在util
目錄下找到了答案:resolveClientEnv.js
,最終是由DefinePlugin
插件加載到了全局的配置中。
思考BASE_URL
的設(shè)置?
準(zhǔn)備webpack項目環(huán)境
準(zhǔn)備webpack.config.js
新增env-helper.js,我們一起來實(shí)現(xiàn)一下:
必備依賴裝一下
npm install dotenv --save npm install dotenv-expand --save
解析環(huán)境變量文件
/** * 解析環(huán)境變量文件 * @param {*} mode */ const loadEnv = (mode) => { const basePath = path.resolve(__dirname, `.env${mode ? `.${mode}` : ``}`); const localPath = `${basePath}.local`; const load = (envPath) => { try { const env = dotenv.config({ path: envPath, debug: process.env.DEBUG }); dotenvExpand(env); } catch (err) { if (err.toString().indexOf("ENOENT") < 0) { console.error(err); } } }; load(localPath); load(basePath); };
符合前綴的環(huán)境變量對象
將符合正則條件的和特殊的進(jìn)行整合后返回,通過注入到
DefinePlugin
插件中。
/** * 獲取符合前綴規(guī)則的環(huán)境變量對象 */ const prefixRE = /^XXTX_APP_/; const resolveClientEnv = () => { const env = {}; Object.keys(process.env).forEach((key) => { if (prefixRE.test(key) || key === "NODE_ENV") { env[key] = process.env[key]; } }); return env; };
升級webpack.config.js來演示環(huán)境變量讀取
增加演示插件和NODE_ENV配置
const webpack = require("webpack"); const { loadEnv, resolveClientEnv } = require("./env-helper"); // 解析環(huán)境配置文件 // 通過cross-env 再scripts中配置NODE_ENV=development loadEnv(process.env.NODE_ENV); // 獲取符合規(guī)則的環(huán)境配置對象 const env = resolveClientEnv(); const HelloWorldPlugin = require("./hello-world"); module.exports = { mode: "development", plugins: [ new webpack.DefinePlugin(env), new HelloWorldPlugin({ options: true }), ], };
在我們的webpack插件中使用環(huán)境變量
class HelloWorldPlugin { apply(compiler) { compiler.hooks.done.tap("HelloWorldPlugin", () => { console.log("Hello World!"); console.log("[ XXTX_APP_NAME ] >", process.env.XXTX_APP_NAME); console.log("[ XXTX_APP_BASE_URL ] >", process.env.XXTX_APP_BASE_URL); }); } } module.exports = HelloWorldPlugin;
查看輸出結(jié)果
以上是“Node項目怎么配置環(huán)境并讓其支持可擴(kuò)展”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。