第七步 Webpack 配置多環(huán)境和全局變量 cross-env 和 webpack.DefinePlugin

一般情況下我們需要多個(gè)環(huán)境如:開發(fā)dev 測試test 預(yù)發(fā)布release 正式build,每個(gè)環(huán)境有自己的獨(dú)立api接口請求地址单鹿。
此時(shí)我們就需要使用cross-env命令設(shè)置環(huán)境變量掀宋。

1 安裝 cross-env

項(xiàng)目根目錄下打開終端或命令行工具,運(yùn)行以下命令來安裝相關(guān)依賴包:

npm install cross-env --save-dev

2 使用 cross-env

在你的項(xiàng)目根目錄下仲锄,找到 package.json 文件劲妙,根據(jù)以下內(nèi)容進(jìn)行修改:

"scripts": {
  "dev": "cross-env ENV_KEY=dev vue-cli-service serve",
  "test": "cross-env ENV_KEY=test vue-cli-service build",
  "release": "cross-env ENV_KEY=release vue-cli-service build",
  "build": "cross-env ENV_KEY=build vue-cli-service build"
}

3 多環(huán)境基本內(nèi)容配置

package.json 文件中添加各環(huán)境的配置,如下:

"envConfig": {
  "dev": {
    "API": "http://dev"
  },
  "test": {
    "API": "http://test"
  },
  "release": {
    "API": "http://release"
  },
  "build": {
    "API": "http://build"
  }
}

如需要配置其他內(nèi)容儒喊,和API同級即可镣奋。

package.json 修改后的完整內(nèi)容如下:

