26

当我看到这个声明时,我正在查看标签的WHATWG规范asyncdefer属性:<script>

经典脚本可以指定deferasync; 模块脚本可以指定async.

我浏览了经典模块脚本的 WHATWG 定义,但并没有真正弄清楚。简单来说,JavaScript 中的经典脚本和模块脚本有什么区别?

4

2 回答 2

31

以下是我从各种文章中注意到的差异。如果您想了解更多详细信息,请阅读网络上的完整文章:

  1. 模块是单例的。它们只会被加载和执行一次。
  2. 模块可以使用导入和导出。
  3. 模块总是以严格模式执行。
  4. 除非显式导出,否则所有对象(类、常量、函数、let 或 var)都是私有的。
  5. “this”的值在外部范围(不是窗口)未定义。
  6. 模块是异步加载的。
  7. 使用 CORS 加载模块。请参阅访问控制允许来源:*。
  8. 默认情况下,模块不发送 cookie 和身份验证信息。请参阅 crossorigin="use-credentials"。
  9. 导入在加载时静态解析,而不是在运行时动态解析。
  10. 不允许使用 html 注释。
于 2018-12-17T18:59:21.843 回答
12

经典脚本就是您所知道的标准 JavaScript 脚本。模块脚本是包含ES6 模块的脚本,即它使用(或:可以使用)importexport声明。

§8.1.3.8 与 JavaScript 模块系统集成

JavaScript 规范定义了模块的语法,以及它们处理模型的一些与主机无关的部分。该规范定义了其余的处理模型:如何通过属性设置为 的script元素引导模块系统,以及如何获取、解析和执行模块。 [JAVASCRIPT]type"module"

注意:尽管 JavaScript 规范是用“脚本”与“模块”来表述的,但总的来说,该规范是用经典脚本模块脚本来表述的,因为它们都使用了 script 元素。

也看看https://blog.whatwg.org/js-modules

于 2016-09-23T04:51:09.923 回答