【问题标题】:How to asynchronously require modules in React application using webpack?如何使用 webpack 在 React 应用程序中异步请求模块?
【发布时间】:2017-01-06 03:06:05
【问题描述】:

在 React 应用程序中,我想只为某个路由/路径导入一个名为 flowtime.js 的库,然后执行更多代码。这个库有一个名为 Brav1toolbox 的依赖项。在 npm 上都没有。

我的策略是在组件的componentDidMount方法中使用webpack的require。这是我的尝试:

componentDidMount() {
  require.ensure([ 'local/relative/path/to/lib/brav1toolbox.js'], function(require) {
    var f = require('local/relative/path/to/other/lib/Flowtime.js/js/flowtime.js');
  });
}

这会导致以下错误。

Uncaught (in promise) ReferenceError: Brav1Toolbox is not defined

所以 Flowtime 正在加载,但无法找到 Brav1Toolbox。

我对 React 或 webpack 都没有经验,所以我可能有一个误解。我正在尝试使用 webpack 仅在我的用户访问需要这些库的路径时才加载这些库。 This is the webpack guide 我用作参考。

感谢您的帮助。

【问题讨论】:

  • 您是否安装了flowtime.js,或者您的本地有这个库? webpack 无法加载远程 js 文件。
  • 我编辑了我的问题以表明这些库是本地的。事实上,Flowtime.js 正在运行,是抱怨缺少 Brav1toolbox 的那个。

标签: javascript node.js reactjs webpack


【解决方案1】:

这取决于您的 webpack 版本,但您在代码拆分/路由分块方面走在了正确的轨道上。

对于 webpack v2,我建议查看 Webpack documentation

使用 webpack 2,您可以在需要的反应容器/组件中请求库,然后根据路径动态加载代码。一个如何通过两个示例路由使用 react-router 执行此操作的示例,例如“/home”和“/about”,如下:

<Route path="/home" getComponent={(nextState, callback) => {
    require.ensure([], require => {
        callback(null, require("./containers/home"));
    }, "Home");
}} />
<Route path="/about" getComponent={(nextState, callback) => {
    require.ensure([], require => {
        callback(null, require("./containers/about"));
    }, "About");
}} />

【讨论】:

  • Webpack 2 增加了对 import() 的支持,它返回一个解析为模块的 Promise。所以你可以这样做:import('jquery').then($ =&gt; { ... }) 例如
猜你喜欢
  • 2012-06-19
  • 2016-10-25
  • 2019-05-12
  • 2016-12-20
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多