vue.config中configureWebpack 與 chainWebpack

configureWebpack 和chainWebpack的作用相同调衰,唯一的區(qū)別就是它們修改webpack配置的方式不同:
  • configureWebpack 通過操作對象的形式,來修改默認(rèn)的webpack配置昧辽,該對象將會被 webpack-merge 合并入最終的 webpack 配置
  • chainWebpack 通過鏈?zhǔn)骄幊痰男问焦谕酰瑏硇薷哪J(rèn)的webpack配置

1.configureWebpack

  • 如果這個值是一個對象向挖,則會通過 webpack-merge 合并到最終的配置中。
  • 如果這個值是一個函數(shù)哪替,則會接收被解析的配置作為參數(shù)栋荸。該函數(shù)既可以修改配置并不返回任何東西,也可以返回一個被克隆或合并過的配置版本。
  • 如果你需要基于環(huán)境有條件地配置行為蒸其,或者想要直接修改配置敏释,那就換成一個函數(shù) (該函數(shù)會在環(huán)境變量被設(shè)置之后懶執(zhí)行)。該方法的第一個參數(shù)會收到已經(jīng)解析好的配置摸袁。在函數(shù)內(nèi)钥顽,你可以直接修改配置,或者返回一個將會被合并的對象,
  • configureWebpack不支持vue cli的語法糖或者說是不支持鏈?zhǔn)骄幊膛渲眯问娇恐V荒芡ㄟ^操作對象的形式蜂大,來修改默認(rèn)的webpack配置

下面來看一下configureWebpack配置方式:
1.1 configureWebpack對象形式

configureWebpack:{
  resolve: {
    // 別名配置
    alias: {
      'assets': '@/assets',
      'common': '@/common',
      'components': '@/components',
      'network': '@/network',
      'configs': '@/configs',
      'views': '@/views',
      'plugins': '@/plugins',
    }
  }
},

1.2 configureWebpack函數(shù)形式

const path = require('path');
function resolve (dir) {
  return path.join(__dirname, dir)
}

module.exports = {
  devServer: {
    ...
  }, 
  lintOnSave: false, // eslint-loader 是否在保存的時候檢查  
  productionSourceMap: false, // 生產(chǎn)環(huán)境是否生成 sourceMap 文件  
  filenameHashing: true, //文件hash
  configureWebpack: config => {
    if (isProduction) {
      ...
    } else {
      ...
    }
    //直接修改配置
    config.resolve.alias['@asset'] = resolve('src/assets')
  }
}

或者
const path = require('path');
function resolve (dir) {
  return path.join(__dirname, dir)
}

module.exports = {
  devServer: {
    ...
  }, 
  lintOnSave: false, // eslint-loader 是否在保存的時候檢查
  productionSourceMap: false, // 生產(chǎn)環(huán)境是否生成 sourceMap 文件
  filenameHashing: true, //文件hash
  configureWebpack: config => {
    if (isProduction) {
      ...
    } else {
      ...
    }
    //返回一個將要合并的對象
    return {
      resolve: {
        alias: {
          '@asset':resolve('src/assets')
        }
      }
    } 
  }
}

最好不要使用下面的方式,因?yàn)?code>Object.assign方法在合并對象時蝶怔,如果目標(biāo)對象(config)上有相同的屬性(resolve)奶浦,將會被覆蓋掉。不過這樣寫 Object.assign(config.resolve,{alias:{}}) 還是可以的踢星,只是覆蓋掉了alias澳叉。

Object.assign(config, {
  resolve: {
    alias: {
      '@': resolve('./src'),
      '@assets': resolve('./src/assets')
    }
  }
})

合并后,變成:

alias: {
  '@': resolve('./src'),
  '@assets': resolve('./src/assets')
}

2. chainWebpack

Vue CLI 內(nèi)部的 webpack 配置是通過 webpack-chain 維護(hù)的沐悦。這個庫提供了一個 webpack 原始配置的上層抽象成洗,使其可以定義具名的 loader 規(guī)則和具名插件,并有機(jī)會在后期進(jìn)入這些規(guī)則并對它們的選項(xiàng)進(jìn)行修改藏否。

官方代碼示例:

config
  .plugin(name)
  .use(WebpackPlugin, args)

參數(shù)說明:

  • namewebpack-chain 里的key瓶殃,就是要加入的插件在 webpack-chain 配置里的 key ,就是我們自定義插件的名字,一般我們都保持跟插件名稱相同
  • WebpackPlugin 使用的 webpack 插件名副签,在這里遥椿,可以直接使用插件,無需進(jìn)行實(shí)例化淆储,就是不需要 new WebpackPlugin()
  • args 插件的參數(shù)信息冠场。特別注意,args是一個數(shù)組遏考,例如 [{},{}] 這種方式慈鸠,可以配置多個插件實(shí)例
具體例子:
module.exports = (config) => {
    // set svg-sprite-loader
    config.module
        .rule('svg')
        .uses.clear() // 先刪除原有的默認(rèn)svg rule蓝谨,寫法1,
        // .exclude.add(resolve('src/assets/icons')) // 寫法2 針對svg默認(rèn)規(guī)則灌具,忽略src/assets/icons此文件夾下的
        .end()
    config.module
        .rule('icons')
        .test(/\.svg$/)
        .include.add(resolve('./../src/assets/icons'))
        .end()
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .options({
            symbolId: 'icon-[name]',
        })
        .end()

    //開啟happyPack多線程打包
    config.plugin('HappyPack').use(HappyPack, [
        {
            loaders: [
                {
                    loader: 'babel-loader?cacheDirectory=true',
                },
            ],
        },
    ])
}

