现在ES2015动态import()被广泛支持,那么ES2015静态import有什么优势呢?

Now that ES2015 dynamic import() is widely supported, what are the advantages of ES2015 static import?

我越来越多地使用 ES2015 模块

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

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

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

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

但这是否也意味着像这样的静态 import 语句:

现在实际上(虽然不是正式)弃用了?

如果不是——我的猜测是它们没有被有效弃用——静态[=13]的具体技术优势是什么=] 动态语句 import()?

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


进一步阅读:


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

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

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

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

使用同步代码比使用异步代码更容易。虽然您 可以 在任何地方使用动态导入,但这需要在任何地方放置 .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';

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

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