今天要來探討如何使用 require.ensure()
做程式碼分離,直接開始動手做
為了方便測試,先建立全新的 ./index2.html
檔,內容很單純,只有這樣:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Webpack demo</title>
</head>
<body>
<script src="dist/another.js" type="text/javascript"></script>
</body>
</html>
然後接下來建立 ./app/another.js
檔案,內容很簡單,也只有這樣:
require.ensure([], function(require){
require('./a2.js');
});
它的運作原理:在後續 bundle
的時候,會產生 ./dist/another.js
檔,以及 a2.js
會被 bundle
到另外一個檔案。而當有頁面(index2.html
)在載入 another.js
檔的時候,會以非同步的方式,載入 a2.js 被 bundle 的那個檔案。 以下讓我們來實驗看看:
建立 ./app/a2.js
,內容只有這樣:
console.log("I am a2 file.");
再修改 webpack.config.js
檔,entry
新增一行:
…
entry: {
…
another: './app/another.js',
…
},
…
再執行 webpack
指令。
好,以上 bundle
的結果,其實會產生兩個檔案:./dist/another.js
以及 ./dist/0.js
檔案,而 index2.html
在載入 dist/another.js
的時候,會在 <head>
區段建立以 非同步
方式載入 ./dist/0.js
檔的 <script>
語法。
再執行 webpack-dev-server --open
來看看畫面結果:
第一張圖,瀏覽器的 console 畫面,有印出訊息(I am a2 file.
):
第二張圖,程式碼中可看到 0.js
是以 async
非同步方式來載入。
讓我們回到 ./app/another.js
檔的程式:
require.ensure([], function(require){
require('./a2.js');
});
將它改成:
require.ensure(['./a1.js'], function(require){
require('./a2.js');
});
這樣的原理是:除了 ./app/another.js
會被 bundle 到另外的檔案之外,a2.js
會相依於 a1.js
,故會將 a1.js
及 a2.js
這兩個檔案 bundle
在同一個檔案,以此例來講會是./dist/0.js
檔,所以當頁面在載入 another.js 的時候,會以非同步的方式載入 0.js ,但只有 a2.js 會執行。若你希望a1.js 也要執行的話,只要在 ./app/another.js
檔的最上方再加上 require('./a1.js')
即可。
故要再建立 ./app/a1.js
檔,內容一樣只有一行:
console.log("I am a1 file.");
而 index2.html
內容不變,然後再執行 webpack
及 webpack-dev-server --open
就完成囉。相關的官網解說也可以在此看。
大家可試著練習看看,實際狀況就依照專案來搭配適合的方式使用。