Javascript whatwg和#x27;s装载机规格、动态导入建议和<;脚本类型=';模块'>;?

Javascript whatwg和#x27;s装载机规格、动态导入建议和<;脚本类型=';模块'>;?,javascript,ecmascript-6,es6-modules,es6-module-loader,Javascript,Ecmascript 6,Es6 Modules,Es6 Module Loader,以上三者有何关联?到目前为止,我的理解是:ES6规范定义了ES6模块的语法,但没有指定如何加载这些模块。在浏览器环境中使用它们的唯一方法是通过模块脚本。还有一个动态导入操作符建议,允许您有条件地从脚本和模块脚本加载模块。那么,加载程序规范是否说明浏览器如何在后台加载模块脚本?或者它说的是import()操作符在不同环境中的行为?或者它是另外的东西,与上述两个无关?如果加载程序规范说明了import()在不同环境中的行为,那么这与浏览器加载使用的模块的方式有何关系?根据模块加载是由动态导入操作员还

以上三者有何关联?到目前为止,我的理解是:
ES6规范
定义了
ES6模块
的语法,但没有指定如何加载这些模块。在浏览器环境中使用它们的唯一方法是通过模块脚本。还有一个动态导入操作符建议,允许您有条件地从脚本和模块脚本加载模块。那么,加载程序规范是否说明浏览器如何在后台加载模块脚本?或者它说的是
import()
操作符在不同环境中的行为?或者它是另外的东西,与上述两个无关?如果加载程序规范说明了
import()
在不同环境中的行为,那么这与浏览器加载
使用的模块的方式有何关系?根据模块加载是由动态导入操作员还是由
操作,是否有两个关于模块加载工作方式的规范?

使用
类型=模块

这完全不是动态的
import()
相关:

浏览器将内联或外部脚本视为ECMAScript 模块


从“/utils.mjs”导入{addTextToBody};
addTextToBody('模块非常酷');
参考:

动态导入()

使用静态导入,需要下载整个模块图 并在主代码运行之前执行。有时候,你不想 预先加载模块,但仅在需要时按需加载 -例如,当用户单击链接或按钮时。这改善了 初始加载时间性能。动态导入()使


(异步()=>{
常量moduleSpecifier='./lib.mjs';
const{repeat,shout}=等待导入(moduleSpecifier);
重复“你好”;
// → '你好,你好
shout(“动态导入操作”);
// → '动态导入正在运行
})();

参考:你基本上是正确的。ECMAScript标准没有指定如何解析模块名称:由执行环境来定义。这是第一次明确规定在;后来的规范包含类似的语言

在浏览器中,
import
语句中的模块引用将被视为相对URI并直接加载,假设它们以
/
/
开头(这是为了保持前向兼容性)。此行为在()中指定

标记中包含(或引用)的脚本作为模块进行解析,并在解析整个文档标记时执行。与正常的
没有太大区别,只是
导入
导出
语句现在可用<代码>
也在HTML规范()中描述

import()
伪函数返回解析为指定为其操作数的模块的承诺。模块名称的解析方式与
import
语句中的解析方式完全相同。在撰写本文时,它尚未标准化,但有望成为ECMA-262第11版(ECMAScript 2020)的一部分。您可以阅读或查看

这是一个废弃的规范,也涵盖了动态导入,还包含了更高级的功能,如即时翻译外国脚本或为“裸”模块名称赋予含义(如上所述,这些模块名称目前不可用)。它只是作为一个不完整的规范存在,据我所知,它从未真正实现过。

可能还想提及
<script type="module">
  import {addTextToBody} from './utils.mjs';

  addTextToBody('Modules are pretty cool.');
</script>
<script type="module">
  (async () => {
    const moduleSpecifier = './lib.mjs';
    const {repeat, shout} = await import(moduleSpecifier);
    repeat('hello');
    // → 'hello hello'
    shout('Dynamic import in action');
    // → 'DYNAMIC IMPORT IN ACTION!'
  })();
</script>