【问题标题】:Now that ES2015 dynamic import() is widely supported, what are the advantages of ES2015 static import?既然 ES2015 动态 import() 被广泛支持,那么 ES2015 静态导入有哪些优势呢?
【发布时间】:2020-06-07 00:44:42
【问题描述】:

我越来越多地使用 ES2015 模块

通常情况下,我倾向于通过动态 import() 语法加载模块,使用以下模式的变体:

import(moduleURL.js).then(importedModule => myFunction(importedModule));

在 2020 年初,这似乎是一种没有陷阱的方法,因为 import() 现在拥有近乎通用的浏览器支持。

见:https://caniuse.com/#feat=es6-module-dynamic-import

但这是否也意味着静态import 语句如下:

  • import * as myModule from 'moduleURL.js'
  • import { myNamedExport } from 'moduleURL.js'
  • import myDefaultExport from 'moduleURL.js'

现在已被有效(尽管不是正式)弃用?

如果不是 - 我的猜测是它们没有被有效弃用 - 静态 import 语句相对于动态 import()具体技术优势是什么?

在什么情况下我最好使用前者而不是后者?


进一步阅读:


我为什么要问 ES2015 static import 的优点?

这不仅仅是无聊的好奇心。

我希望在我的工作流程中标准化某些流程,我对import() 非常满意。

但在我到处采用import() 之前,我想确保我不会错过静态import 语句提供的特定功能或优势,但它们更年轻、更动态的对应语句却没有。

【问题讨论】:

  • 哇。我不知道你能做到import(...)。我会争辩说,常规的进口方式import { something } from 'here'; 绝对不会去任何地方。 import(...) 似乎更多的是只需要一个特定的import 来做一个快速的事情。而import { something } from 'here'; 则暗示您将在代码中多次使用该导入。我个人认为我不会使用import(...),但知道它的存在很酷。

标签: javascript ecmascript-6 import es6-modules


【解决方案1】:

使用同步代码比使用异步代码更容易。虽然您可以在任何地方使用动态导入,但这需要在任何地方放置.thens(或顶级awaits,一旦支持)。仅此一项就会导致令人讨厌的语法噪音。当您必须同时导入多个模块时,情况会变得更糟:

Promise.all([
  import('foo'),
  import('bar')
])
  .then(([foo, bar]) => {
    // do stuff with foo and bar
  });

相比

import foo from 'foo';
import bar from 'bar';

更少的语法噪音意味着更少的错误表面积。

另请注意,虽然动态导入得到广泛支持,但并未得到普遍支持。一小部分用户还在旧版 Edge 上,或者 FF 56 或以下,或 Chrome 62 及以下,甚至 IE11。有些人可能认为最好提供适用于基本上所有人的脚本,而不仅仅是绝大多数人。 (这就是为什么 Babel 在今天仍然如此普遍使用的原因之一)

【讨论】:

  • 谢谢你,@CertainPerformance。所以总而言之(我不想在这里轻率)静态import 语句的优点是1)更简单的语法和2)稍微更广泛的浏览器支持。
  • 是的,就是这样。另一件事是能够静态分析需要立即导入的所有内容可以使某些工具更容易 - 例如,如果模块与 Webpack 或某些构建系统一起编译,而不是原生 ES6 模块。我对此没有太多经验,但我知道动态导入会使找出正确的配置变得更加困难。
  • 我一直在尝试更多,我肯定会遇到必须在任何地方添加异步标记(.then()asyncawait 等),所以我绝对接受你的开场白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多