【发布时间】:2016-09-10 09:16:24
【问题描述】:
我正在使用 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 在触发事件以运行上述代码之前不会被下载。之后,它就被完美地加载和执行了。
但是当我打包项目进行生产时,它停止工作。它给出了以下错误(当我触发下载事件时在浏览器中)甚至没有尝试发送请求:
未捕获的错误:找不到模块“./Module”。
此外,当我动态组合路径时(如上面的代码),构建过程会发出以下警告:
./src/app/app.js 中的警告 关键依赖: 74:34-47 依赖的请求是一个表达式
为生产配置 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负责处理。静态路径在您的情况下可以正常工作 -
@RaiyanMohammed 很抱歉,但我不关注!在上面的代码中,我动态地制作路径,因为在现实生活中我就是这样。在编写代码时,模块的路径是未知的。只有在运行时才会在变量中指定路径。
-
这就是问题所在:与 node-require 相比,webpack 是静态的。它在构建时运行一次。因此,webpack 无法评估动态
requires。你到底有什么结构?也许定义一个自己的context 可能会有所帮助。 -
@wollnyst 我已经测试了您的建议并且它有效,但问题是它不会拆分代码!上下文是否应该拆分代码?您是否有关于如何动态加载拆分代码的工作示例?文档有点含糊!
-
看看你的 webpack.config.js 可能是个好主意。当我开始使用 webpack 时,我已经看到了这一点,但是可能不相关,看看输出配置选项,它有一个 publicPath 设置,它告诉 webpack 查找文件的路径。来自documentation, output.publicPath:此选项指定在浏览器中引用时输出目录的公共 URL。