使用示例:
使用 HappyPack 開啟多線程打包:這里可以寫在 configureWebpack 也可以寫在 chainWebpack 里面

1.configureWebpack

module.exports = {
    configureWebpack: config=>{
        config.plugin=[
            new HappyPack({
                loaders:[
                 {
                    loader: 'babel-loader?cacheDirectory=true',
                }
              ]
            })
        ]
    }
} 

2.chainWebpack

//開啟happyPack多線程打包
    config.plugin('HappyPack').use(HappyPack, [
        {
            loaders: [
                {
                    loader: 'babel-loader?cacheDirectory=true',
                },
            ],
        },
    ])

可以看到使用chainWebpack鏈?zhǔn)綄懛〞啙嵑芏啵恍枰猲ew譬巫,相當(dāng)于是一個語法糖吧咖楣。


一些常用的webpack-chain 縮寫方法

ChainedMap的有些key,可以直接作為方法調(diào)用芦昔,這些縮寫方法也同樣會返回原始實(shí)例诱贿,方便后續(xù)的鏈?zhǔn)秸{(diào)用。

devServer.hot(true);
devServer.set('hot', true);

  • .end() 通過.end()可以返回到更高層級的上下文,但是僅向上一個層級珠十,并且返回一個mutate后的實(shí)例料扰。或者是直接通過config是獲取的頂級上下文焙蹭。
  • .entry() 是webpack中config.entryPoints.get()的縮寫 晒杈。可以通過config.entry(name).add(value).entry()縮寫方法配置孔厉,也可以通過config.entryPoints.get(name).add(value)配置拯钻。
  • .add() 這是一個ChainedSet方法,它可以將值添加在Set的尾部撰豺。
  • output這是一個ChainedMap對象粪般,有很多方法,例如path()污桦,filename()亩歹,publicPath()等常用的方法。
  • module 也是一個ChinedMap凡橱,主要方法為rules(),配置loader的規(guī)則捆憎,config.module.rule(name).use(name).loader(loader).options(options),或者config.module.rule(name).use(name).tap(options => newOptions)
  • plugin 也是ChinedMap梭纹,主要是對plugin配置躲惰,config.plugin(name).use(WebpackPlugin, args)。重點(diǎn)對plugin做深入學(xué)習(xí)变抽。

引入webpack-chain后如何配置plugin?

  • 新增插件 adding
  • 修改參數(shù) modify arguments
  • 修改實(shí)例 modify instantiation
  • 移除插件 removing
  • 某個插件前調(diào)用插件odering before
  • 某個插件后調(diào)用插件ordering after

1.新增插件

config
    .plugin(name)
    .use(WebpackPlugin, args)
// 直接引入
config
  .plugin('hot')
  .use(webpack.HotModuleReplacementPlugin);
// 可以通過requrire('')的方式引入插件础拨。
config
  .plugin('env')
  .use(require.resolve('webpack/lib/EnvironmentPlugin'), [{ 'VAR': false }]);

2.修改參數(shù)

config
    .plugin(name)
    .tap(args => newArgs)
// 為arguments新增一個'SECRET_KEY'
config
    .plugin('env')
    .tap(args => [...args, 'SECRET_KEY'])
修改實(shí)例
config
    .plugin(name)
    .init((Plugin, args) => new Plugin(...args));

2.刪除插件

config.plugins.delete(name)

3.某個插件前調(diào)用插件odering before (不能在同一個插件上既使用before又使用after)

config
    .plugin(name)
      .before(otherName)
// 例子
config
    .plugin('html-template')
        .use(HtmlWebpackTemplate)
        .end()
    .plugin('script-ext')
        .use(ScriptExtWebpackPlugin)
        before('html-template')

4.某個插件后調(diào)用插件ordering after(不能在同一個插件上既使用before又使用after)

config
    .plugin(name)
      .after(otherName)
// 例子
config
    .plugin('html-template')
     .use(HtmlWebpackTemplate)
     .after('script-ext')
     .end()
     .plugin('script-ext')
     .use(ScriptExtWebpackPlugin)

轉(zhuǎn)自:http://www.reibang.com/p/27d82d98a041

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绍载,隨后出現(xiàn)的幾起案子诡宗,更是在濱河造成了極大的恐慌,老刑警劉巖击儡,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塔沃,死亡現(xiàn)場離奇詭異,居然都是意外死亡阳谍,警方通過查閱死者的電腦和手機(jī)蛀柴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矫夯,“玉大人鸽疾,你說我怎么就攤上這事⊙得玻” “怎么了制肮?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵冒窍,是天一觀的道長。 經(jīng)常有香客問我豺鼻,道長综液,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任儒飒,我火速辦了婚禮意乓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘约素。我一直安慰自己届良,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布圣猎。 她就那樣靜靜地躺著士葫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪送悔。 梳的紋絲不亂的頭發(fā)上慢显,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音欠啤,去河邊找鬼荚藻。 笑死,一個胖子當(dāng)著我的面吹牛洁段,可吹牛的內(nèi)容都是我干的应狱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼祠丝,長吁一口氣:“原來是場噩夢啊……” “哼疾呻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起写半,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤岸蜗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叠蝇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璃岳,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年悔捶,在試婚紗的時候發(fā)現(xiàn)自己被綠了铃慷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡炎功,死狀恐怖枚冗,靈堂內(nèi)的尸體忽然破棺而出缓溅,到底是詐尸還是另有隱情蛇损,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站淤齐,受9級特大地震影響股囊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜更啄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一稚疹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祭务,春花似錦内狗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拌倍,卻和暖如春赂鲤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柱恤。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工数初, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梗顺。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓泡孩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寺谤。 傳聞我的和親對象是個殘疾皇子珍德,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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