Webpack 4动态和按需导入



使用webpack是否可以按需导入并使用动态名称?例如,如果我有这样一段代码

./src/index.js

function start() {
const files = ['./foo.js'];
const s = import(files[0]);
console.log(new s());
}
document.getElementById('button').onclick = start;

./src/foo.js

export class Foo {}

index.html

<body>
<button id="button">Click</button>
<script type="text/javascript" src="index.js"></script>
<script type="text/javascript" src="foo.js"></script>
</body>

webpack.config.js

module.exports = {
entry: {
index: './src/index.js',
foo: './src/foo.js'
}
}

当我运行这个代码时,在我点击我的按钮后,我有以下错误

未捕获(承诺中(错误:找不到模块"/foo.jsat eval(eval at./src lazy recursive(index.js:96(,:5:11((匿名(@src惰性名称空间对象?4252:5Promise.then(异步(启动@index.js?b635:4

我也尝试过const files = ['./src/foo.js'];,但相同。

问题是,有可能用webpack 4实现这种动态按需导入吗?

它被称为"带动态上下文的代码拆分"。导入将与webpack一起工作的方式是,这些按需需要的块将由webpack按需"自动加载",只有在需要时。

关键是,正如@Batista所指出的,这个导入的结果是一个promise,它被包装到一个默认属性中,所以你可以:

async function start() {
const files = ['./foo.js'];
const s = await import(files[0]);
console.log(new s.default());
}

通过这样做,您不需要将其添加到入口点,唯一需要注意的是,is不会生成具有"固定"名称的捆绑包,要生成名称,您可以添加:

...
import(/* webpackChunkName: "mychunk" */ files[0])
...

你不需要手动将它们添加到你的webpack中,它们将由webpack加载。

解决方案是使用带有backtick(模板文本语法(的import(`${files[0}`)。即使files[0]是一个字符串,使用import(files[0])也不起作用。

不知道为什么,如果有人作为答案?

您是否尝试过使用promise?

import("module/foo").then(foo => console.log(foo.default))

最新更新