【发布时间】:2021-03-19 15:26:38
【问题描述】:
最近我正在将我的项目从 webpack 3 (v. 3.3.0) 升级到 webpack 4 (v. 4.44.2)。编译和构建工作完美,但结果显示屏幕上什么也没有。
在比较了 webpack 3 和 webpack 4 的两个项目之间传递给 RouterContext 的参数后,我将根本原因缩小到动态导入的组件。
以下脚本是我如何使用 react-router 3 (v. 3.0.5) getComponent 导入组件,在升级到 webpack 4 之前可以使用:
const loadRoute = callback => module => callback(null, module);
const forceToReload = (err) => {
Logger.error(err);
window.location.reload();
};
export default (loadRoute, forceToReload) => (
<Route name="Subscribe" path={appUtils.getRoutePath('/sample')}
getComponent={(location, callback) => import('./index.jsx').then(loadRoute(callback)).catch(forceToReload)}/>
);
幸运的是,经过几天的反复试验,我终于让我的项目正确渲染了。
在 webpack 4 版本中,我必须将 .default 附加到 loadRoute 中的模块,如下所示:
const loadRoute = callback => module => callback(null, module.default);
问题是
即使问题解决了,我仍然想知道是否有人可以解释一下何时添加.default。
webpack 4 在动态导入时编译是否不同?有什么想法吗?
【问题讨论】:
-
感谢您提出这个问题。我需要从 require.ensure 转换为 import() 因为 webpack 5 把它踢掉了。至于默认,这可能是一个反应路由器的事情。获取组件时,我总是将其添加到我的 require.ensure 语句中。
-
其实来自 webpack 文档:我们需要 default 的原因是,从 webpack 4 开始,在导入 CommonJS 模块时,import 将不再解析为 module.exports 的值,而是创建一个CommonJS 模块的人工命名空间对象。并参考这篇文章:medium.com/webpack/webpack-4-import-and-commonjs-d619d626b655 我看到你发现了。
标签: javascript reactjs webpack react-router