您好,登錄后才能下訂單哦!
怎么在webpack中使用import()動態加載模塊?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
import
webpack根據ES2015 loader 規范實現了用于動態加載的import()方法。
這個功能可以實現按需加載我們的代碼,并且使用了promise式的回調,獲取加載的包。
在代碼中所有被import()的模塊,都將打成一個單獨的包,放在chunk存儲的目錄下。在瀏覽器運行到這一行代碼時,就會自動請求這個資源,實現異步加載。
這里是一個簡單的demo。
import('lodash').then(_ => { // Do something with lodash (a.k.a '_')... })
可以看到,import()的語法十分簡單。該函數只接受一個參數,就是引用包的地址,這個地址與es6的import以及CommonJS的require語法用到的地址完全一致。可以實現無縫切換【寫個正則替換美滋滋】。
并且使用了Promise的封裝,開發起來感覺十分自在。【包裝一個async函數就更爽了】
然而,以上只是表象。
只是表象。
我在開發的時候就遇到了問題。場景是這樣的:一個對象,存儲的是各級的路由信息,及其對應的頁面組件。為減少主包大小,我們希望動態加載這些頁面。
同時使用了react-loadable來簡化組件的懶加載封裝。代碼如下所示。
function lazyLoad(path) { return Loadable({ loader: () => import(path), loading: Spin, }); }
然后我就開始開心的在代碼中寫上lazyLoad('./pages/xxx')。果不其然,掛了。瀏覽器表示,沒有魚丸沒有粗面,也不知道這個傻逼模塊在哪里。
于是我查看了官方文檔,發現有一個黃條提示。
emmm,看來問題出在這里了。
這個現象其實是與webpack import()的實現高度相關的。由于webpack需要將所有import()的模塊都進行單獨打包,所以在工程打包階段,webpack會進行依賴收集。
此時,webpack會找到所有import()的調用,將傳入的參數處理成一個正則,如:
import('./app'+path+'/util') => /^\.\/app.*\/util$/
也就是說,import參數中的所有變量,都會被替換為【.*】,而webpack就根據這個正則,查找所有符合條件的包,將其作為package進行打包。
因此,如果我們直接傳入一個變量,webpack就會把 (整個電腦的包都打包進來[不鬧]) 認為你在逗他,并且拋出一個WARNING: Critical dependency: the request of a dependency is an expression。
所以import的正確姿勢,應該是盡可能靜態化表達包所處的路徑,最小化變量控制的區域
。
如我們要引用一堆頁面組件,可以使用import('./pages/'+ComponentName),這樣就可以實現引用的封裝,同時也避免打包多余的內容。
另外一個影響功能封裝的點,是import()中的相對路徑
,是import語句所在文件的相對路徑,所以進一步封裝import時會出現一些麻煩。
看完上述內容,你們掌握怎么在webpack中使用import()動態加載模塊的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。