import() 函數是ES6的一個提案,專門用于動态加載子產品的,正常情況下,如下代碼,完美運作,無任何問題。
button.addEventListener('click', event => {
import('./dialogBox.js')
.then(dialogBox => {
dialogBox.open();
})
});
一旦把import中的參數改成變量,如下代碼,就會報 the request of a dependency is an expression Cannot find module './dialogBox.js',你說氣人不。
let url="./dialogBox.js";
button.addEventListener('click', event => {
import(url)
.then(dialogBox => {
dialogBox.open();
})
});
這個現象其實是與webpack import()的實作高度相關的。由于webpack需要将所有import()的子產品都進行單獨打包,是以在工程打包階段,webpack會進行依賴收集。
此時,webpack會找到所有import()的調用,将傳入的參數處理成一個正則,如:
import('./app'+path+'/util') => /^\.\/app.*\/util$/
也就是說,import參數中的所有變量,都會被替換為 .* ,而webpack就根據這個正則,查找所有符合條件的包,将其作為package進行打包。
是以,如果我們直接傳入一個變量,webpack就會把 (整個電腦的包都打包進來) 是以import的正确姿勢,應該是
盡可能靜态化表達包所處的路徑,最小化變量控制的區域
。如我們要引用一堆頁面元件,可以使用import('./pages/'+ComponentName),這樣就可以實作引用的封裝,同時也避免打包多餘的内容。