webpack實(shí)戰(zhàn)——生產(chǎn)環(huán)境配置【上】

前言

這是webpack實(shí)戰(zhàn)系列筆記的第10篇記錄——生產(chǎn)環(huán)境配置【上篇】鸯两。

在前面的幾篇中蒸苇,介紹了webpack的大部分使用方法咬像,使用其實(shí)就是為了上線沮峡,牽扯到生產(chǎn)環(huán)境疚脐,就會(huì)出現(xiàn)新的問題,比如:

  • 如何讓用戶更快的加載資源
  • 如何壓縮資源
  • 如何添加環(huán)境變量?jī)?yōu)化打包
  • 如何最大限度的利用緩存
  • ...

在生產(chǎn)環(huán)境配置篇中邢疙,將會(huì)一一介紹棍弄。本篇大致分為三個(gè)小篇,以上中下結(jié)構(gòu)拆開描述疟游。本篇描述:環(huán)境配置的封裝呼畸、開啟production模式、環(huán)境變量颁虐。

1. 環(huán)境變量的使用

在開發(fā)環(huán)境中蛮原,我們?cè)O(shè)置過mode模式,而生產(chǎn)環(huán)境中另绩,我們這需要更多的配置儒陨,如:mode、環(huán)境變量笋籽、版本號(hào)等蹦漠,webpack可以使用兩種方式來按照不同環(huán)境采用不同配置。

1.1 使用相同配置文件

例如之前的webpack.config.js车海,可以在構(gòu)建開始前將當(dāng)前環(huán)境作為一個(gè)變量傳進(jìn)去笛园,然后在js中通過判斷來決定使用某個(gè)配置:

// package.json
{
    ...
    "scripts": {
        "dev": "ENV=development webpack-dev-server",
        "build": "ENV=production webpack"
    }
}
// webpack.config.js

const ENV = process.env.ENV;
const isProd = ENV === 'production';
module.exports = {
    output: {
        filename: isProd ? 'bundle@[chunkhash].js' : 'bundle.js'
    },
    mode: ENV,
}

從上配置可以看出,首先通過npm腳本傳入了一個(gè)ENV的環(huán)境變量侍芝,而后在輸出時(shí)研铆,webpack中用三元表達(dá)式判斷環(huán)境,生產(chǎn)環(huán)境則添加哈希值為版本信息州叠,本地則直接輸出棵红。

1.2 多配置文件

顧名思義:為不同環(huán)境創(chuàng)建不同的配置信息文件。

例如留量,可以單獨(dú)創(chuàng)建一個(gè)webpack.development.config.js來配置開發(fā)環(huán)境信息窄赋,再創(chuàng)建一個(gè)webpack.production.config.js來配置生產(chǎn)環(huán)境信息。然后在package.json中修改:

{
    ...
    "scripts": {
        "dev": "webpack-dev-server --config=webpack.development.config.js",
        "build": "webpack --config=webpack.prodection.config.js"
    }
}

可以看到楼熄,上述的json文件中忆绰,通過 --config 來指定了打包時(shí)用哪一個(gè)文件,但其實(shí)會(huì)有一些小問題可岂,比如兩個(gè)配置文件會(huì)有重復(fù)的內(nèi)容错敢,不利于維護(hù)等,這時(shí)可以將重復(fù)配置提取出來寫成公共配置文件,比如再新建一個(gè)文件 webpack.common.config.js 來存放公共部分:

// webpack.common.config.js
module.exports = {
    entry: './src/index.js',
    // 公共配置
    ...
}

寫完之后稚茅,在開發(fā)與生產(chǎn)環(huán)境的webpack配置文件中纸淮,都引入該公共文件,然后加上自身的專屬配置即可亚享。

2. production模式

在前面我們多次用到一個(gè)叫做mode的配置咽块,其實(shí)這個(gè)配置時(shí)webpack4及之后才新添加的一個(gè)配置項(xiàng),開發(fā)者可以直接使用這個(gè)配置來切換打包模式欺税。例如:

// webpack.config.js
module.exports = {
    ...
    mode: 'production'
}

這便意味著當(dāng)前模式處于生產(chǎn)環(huán)境侈沪,那么webpack則會(huì)自動(dòng)添加許多適用于生產(chǎn)環(huán)境的配置項(xiàng),減少手動(dòng)操作配置晚凿。而目的也是為了提供更加有利的開發(fā)環(huán)境亭罪,更少的代碼,更少的配置歼秽,做更多的事兒应役。

然而,多數(shù)情況下燥筷,僅僅配置mode是難以達(dá)到我們希望的需求的箩祥,因此還是需要用到其他與生產(chǎn)環(huán)境配置相關(guān)聯(lián)的其他配置項(xiàng)。

3. 環(huán)境變量

通常荆责,我們需要為生產(chǎn)環(huán)境和本地環(huán)境添加不同的環(huán)境變量滥比,在webpack中可以試用DefinePlugin來進(jìn)行設(shè)置亚脆。

