webpack優(yōu)化-代碼拆分

一吃引、分離第三方庫(vendor)

把第三方代碼和應(yīng)用本身的代碼一起打包是非常低效的佛析。
因?yàn)闉g覽器會(huì)根據(jù)緩存頭來緩存資源文件栗精,如果文件沒有被改變闯参,文件將會(huì)被緩存從而不用去再次請(qǐng)求 cdn瞻鹏。
為了利用這一特性,我們希望不管應(yīng)用本身的代碼如何改變鹿寨,vendor 文件的 hash 始終恒定不變新博。

用法:

var webpack = require('webpack');
var path = require('path');

module.exports = function(env) {
    return {
        entry: {
            main: './index.js',
            vendor: 'moment'
        },
        output: {
            filename: '[chunkhash].[name].js',
            path: path.resolve(__dirname, 'dist')
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                name: 'vendor' // 指定公共 bundle 的名字。
            })
        ]
    }
}

為第三方庫moment添加一個(gè)單獨(dú)的入口vendor脚草,在不使用CommonsChunkPlugin的情況下赫悄,webpack運(yùn)行后會(huì)生成兩個(gè)bundle,并且兩個(gè)bundle中都會(huì)有moment的代碼馏慨。
CommonsChunkPlugin允許我們從不同的 bundle 中提取所有的公共模塊埂淮,并且將他們加入公共 bundle 中。如果公共 bundle 不存在写隶,那么它將會(huì)創(chuàng)建一個(gè)出來倔撞。
利用這個(gè)特性,我們指定公共bundle的名字與moment的bundle文件一樣慕趴,從而讓CommonsChunkPlugin提取的公共模塊覆蓋moment的bundle文件痪蝇,達(dá)到分離第三方庫的效果。

至此冕房,我們已經(jīng)成功的將第三方代碼提取到了獨(dú)立的bundle躏啰,但上文提到的瀏覽器緩存機(jī)制我們還是無法用上,因?yàn)?vendor 的 hash 在每次構(gòu)建中都會(huì)改變毒费,瀏覽器也必須重新加載文件丙唧。

解決方案:

var webpack = require('webpack');
var path = require('path');

module.exports = function(env) {
    return {
        entry: {
            main: './index.js',
            vendor: 'moment'
        },
        output: {
            filename: '[chunkhash].[name].js',
            path: path.resolve(__dirname, 'dist')
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                names: ['vendor', 'manifest'] // 指定公共 bundle 的名字。
            })
        ]
    }
};

最終會(huì)生成多一個(gè)mainfest bundle
更多介紹見 webpack優(yōu)化-緩存

二觅玻、分離CSS

1想际、導(dǎo)入 CSS

import 'bootstrap/dist/css/bootstrap.css';

2、使用 css-loader

module.exports = {
    module: {
        rules: [{
            test: /\.css$/,
            use: 'css-loader'
        }]
    }
}

結(jié)果溪厘,CSS和您的JavaScript打包在一起胡本。
這有個(gè)缺點(diǎn),您將無法利用瀏覽器的異步和并行加載CSS的能力畸悬。這樣侧甫,您的網(wǎng)頁必須等待,直到您的整個(gè)JavaScript 包下載完成蹋宦,然后重繪網(wǎng)頁披粟。

3、使用 ExtractTextWebpackPlugin
這個(gè)插件要自己安裝

module.exports = {
    module: {
         rules: [{
             test: /\.css$/,
-            use: 'css-loader'
+            use: ExtractTextPlugin.extract({
+                use: 'css-loader'
+            })
         }]
     },
+    plugins: [
+        new ExtractTextPlugin('styles.css'),
+    ]
}
三冷冗、按需分離

