【问题标题】:Dynamic imports in ES6 with runtime variables带有运行时变量的 ES6 中的动态导入
【发布时间】:2018-06-05 21:12:28
【问题描述】:

最近偶然发现了 dynamic import proposal 和这个 Youtube video 。将它用于 React 中组件的按需导入是一个好主意。

import 将字符串文字作为运行时变量传递时,我无法“解析”路径。

例如:

<div>
  <button onClick={this._fetchComp.bind(this, "../component/Counter")}>Get Async Comp</button>
</div>

尝试了 _fetchComp 的多个选项,但传递参数似乎不起作用。尝试的不同选项的细分。

  1. 模板字符串 不起作用:点击时出现以下错误

错误:找不到模块“../components/Counter”。在 webpackAsyncContext (^.*$:53)

代码

    _fetchComp(res) {
    import(`${res}`).then(() => {
        console.log("Loaded")
    },(err)=>{
        console.log("Error",err)
    })}
  1. Variabes 不起作用:在 webpack 构建过程中出现错误,时间为 55:12-23

关键依赖:依赖的请求是一个表达式

**Code**

    _fetchComp(res) {
    import(res).then(() => {
        console.log("Loaded")
    },(err)=>{
        console.log("Error",err)
    })}
  1. String literal Works:只传递纯字符串文字。单击时,我可以在开发工具网络选项卡中看到正在下载的块

    代码

    _fetchComp(res) {
    import("../components/Counter").then(() => {
        console.log("Loaded")
    },(err)=>{
        console.log("Error",err)
    })}
    

按照规范,

import() 接受任意字符串(使用运行时确定的模板 此处显示的字符串),而不仅仅是静态字符串文字。

所以我希望字符串文字能起到作用,但事实并非如此。

我在flow issue tracker 上遇到了类似的问题。但提议的解决方案再次提倡使用字符串文字。

我会给大家留下一个CodeSandbox 链接。

【问题讨论】:

  • 嗯,这只是一个提议(绝对不是 ES6!),是什么让你认为 webpack 已经支持它了?此外,它还需要支持动态模块加载的客户端设置。
  • @Bergi :“webpack 已经支持它了” - 啊担心这个! :( 。我在本地使用 create-react-app 进行了试验,这不是一个很好的客户端设置来破解动态导入吗?

标签: ecmascript-6 dynamic-import


【解决方案1】:

规范中import() 的规则与 Webpack 本身能够处理 import() 的规则不同。为了让 Webpack 处理导入,它至少需要能够大致猜出 import() 所引用的内容。

这就是您的 import("../components/Counter") 示例有效的原因,因为 Webpack 可以 100% 确定需要加载的内容。

对于你的用例,你可以这样做

_fetchComp(res) {
  import(`../components/${res}`).then(() => {
    console.log("Loaded")
  }, (err)=>{
    console.log("Error", err)
  })
}

this._fetchComp.bind(this, "Counter")

现在 Webpack 知道路径以../components/ 开头,它可以自动捆绑每个 组件,然后加载您需要的组件。这里的缺点是因为它不知道您正在加载哪个组件,所以它必须全部加载它们并且不能保证它们都实际被使用。这就是动态导入的权衡。

【讨论】:

  • 我注意到,如果使用import(`../components/${res}`),webpack 还会以半随机顺序捆绑 css 文件,导致一团糟。
  • @Ciantic 然后考虑做import(`../components/${res}.js`) 这样Webpack 知道你只会加载JS 文件。
猜你喜欢
  • 2016-11-10
  • 2019-09-21
  • 2018-06-03
  • 1970-01-01
  • 2021-11-16
  • 2019-06-05
  • 2018-06-18
  • 2015-05-23
相关资源
最近更新 更多