使用Webpack和Babel的ES6动态导入

马丁·詹姆斯

我一直在将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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用webpack和babel-loader导入ES6模块

使用webpack,ES6和Babel进行调试

使用ES6语法和动态路径导入模块

Webpack,Babel:ES6导入与Fabric.js的需求

React,使用Browserify,babel和gulp进行ES6编译,发布导入组件

使用es6和babel-node从根目录导入节点模块

将本地npm库与es6,babel和webpack一起使用

使用 Babel 和 Webpack 转译 ES6 的方法 ParentNode.append() 出错

使用ES6和let / const进行导出/导入和Karma / webpack-顶部导出

使用ES6 / Babel语法的systemJS相对动态加载

如何使用React + ES6 + webpack导入和导出组件?

使用webpack,ES6,ReactJS导入JavaScript文件和调用函数

在webpack.config中使用ES6导入和导出默认值

使用webpack-stream和gulp不会转换ES6导入

ES6:条件和动态导入语句

webpack / babel / es6导入问题-(0,_whatwgFetch2.default)不是函数

使用ES6语法动态导入JavaScript模块?

在node.js(ES6 / Babel)中导入X和导入* as X之间的区别?

使用ES6 import + export关键字和Babel导入/导出Express路由器

如何将Webpack babel-loader和es6与worker-loader一起使用?

意外的令牌导入(webpack es6)

Babel ES6导入错误,SyntaxError:意外的令牌导入

Babel、Webpack、ES6、React:导入模块然后将导入的模块作为道具传递给孩子

ES6上的动态导入

如何使用webpack和babel导入highcharts

我怎样才能以一种简单的方式在 webpack 中使用非 CommonJS 和 es6 导入?

ES6 使用导出和导入出错

如何使用Babel在Rollup中设置Ramda(以使用ES6导入)

Webpack Babel 6 ES6装饰器