實現(xiàn)按需加載/代碼分割 - 使用 require.ensure

在這一節(jié)使套,我們會討論 webpack 如何使用 require.ensure() 進行代碼拆分男娄。

require.ensure()

webpack 在編譯時震蒋,會靜態(tài)地解析代碼中的 require.ensure()瞬场,同時將模塊添加到一個分開的 chunk 當中乾巧。這個新的 chunk 會被 webpack 通過 jsonp 來按需加載句喜。

語法如下:

require.ensure(dependencies: String[], callback: function(require), chunkName: String)

依賴 dependencies

這是一個字符串數(shù)組,通過這個參數(shù)沟于,在所有的回調函數(shù)的代碼被執(zhí)行前咳胃,我們可以將所有需要用到的模塊進行聲明。

回調 callback

當所有的依賴都加載完成后旷太,webpack會執(zhí)行這個回調函數(shù)拙绊。require 對象的一個實現(xiàn)會作為一個參數(shù)傳遞給這個回調函數(shù)。因此,我們可以進一步 require() 依賴和其它模塊提供下一步的執(zhí)行标沪。

chunk名稱 chunkName

chunkName 是提供給這個特定的 require.ensure() 的 chunk 的名稱榄攀。通過提供 require.ensure() 不同執(zhí)行點相同的名稱,我們可以保證所有的依賴都會一起放進相同的 文件束(bundle)金句。

讓我們來看以下的項目

\\ file structure
    |
    js --|
    |    |-- entry.js
    |    |-- a.js
    |    |-- b.js
    webpack.config.js
    |
    dist

\\ entry.js

require('a');
require.ensure([], function(require){
    require('b');
});

\\ a.js
console.log('***** I AM a *****');

\\ b.js
console.log('***** I AM b *****');

\\ webpack.config.js
var path = require('path');

module.exports = function(env) {
    return {
        entry: './js/entry.js',
        output: {
            filename: 'bundle.js',
            path: path.resolve(__dirname, 'dist')
        }
    }
}

通過執(zhí)行這個項目的 webpack 構建檩赢,我們發(fā)現(xiàn) webpack 創(chuàng)建了2個新的文件束, bundle.js0.bundle.js违寞。

entry.jsa.js 被打包進 bundle.js.

b.js 被打包進 0.bundle.js.

W> require.ensure 內部依賴于 Promises贞瞒。 如果你在舊的瀏覽器中使用 require.ensure 請記得 去 shim Promise. es6-promise polyfill.

require.ensure() 的坑點

空數(shù)組作為參數(shù)

require.ensure([], function(require){
    require('./a.js');
});

以上代碼保證了拆分點被創(chuàng)建,而且 a.js 被 webpack 分開打包趁曼。

依賴作為參數(shù)

require.ensure(['./a.js'], function(require) {
    require('./b.js');
});

上面代碼军浆, a.jsb.js 都被打包到一起,而且從主文件束中拆分出來挡闰。但只有 b.js 的內容被執(zhí)行乒融。a.js 的內容僅僅是可被使用,但并沒有被輸出摄悯。

想去執(zhí)行 a.js赞季,我們需要異步地引用它,如 require('./a.js')奢驯,讓它的 JavaScritp 被執(zhí)行申钩。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘪阁,隨后出現(xiàn)的幾起案子撒遣,更是在濱河造成了極大的恐慌,老刑警劉巖管跺,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉舔,死亡現(xiàn)場離奇詭異,居然都是意外死亡伙菜,警方通過查閱死者的電腦和手機轩缤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贩绕,“玉大人火的,你說我怎么就攤上這事∈缜悖” “怎么了馏鹤?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娇哆。 經(jīng)常有香客問我湃累,道長勃救,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任治力,我火速辦了婚禮蒙秒,結果婚禮上,老公的妹妹穿的比我還像新娘宵统。我一直安慰自己晕讲,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布马澈。 她就那樣靜靜地躺著瓢省,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痊班。 梳的紋絲不亂的頭發(fā)上勤婚,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音涤伐,去河邊找鬼馒胆。 笑死,一個胖子當著我的面吹牛废亭,可吹牛的內容都是我干的。 我是一名探鬼主播具钥,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼豆村,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骂删?” 一聲冷哼從身側響起掌动,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宁玫,沒想到半個月后粗恢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡欧瘪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年眷射,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛掖。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡妖碉,死狀恐怖,靈堂內的尸體忽然破棺而出芥被,到底是詐尸還是另有隱情欧宜,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布拴魄,位于F島的核電站冗茸,受9級特大地震影響席镀,放射性物質發(fā)生泄漏。R本人自食惡果不足惜夏漱,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一豪诲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麻蹋,春花似錦跛溉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刹勃,卻和暖如春堪侯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荔仁。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工伍宦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乏梁。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓次洼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遇骑。 傳聞我的和親對象是個殘疾皇子卖毁,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361