{
  "name": "my-vue2",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "cross-env ENV_KEY=dev vue-cli-service serve",
    "test": "cross-env ENV_KEY=test vue-cli-service build",
    "release": "cross-env ENV_KEY=release vue-cli-service build",
    "build": "cross-env ENV_KEY=build vue-cli-service build"
  },
  "envConfig": {
    "dev": {
      "API": "http://dev"
    },
    "test": {
      "API": "http://test"
    },
    "release": {
      "API": "http://release"
    },
    "build": {
      "API": "http://build"
    }
  },
  "dependencies": {
    "axios": "^1.4.0",
    "core-js": "^3.8.3",
    "element-ui": "^2.15.13",
    "vue": "^2.6.14",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "cross-env": "^7.0.3",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3",
    "image-minimizer-webpack-plugin": "^3.8.3",
    "imagemin": "^8.0.1",
    "imagemin-pngquant": "^9.0.2",
    "less": "^4.2.0",
    "less-loader": "^11.1.3",
    "vue-template-compiler": "^2.6.14"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

4 vue.config.js 配置 Webpack 打包時(shí)分配對應(yīng)環(huán)境配置

通過使用cross-env工具配置了環(huán)境變量ENV_KEY后,我們可以在vue.config.js文件中使用process.env.ENV_KEY來獲取該環(huán)境變量的值怀愧。接著侨颈,可以根據(jù)獲取到的值從package.json文件中獲取對應(yīng)的配置內(nèi)容,并將其存儲在全局變量中芯义,從而實(shí)現(xiàn)多環(huán)境的配置哈垢。

webpack.DefinePlugin是 Webpack 插件之一,用于在構(gòu)建過程中創(chuàng)建全局變量扛拨。它允許在代碼中使用這些全局變量耘分,可以在構(gòu)建時(shí)將它們替換為具體的值。

在你的項(xiàng)目根目錄下鬼癣,找到 vue.config.js 文件陶贼,根據(jù)以下內(nèi)容進(jìn)行修改:

const webpack = require('webpack')
const packageConfig = require('./package.json')

const ENV_CONFIG = packageConfig.envConfig[process.env.ENV_KEY]
plugins: [
  // 環(huán)境配置全局變量
  new webpack.DefinePlugin({ 'process.env.config': JSON.stringify(ENV_CONFIG) })
]

vue.config.js 修改后的完整內(nèi)容如下:

const path = require('path')
const webpack = require('webpack')
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin') // 壓縮圖片插件
const packageConfig = require('./package.json')

const ENV_CONFIG = packageConfig.envConfig[process.env.ENV_KEY]

module.exports = {
  // 靜態(tài)資源訪問路徑, 默認(rèn)是 '/'
  publicPath: './',
  // 指定構(gòu)建后的輸出目錄,默認(rèn)是 'dist'
  outputDir: 'dist',
  // 是否每次保存時(shí) lint 代碼,可選值 (boolean | 'warning' | 'default' | 'error') 默認(rèn) 'default'
  lintOnSave: 'default',
  // 配置開發(fā)服務(wù)器選項(xiàng)
  devServer: {
    // 開發(fā)服務(wù)器啟動時(shí)是否自動打開瀏覽器
    open: false,
    // 端口號
    port: 3000
  },
  // 配置css相關(guān)選項(xiàng)
  css: {
    // 開啟 source map
    sourceMap: process.env.NODE_ENV == 'development'
  },
  // webpack 的配置對象
  configureWebpack: {
    // 配置需要使用的 webpack 插件
    plugins: [
      // 環(huán)境配置全局變量
      new webpack.DefinePlugin({
        'process.env.config': JSON.stringify(ENV_CONFIG)
      }),
      // 壓縮圖片
      new ImageMinimizerPlugin({
        minimizer: {
          // 指定了采用哪種圖片壓縮實(shí)現(xiàn)方式
          implementation: ImageMinimizerPlugin.imageminGenerate,
          // 壓縮插件選項(xiàng)
          options: {
            plugins: ['pngquant'] // 用于對 PNG 圖片進(jìn)行壓縮
          }
        }
      })
    ],
    // 配置Webpack模塊解析的方式待秃,使得你可以通過模塊名字而不是相對路徑來引入模塊
    resolve: {
      // 設(shè)置路徑別名
      alias: {
        '@': path.resolve('src'),
        '@public': path.resolve('public'),
        '@img': path.resolve('src/assets/images'),
        '@js': path.resolve('src/assets/scripts'),
        '@css': path.resolve('src/assets/styles')
      }
    }
  }
}

在完成配置后拜秧,便可以在代碼中使用 process.env.config 來獲取對應(yīng)的配置項(xiàng)內(nèi)容。這樣章郁,根據(jù)之前的配置和設(shè)置的環(huán)境變量枉氮,可以輕松地在代碼中訪問和使用配置項(xiàng)的值志衍。這種方式非常方便,可以根據(jù)不同的環(huán)境動態(tài)獲取相應(yīng)的配置內(nèi)容聊替,使得代碼在不同的環(huán)境中更具靈活性和可配置性楼肪。



框架搭建整體流程

點(diǎn)擊下載步驟 1-7 配置完成的完整 Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惹悄,一起剝皮案震驚了整個(gè)濱河市春叫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泣港,老刑警劉巖暂殖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異当纱,居然都是意外死亡呛每,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門坡氯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晨横,“玉大人,你說我怎么就攤上這事箫柳∈中危” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵滞时,是天一觀的道長叁幢。 經(jīng)常有香客問我,道長坪稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任鳞骤,我火速辦了婚禮窒百,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豫尽。我一直安慰自己篙梢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布美旧。 她就那樣靜靜地躺著渤滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榴嗅。 梳的紋絲不亂的頭發(fā)上妄呕,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音嗽测,去河邊找鬼绪励。 笑死肿孵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疏魏。 我是一名探鬼主播停做,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼大莫!你這毒婦竟也來了蛉腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤只厘,失蹤者是張志新(化名)和其女友劉穎烙丛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懈凹,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜀变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了介评。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库北。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖们陆,靈堂內(nèi)的尸體忽然破棺而出寒瓦,到底是詐尸還是另有隱情,我是刑警寧澤坪仇,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布杂腰,位于F島的核電站,受9級特大地震影響椅文,放射性物質(zhì)發(fā)生泄漏喂很。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一皆刺、第九天 我趴在偏房一處隱蔽的房頂上張望少辣。 院中可真熱鬧,春花似錦羡蛾、人聲如沸漓帅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忙干。三九已至,卻和暖如春浪藻,著一層夾襖步出監(jiān)牢的瞬間捐迫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工珠移, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弓乙,地道東北人末融。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像暇韧,于是被迫代替她去往敵國和親勾习。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容