首頁 >web前端 >js教程 >webpack import()動態載入模組的分析

webpack import()動態載入模組的分析

不言
不言原創
2018-07-21 13:17:235224瀏覽

這篇文章要跟大家分享的是關於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時會出現一些麻煩。

因為import語句中的路徑會在編譯後被處理成webpack指令執行目錄的相對路徑。

相關推薦:

##vue中token如何進行刷新處理

#

以上是webpack import()動態載入模組的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn