使用 Webpack 导入时出现意外未定义
2019-06-29
3676
我遇到了一个以前从未遇到过的问题:我正在使用 Webpack + Babel 7 编译一个小型的基本入门浏览器 Web 应用程序(使用 React)。 我有三个不同的文件:
-
withAuth.js
Auth 高阶组件 -
NavBar.js
NavBar 组件 -
Login.js
登录表单
如果我在 NavBar 中导入
withAuth
HOC,则一切正常,但如果我在 Login.js 文件中导入
withAuth
组件,它会返回
undefined
/** withAuth.js */
console.log('withAuth Loaded');
const withAuth = Child => ChildProps => (
<AuthContext.Consumer>
{ authClient => <Child {...ChildProps} authClient={authClient} }
</AuthContext.Consumer>
)
export { withAuth };
/** NavBar.js */
import { withAuth } from 'HOC/Auth';
console.log('NavBar Loaded', withAuth); // <- My HOC
const NavBarComponent = (authClient) => { /* ... My Code ... */ }
const NavBar = withAuth(NavBarComponent);
export default NavBar;
/** Login.js */
import { withAuth } from 'HOC/Auth';
console.log('Login Loaded', withAuth); // <- undefined ??
const LoginFormComponent = (authClient) => { /* ... My Code ... */ }
const LoginForm = withAuth(LoginFormComponent);
// /|\
// |
// Will produce an Error, withAuth is Undefined
这是我的 Webpack 配置:
/** webpack.config.js */
module.exports = {
entry: { core: 'index.js' },
resolve: {
alias: {
HOC: './path/to/hoc/folder'
}
},
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all'
}
},
plugins: [ /* Various Plugin */ ],
module: {
rules: [ /* My Rules */ ]
}
}
有人知道为什么我的 HOC
未定义
?
编辑: 我已将控制台日志放入树文件中。结果是:
'Login Loaded' - undefined
'withAuth Loaded'
'NavBar Loaded' - function() { }
编辑 2: 这是文件结构:
app/
|-high-order-component/
| |-auth/
| |-withAuth.js
|
|-layout-component/
| |-navbar/
| |-index.js
|
|-pages/
|-auth/
|-login.js
1个回答
已解决
经过一下午的大量测试和研究,我找到了问题的解决方案。正如我在问题中所说,我的项目较大,我只部分编写了其结构,因为我认为问题出在这三个文件中。
实际上,问题是循环依赖问题,而不是 Webpack 配置问题。 在我的项目中,我有一个名为“Route”的模块,它存储所有路径和路径的所有组件,因此我可以使用数组映射函数构建 React Router。该模块有一个函数,允许我通过路径进行路由,并且可以将路径字符串返回给我。 我的问题是由于这个模块在项目中经常被调用,这造成了循环依赖。
Webpack 在编译期间不会显示循环依赖,但我发现添加一个名为 CircualDependencyPlugin 的插件很有用。当发现循环依赖时,此插件将中断 Webpack 编译。
将
Route
模块拆分为两个文件解决了我的问题。
Marco Cavanna
2019-06-29