我正在使用Webpack,我想將我的客戶代碼分成幾塊,並在用戶需要時加載它們。如何使用require.ensure將Webpack中的代碼拆分爲生產?
這是我的文件結構:
app.js <-- Entry point as introduced to Webpack
Module.js <-- To be loaded dynamically
有app.js
和Module.js
之間沒有直接的聯繫,而不是第二個文件是由第一次加載這樣的:
require.ensure([], (require) => {
let path = "Module";
let module = require("./" + path).default;
});
我以前"./" + path
只是爲了讓確保Webpack不會對我變得聰明,並嘗試靜態解析路徑。無論如何,這段代碼在webpack-dev-server的開發模式下工作。我的意思是Module.js
不會被下載,直到我觸發事件來運行上面的代碼。之後,它被完美加載並執行。
但是,當我包裝生產項目時,它停止工作。它提供了以下錯誤(在瀏覽器中,當我觸發下載事件),甚至沒有嘗試發送請求:
Uncaught Error: Cannot find module './Module'.
而且,當我撰寫的路徑動態(如上面的代碼),建設過程中散發出以下警告:
WARNING in ./src/app/app.js Critical dependencies: 74:34-47 the request of a dependency is an expression
爲生產配置Webpack的正確方法是什麼,因此它支持動態下載代碼拆分?
我測試了@wollnyst給出的解決方案,這裏是結果。當我實現它這樣的,它的工作原理:
require.ensure(["./Module"], (require) => {
let path = "Module";
let module = require("./" + path).default;
});
但是,這不是我想的那樣,我希望它是這樣的:
let path = "Module";
require.ensure(["./" + path], (require) => {
let module = require("./" + path).default;
});
現在,它給出了一個運行時錯誤的瀏覽器:
Uncaught TypeError: webpack_require(...).ensure is not a function
還是沒有運氣!
您不需要使模塊路徑動態化就可以使其動態加載。 'require.ensure'負責照顧。靜態路徑將在你的情況下工作得很好 – raiyan
@RaiyanMohammed對不起,但我沒有關注!在上面的代碼中,我正在動態地創建路徑,因爲在現實生活中,我是這麼做的。在編寫代碼時,模塊的路徑是未知的。只有在運行時纔會在變量中指定路徑。 – Mehran
這是問題:與node-require不同,webpack是靜態的。它在構建時運行一次。因此,webpack無法評估動態「需求」。你有什麼結構?也許定義一個自己的[context](https://webpack.github.io/docs/context.html)可能會有所幫助。 – wollnyst