Appearance
es模块化
import()
语法通常称为动态导入,是一种类似函数的表达式,允许将 ECMAScript 模块异步动态加载到潜在的非模块环境中。
与声明式的对应项不同,动态导入仅在需要时才进行评估,并且允许更大的语法灵活性。
句法
js
import(moduleName)
调用import()是一种与函数调用非常相似的语法,但import它本身是一个关键字,而不是一个函数。你不能像这样给它起别名const myImport = import,这会抛出一个SyntaxError.
import(moduleName)
调用import()是一种与函数调用非常相似的语法,但import它本身是一个关键字,而不是一个函数。你不能像这样给它起别名const myImport = import,这会抛出一个SyntaxError.
参数 moduleName 要从中导入的模块。说明符的计算是由主机指定的,但始终遵循与静态导入声明相同的算法。
返回值 返回一个promise,该promise fulfill状态的result,是你所导入模块对象(一个模块命名空间对象,包含该模块所有导出内容)。
js
import('./m.js').then(res => {
console.log(res) // 模块命名空间对象Module
})
import('./m.js').then(res => {
console.log(res) // 模块命名空间对象Module
})
从不同步的评估import()会引发错误。moduleName被强制转换为 string,如果强制抛出异常,则 Promise 将被拒绝并抛出错误。
描述 导入声明语法 ( import something from "somewhere") 是静态的,并且始终会导致导入的模块在加载时被评估。动态导入允许人们规避导入声明的语法刚性,并有条件或按需加载模块。以下是您可能需要使用动态导入的一些原因:
静态导入会显着减慢代码的加载速度,并且您不太可能需要正在导入的代码,或者稍后才需要它。 静态导入会显着增加程序的内存使用量,并且您需要导入的代码的可能性很低。 当您导入的模块在加载时不存在时。 当需要动态构造导入说明符字符串时。(静态导入仅支持静态说明符。) 当导入的模块有副作用时,除非某些条件成立,否则您不希望出现这些副作用。(建议不要在模块中产生任何副作用,但有时您无法在模块依赖项中控制这一点。) 当您处于非模块环境(例如,eval或脚本文件)中时。 仅在必要时使用动态导入。静态形式更适合加载初始依赖项,并且可以更容易地从静态分析工具和树摇动中受益。
如果您的文件不是作为模块运行(如果在 HTML 文件中引用它,则脚本标记必须具有type="module"),您将无法使用静态导入声明,但异步动态导入语法将始终可用,允许您将模块导入到非模块环境中。
动态模块导入不允许在所有执行上下文中使用。例如,import()可以在主线程、共享工作线程或专用工作线程中使用,但如果在Service Worker或Worklet中调用,则会抛出异常。