Vue CLI中模式與環(huán)境變量的深入詳解
前言
在實際項目的開發(fā)中,我們一般會經(jīng)歷項目的開發(fā)階段、測試階段和最終上線階段,每一個階段對于項目代碼的要求可能都不盡相同,那么我們?nèi)绾文軌蛴稳杏杏嗟脑诓煌A段下使我們的項目呈現(xiàn)不同的效果,使用不同的功能呢?
這里就需要引入環(huán)境的概念。官方文檔中模式和環(huán)境變量說明
一般一個項目都會有以下 3 種環(huán)境:
- 開發(fā)環(huán)境(開發(fā)階段,本地開發(fā)版本,一般會使用一些調(diào)試工具或額外的輔助功能);
- 測試環(huán)境(測試階段,上線前版本,除了一些 bug 的修復,基本不會和上線版本有很大差別);
- 生產(chǎn)環(huán)境(上線階段,正式對外發(fā)布的版本,一般會進行優(yōu)化,關掉錯誤報告);
作為一名開發(fā)人員,我們可能需要針對每一種環(huán)境編寫一些不同的代碼并且保證這些代碼運行在正確的環(huán)境中,那么我們應該如何在代碼中判斷項目所處的環(huán)境同時執(zhí)行不同的代碼呢?這就需要我們進行正確的環(huán)境配置和管理。
1. 配置文件
正確的配置環(huán)境首先需要我們認識不同環(huán)境配置之間的關系,如圖所示:
我們從上圖中可以了解到每一個環(huán)境其實有其不同的配置,同時它們也存在著交集部分,交集便是它們都共有的配置項,那么在 Vue 中我們應該如何處理呢?
我們可以在根目錄下創(chuàng)建以下形式的文件進行不同環(huán)境下變量的配置:
.env # 在所有的環(huán)境中被載入
.env.local # 在所有的環(huán)境中被載入,但會被 git 忽略
.env.[mode] # 只在指定的模式中被載入, 如:.env.development,.env.production
.env.[mode].local # 只在指定的模式中被載入,但會被 git 忽略
如:創(chuàng)建一個名為 .env.development 的文件,該文件表明其只在 development 環(huán)境下被加載。
在這個文件中,我們可以配置如下鍵值對的變量:
# 開發(fā)環(huán)境配置 NODE_ENV=development VUE_APP_API_BASE_URL=https://www.baidu.com/
這時怎么在 vue.config.js 中訪問這些變量呢?使用 process.env.[name] 進行訪問就可以了。
// vue.config.js console.log(process.env.NODE_ENV); // development(在終端輸出)
當運行 npm run serve 命令后會發(fā)現(xiàn)輸出的是 development,因為 vue-cli-service serve 命令 默認設置的環(huán)境就是 development。
如果我們需要修改,可將 package.json 中的 serve 腳本的命令為:
// package.json "scripts": { "serve": "vue-cli-service serve --mode stage", },
–mode stage 其實就是修改了 webpack 4 中的 mode 配置項為 stage,同時其會讀取對應 .env.[model] 文件下的配置。
如果沒找到對應配置文件,其會使用默認環(huán)境 development,同樣 vue-cli-service build 會使用默認環(huán)境 production。
如果再創(chuàng)建一個 .env 的文件,再次配置重復的變量,但是值不同。
# 環(huán)境配置 NODE_ENV=ENV VUE_APP_API_BASE_URL=http://www.soso.com/
因為 .env 文件會被所有環(huán)境加載,即公共配置,那么最終運行 vue-cli-service serve 打印出來的是哪個呢?
答案是 development。
但是如果是 .env.development.local 文件中配置成上方這樣,答案便是 ENV。
所以 .env.[mode].local 會覆蓋 .env.[mode] 下的相同配置。
同理 .env.local 會覆蓋 .env 下的相同配置。
由此可以得出結(jié)論,相同配置項的權重:.env.[mode].local > .env.[mode] > .env.local > .env
注意: 除了相同配置項權重大的覆蓋小的,不同配置項它們會進行合并操作,類似于 Javascript 中的 Object.assign 的用法。
2. 環(huán)境注入
通過上述配置文件的創(chuàng)建,我們成功地使用命令行的形式對項目環(huán)境進行了設置并可以自由切換,但是注意:在 Vue 的前端代碼中打印出的 process.env 與 vue.config.js 中輸出的可能是不一樣的,這需要普及一個知識點:webpack 通過 DefinePlugin 內(nèi)置插件將 process.env 注入到客戶端代碼中。
// webpack 配置 { ... plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(process.env.NODE_ENV) } }), ], ... }
由于 vue-cli 3.x 封裝的 webpack 配置中已經(jīng)幫我們完成了這個功能,所以可以直接在客戶端代碼中打印出 process.env 的值,該對象可以包含多個鍵值對,也就是說可以注入多個值,但是 經(jīng)過 vue-cli 封裝后僅支持注入環(huán)境配置文件中以 VUE_APP_ 開頭的變量,而 NODE_ENV 和 BASE_URL 這兩個特殊變量除外。
比如:在權重最高的 .env.development.local 文件中寫入:
# 開發(fā)環(huán)境配置 NODE_ENV=developmentLocal VUE_APP_API_BASE_URL=https://www.baidu.com/ NAME=javaScript
然后我們嘗試在 vue.config.js 中打印 process.env,終端輸出:
{ ... npm_config_ignore_scripts: '', npm_config_version_git_sign: '', npm_config_ignore_optional: '', npm_config_init_version: '1.0.0', npm_package_dependencies_vue_router: '^3.0.1', npm_config_version_tag_prefix: 'v', npm_node_execpath: '/usr/local/bin/node', NODE_ENV: 'developmentLocal', VUE_APP_API_BASE_URL: 'https://www.baidu.com/', NAME: 'javaScript', BABEL_ENV: 'development', ... }
可以看到輸出內(nèi)容除了環(huán)境配置中的變量外還包含了很多 npm 的信息,但在入口文件 main.js 中打印會發(fā)現(xiàn)輸出:
{ BASE_URL: "/", NODE_ENV: "developmentLocal", VUE_APP_API_BASE_URL: "https://www.baidu.com/", }
可見注入時過濾調(diào)了非 VUE_APP_ 開頭的變量,其中多出的 BASE_URL 為你在 vue.config.js 設置的值,默認為 /,其在環(huán)境配置文件中設置無效。
3. 額外配置
以上我們通過新建配置文件的方式為項目不同環(huán)境配置不同的變量值,能夠?qū)崿F(xiàn)項目基本的環(huán)境管理,但是 .env 這樣的配置文件中的參數(shù)目前只支持靜態(tài)值,無法使用動態(tài)參數(shù),在某些情況下無法實現(xiàn)特定需求。
這時候可以在根目錄下新建 config 文件夾用于存放一些額外的配置文件。
/* 配置文件 index.js */ // 公共變量 const com = { IP: JSON.stringify('xxx') }; module.exports = { // 開發(fā)環(huán)境變量 dev: { env: { TYPE: JSON.stringify('dev'), ...com } }, // 生產(chǎn)環(huán)境變量 build: { env: { TYPE: JSON.stringify('prod'), ...com } } }
以上代碼把環(huán)境變量分為了公共變量、開發(fā)環(huán)境變量和生產(chǎn)環(huán)境變量,當然這些變量可能是動態(tài)的,比如用戶的 ip 等。
現(xiàn)在我們要在 vue.config.js 里注入這些變量,可以使用 chainWebpack 修改 DefinePlugin 中的值:
/* vue.config.js */ const configs = require('./config'); // 用于做相應的 merge 處理 const merge = require('webpack-merge'); // 根據(jù)環(huán)境判斷使用哪份配置 const cfg = process.env.NODE_ENV === 'production' ? configs.build.env : configs.dev.env; module.exports = { chainWebpack: config => { config.plugin('define').tap(args => { let name = 'process.env'; // 使用 merge 保證原始值不變 args[0][name] = merge(args[0][name], cfg); return args }) }, }
最后可以在客戶端成功打印出包含動態(tài)配置的對象:
{ BASE_URL: "/", IP: "xxx", NODE_ENV: "developmentLocal", TYPE: "dev", VUE_APP_API_BASE_URL: "https://www.baidu.com/", }
4. 實際場景
使用 process.env.xxx 來訪問屬性
<script> export default { data() { return { BASEURL:process.env, } }, mounted(){ console.log(this.BASEURL.VUE_APP_API_BASE_URL) // https://www.baidu.com/ } } </script>
// 創(chuàng)建 axios 實例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url timeout: 5000 })
結(jié)語
環(huán)境的配置和管理對于項目的構(gòu)建起到了至關重要的作用,通過給項目配置不同的環(huán)境不僅可以增加開發(fā)的靈活性、提高程序的拓展性,同時也有助于幫助我們?nèi)チ私獠⒎治鲰椖吭诓煌h(huán)境下的運行機制,建立全局觀念。
到此這篇關于Vue CLI中模式與環(huán)境變量的文章就介紹到這了,更多相關Vue CLI模式與環(huán)境變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue el-select與el-tree實現(xiàn)支持可搜索樹型
本文主要介紹了vue el-select與el-tree實現(xiàn)支持可搜索樹型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08vue.js分頁中單擊頁碼更換頁面內(nèi)容的方法(配合spring springmvc)
下面小編就為大家分享一篇vue.js分頁中單擊頁碼更換頁面內(nèi)容的方法(配合spring springmvc),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02使用el-row及el-col頁面縮放時出現(xiàn)空行的問題及解決
這篇文章主要介紹了使用el-row及el-col頁面縮放時出現(xiàn)空行的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03vue+element+Java實現(xiàn)批量刪除功能
這篇文章主要介紹了vue+element+Java實現(xiàn)批量刪除功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04