雖然前面幾類資源分離守屉,需要用戶預(yù)先在配置中指定分離模塊,但也可以在應(yīng)用程序代碼中創(chuàng)建動(dòng)態(tài)分離模塊蒿辙。
這可以用于更細(xì)粒度的代碼塊,例如,根據(jù)我們的應(yīng)用程序路由灾常,或根據(jù)用戶行為預(yù)測(cè)。這可以使用戶按照實(shí)際需要加載非必要資源恭取。

四、使用 require.ensure() 分離代碼
require.ensure(dependencies: String[], callback: function(require), chunkName: String)

兩種情況:

// 空數(shù)組作為參數(shù)
require.ensure([], function(require){
    require('./a.js');
});

a.js會(huì)被打包到獨(dú)立的bundle熄守,例如entry打包輸出為bundle.js蜈垮,a.js會(huì)被打包為0.bundle.js

//依賴作為參數(shù)
require.ensure(['./a.js'], function(require) {
    require('./b.js');
});

上面代碼, a.js 和 b.js 都被打包到一起柠横,而且從主文件束中拆分出來窃款。但只有 b.js 的內(nèi)容被執(zhí)行。a.js 的內(nèi)容僅僅是可被使用牍氛,但并沒有被輸出。
想去執(zhí)行 a.js烟阐,我們需要異步地引用它搬俊,如 require('./a.js'),讓它的 JavaScritp 被執(zhí)行蜒茄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唉擂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檀葛,更是在濱河造成了極大的恐慌玩祟,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屿聋,死亡現(xiàn)場(chǎng)離奇詭異空扎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)润讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門转锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人楚殿,你說我怎么就攤上這事撮慨。” “怎么了脆粥?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵砌溺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我变隔,道長(zhǎng)规伐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任弟胀,我火速辦了婚禮楷力,結(jié)果婚禮上喊式,老公的妹妹穿的比我還像新娘。我一直安慰自己萧朝,他們只是感情好岔留,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著检柬,像睡著了一般献联。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上何址,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天里逆,我揣著相機(jī)與錄音,去河邊找鬼用爪。 笑死原押,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偎血。 我是一名探鬼主播诸衔,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颇玷!你這毒婦竟也來了笨农?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤帖渠,失蹤者是張志新(化名)和其女友劉穎谒亦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體空郊,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡份招,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渣淳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脾还。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖入愧,靈堂內(nèi)的尸體忽然破棺而出鄙漏,到底是詐尸還是另有隱情,我是刑警寧澤棺蛛,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布怔蚌,位于F島的核電站,受9級(jí)特大地震影響旁赊,放射性物質(zhì)發(fā)生泄漏桦踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一终畅、第九天 我趴在偏房一處隱蔽的房頂上張望籍胯。 院中可真熱鬧竟闪,春花似錦、人聲如沸杖狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝶涩。三九已至理朋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绿聘,已是汗流浹背嗽上。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熄攘,地道東北人兽愤。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鲜屏,于是被迫代替她去往敵國和親烹看。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • GitChat技術(shù)雜談 前言 本文較長(zhǎng)洛史,為了節(jié)省你的閱讀時(shí)間,在文前列寫作思路如下: 什么是 webpack酱吝,它要...
    蕭玄辭閱讀 12,698評(píng)論 7 110
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,480評(píng)論 2 71
  • 記得2004年的時(shí)候也殖,互聯(lián)網(wǎng)開發(fā)就是做網(wǎng)頁,那時(shí)也沒有前端和后端的區(qū)分务热,有時(shí)一個(gè)網(wǎng)站就是一些純靜態(tài)的html忆嗜,通過...
    陽陽陽一堆陽閱讀 3,309評(píng)論 0 5
  • 原文首發(fā)于:Webpack 3捆毫,從入門到放棄 Update (2017.8.27) : 關(guān)于 output.pub...
    昵稱都被用完了衰閱讀 1,903評(píng)論 4 19
  • 本文寫于 Webpack 2 正式發(fā)布之前(完善文檔階段),不僅是 Webpack 2 的入門教程冲甘,也介紹了 We...
    cbw100閱讀 2,760評(píng)論 3 30