Tôi đang sử dụng Webpack và tôi muốn chia mã khách hàng thành nhiều phần và tải chúng khi người dùng cần chúng.Làm thế nào để tách mã trong Webpack với require.ensure cho sản xuất?
Dưới đây là cấu trúc tập tin của tôi:
app.js <-- Entry point as introduced to Webpack
Module.js <-- To be loaded dynamically
Không có kết nối trực tiếp giữa app.js
và Module.js
, thay vào đó là tập thứ hai được nạp bởi người đầu tiên như thế này:
require.ensure([], (require) => {
let path = "Module";
let module = require("./" + path).default;
});
tôi đã sử dụng "./" + path
chỉ để chắc chắc chắn Webpack sẽ không thông minh với tôi và cố gắng giải quyết đường dẫn tĩnh. Dù sao, mã này hoạt động trong chế độ phát triển với webpack-dev-server. Bởi vì tôi có nghĩa là Module.js
không được tải xuống cho đến khi tôi kích hoạt sự kiện để chạy mã trên. Và sau đó, nó được nạp và thực hiện một cách hoàn hảo.
Nhưng khi tôi đóng gói dự án để sản xuất, nó sẽ ngừng hoạt động. Nó đưa ra các lỗi sau (trong trình duyệt khi tôi kích hoạt các sự kiện tải về) mà không cần cố gắng để gửi yêu cầu:
Uncaught Error: Cannot find module './Module'.
Hơn nữa, khi tôi soạn con đường tự động (như mã ở trên), quá trình xây dựng đưa ra cảnh báo sau:
WARNING in ./src/app/app.js Critical dependencies: 74:34-47 the request of a dependency is an expression
Cách nào đúng để định cấu hình Webpack cho sản xuất để hỗ trợ chia tách mã được tự động?
Tôi đã thử nghiệm giải pháp được đưa ra bởi @wollnyst và đây là kết quả. Khi tôi thực hiện nó như thế này, nó hoạt động:
require.ensure(["./Module"], (require) => {
let path = "Module";
let module = require("./" + path).default;
});
Nhưng đó không phải là cách tôi muốn nó, tôi muốn nó như thế này:
let path = "Module";
require.ensure(["./" + path], (require) => {
let module = require("./" + path).default;
});
Bây giờ nó mang lại cho ra một lỗi thời gian chạy trong trình duyệt:
Uncaught TypeError: webpack_require(...).ensure is not a function
Vẫn không may mắn!
Bạn không cần phải làm cho đường dẫn mô-đun động chỉ để làm cho nó tải động. 'require.ensure' quan tâm đến điều đó. Đường dẫn tĩnh sẽ hoạt động tốt trong trường hợp của bạn – raiyan
@RaiyanMohammed Tôi xin lỗi nhưng tôi không làm theo! Trong đoạn code trên tôi đang tạo ra con đường năng động bởi vì trong cuộc sống thực, tôi có nó theo cách đó. Đường dẫn đến mô-đun không xác định tại thời điểm viết mã. Nó chỉ là thời gian chạy mà đường dẫn được chỉ định trong một biến. – Mehran
Đây là vấn đề: Ngược lại với nút yêu cầu, webpack là tĩnh. Nó chạy một lần tại thời gian xây dựng. Do đó, webpack không thể đánh giá 'require' động. Bạn có chính xác cấu trúc nào? Có thể xác định [ngữ cảnh] của riêng mình (https://webpack.github.io/docs/context.html) có thể hữu ích. – wollnyst