3.1 字符串類型

如:

// webpack.config.js
const webpack = require('webpack');
module.exports = {
    entry:'./src/index.js',
    output: {
        filename: 'bundle.js'
    },
    mode: 'production',
    plugins: [
        new webpack.DefinePlugin({
            ENV: JSON.stringify('production')
        })
    ]
}
// index.js
console.log(ENV);

如上所示做院。通過配置DefinePlugin設(shè)置了ENV的環(huán)境變量,最終頁(yè)控制臺(tái)上打印的字符串會(huì)是production濒持。

  • 注意
    上面用到了JSON.stringify键耕,因?yàn)镈efinePlugin在替換環(huán)境變量時(shí)對(duì)于字符串類型的值是完全替換,如果不加的話柑营,在替換后就會(huì)成為變量名而不是字符串屈雄。因此需要添加JSON.stringify。

3.2 其他類型

在上面演示了字符串類型官套,當(dāng)然也可以設(shè)置其他類型的環(huán)境變量酒奶。

// webpack.config.js
module.exports = {
    ...

    plugins: [
        new webpack.DefinePlugin({
            ENV: JSON.stringify('production'),
            IS_PRODUCTION: true,
            ENV_ID: 80808888,
            CONSTANTS: JSON.stringify(){
                TYPES: ['foo', 'bar']
            }
        })
    ]
}

3.3 其他說明

很多框架中都會(huì)采用process.env.NODE_ENV來作為一個(gè)區(qū)別開發(fā)環(huán)境和生產(chǎn)環(huán)境的變量。

  • process.env是Node.js用于存放當(dāng)前進(jìn)程環(huán)境變量的對(duì)象
  • NODE_ENV則可以讓開發(fā)者指定當(dāng)前的運(yùn)行時(shí)環(huán)境奶赔,值為production時(shí)代表生產(chǎn)環(huán)境惋嚎。

在上述中,當(dāng)庫(kù)和框架在打包時(shí)如果發(fā)現(xiàn)是生產(chǎn)環(huán)境站刑,那么就會(huì)去掉一些開發(fā)環(huán)境中的代碼和配置另伍,如警告信息,日志打印绞旅,斷點(diǎn)等摆尝,也有助于提升生產(chǎn)環(huán)境的代碼運(yùn)行速度温艇,并且優(yōu)化包體積。

具體配置如下:

// webpack.config.js
module.exports = {
    ...

    plugins: [
        new webpack.DefinePlugin({
            process.env.NODE_ENV: 'production'
        })
    ]
}

如果啟用了mode: production堕汞,那么webpack則已經(jīng)設(shè)置好了process.env.NODE_ENV勺爱,自己則無需再手動(dòng)操作

小結(jié)

本篇描述了關(guān)于生產(chǎn)環(huán)境的一些配置:環(huán)境變量的使用,配置文件描述讯检,生產(chǎn)模式開啟邻寿,環(huán)境變量自定義配置等。從這幾個(gè)方面入手都可以對(duì)生產(chǎn)環(huán)境產(chǎn)生一些有利影響视哑。

下一篇更新從 [source map] 方面和 [ 資源壓縮 ] 方面進(jìn)行配置和優(yōu)化處理绣否。


更多關(guān)于webpack的基礎(chǔ)講解和進(jìn)階及性能調(diào)優(yōu)方面歡迎關(guān)注公眾號(hào)【流眸】回復(fù)關(guān)鍵詞【webpack】獲取~

流眸
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挡毅,隨后出現(xiàn)的幾起案子蒜撮,更是在濱河造成了極大的恐慌,老刑警劉巖跪呈,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段磨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耗绿,警方通過查閱死者的電腦和手機(jī)苹支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來误阻,“玉大人债蜜,你說我怎么就攤上這事【糠矗” “怎么了寻定?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)精耐。 經(jīng)常有香客問我狼速,道長(zhǎng),這世上最難降的妖魔是什么卦停? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任向胡,我火速辦了婚禮,結(jié)果婚禮上惊完,老公的妹妹穿的比我還像新娘僵芹。我一直安慰自己,他們只是感情好专执,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布淮捆。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪攀痊。 梳的紋絲不亂的頭發(fā)上桐腌,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音苟径,去河邊找鬼案站。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棘街,可吹牛的內(nèi)容都是我干的蟆盐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遭殉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼石挂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起险污,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤痹愚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蛔糯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯腮,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蚁飒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了动壤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淮逻,死狀恐怖琼懊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弦蹂,我是刑警寧澤肩碟,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站凸椿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翅溺。R本人自食惡果不足惜脑漫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咙崎。 院中可真熱鬧优幸,春花似錦、人聲如沸褪猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碳却,卻和暖如春队秩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昼浦。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工馍资, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人关噪。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓鸟蟹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親使兔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子建钥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354