我一直在将Webpack用于我的ES6 JS项目,并且一直很好,直到开始使用动态导入为止。
我的工作原理(router.js):
import { navigo } from "Navigo"; // router
import { clients } from "Controllers/clients.js";
const navigo = new Navigo();
navigo_router.on({
'/clients': () => {
clients.init();
}
});
但是,我添加的页面/路线越多,导入到模块顶部的内容就越多。这是一个相对较大的应用程序,我要添加很多页面/路由,因此我需要动态加载它们以减小初始页面加载的大小。
因此,按照Webpack的动态导入文档,我尝试了以下方法,仅在调用相对路径时才加载控制器模块:
import { navigo } from "Navigo"; // router
const navigo = new Navigo();
navigo_router.on({
'/clients': () => {
import("Controllers/clients.js").then((clients) => {
clients.init();
});
}
});
但是将其保存在我的编辑器中会导致Babel翻译错误;语法错误:“导入”和“导出”可能仅出现在顶层,而clients.init()
在浏览器中进行测试时不会被调用。
经过一番阅读后,我发现我需要一个Babel插件才能将动态转换import()
为require.ensure
。因此,我使用以下命令安装了插件:
npm install babel-plugin-dynamic-import-webpack --save-dev
并在我的babel.rc
文件中声明了插件
{ "plugins": ["dynamic-import-webpack"] }
安装插件后,转码错误消失,检查我的转码后,我发现dynamic import()
s实际上已更改require.ensure
为预期的值。但是现在测试时出现以下浏览器错误:
Error: Loading chunk 0 failed.
Stack trace:
u@https://<mydomain.com>/js/app.bundle.js:1:871
SyntaxError: expected expression, got '<' 0.app.bundle.js:1
Error: Loading chunk 0 failed.
我不明白为什么它0.app.bundle.js
使用0.
前缀进行引用,因此我检查了output / dist文件夹,现在在其中有一个新文件,名为0.app.bundle.js
:
0.app.bundle.js 1,962bytes
app.bundle.js 110,656bytes
我想象这个新的捆绑文件是动态导入的模块clients.js
。
我仅向该一条路线添加了动态导入,并保留了所有其他路线。因此,在测试期间,我可以查看所有路由,但一条/clients
路由现在会抛出上述错误。
我现在完全迷失了,希望有人可以帮助我超越终点线。这个新文件是什么?0.app.bundle.js
我应该如何在应用程序中使用它/包括它?
我希望我已经对自己进行了足够清楚的解释,并期待收到任何答复。
我最终设法解决了自己的问题,因此我将分享我在答案中发现的内容。
未加载块文件的原因是因为Webpack在错误的目录中查找它。我在开发人员控制台的“网络”选项卡中注意到,块文件/模块是从我的根目录/
而不是在/js
其所属目录中调用的。
根据Webpack的文档,我在Webpack配置文件中添加了以下内容:
output: {
path: path.resolve(__dirname, 'dist/js'),
publicPath: "/js/", //<---------------- added this
filename: 'app.bundle.js'
},
据我了解,它path
是用于Webpack的静态模块和publicPath
动态模块。
这样可以正确地加载块,但是由于client.init()
没有被调用,我还有其他问题要处理,并产生以下错误:
TypeError: e.init is not a function
为了解决这个问题,我还必须更改:
import("Controllers/clients.js").then((clients) => {
clients.init();
});
至:
import("Controllers/clients.js").then(({clients}) => {
clients.init();
});
请注意箭头功能参数中的花括号。
我希望这对其他人有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句