Javascript中的经典脚本v/s模块脚本

nik*_*ohn 12 javascript module es6-modules

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

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

我经历了经典模块脚本的WHATWG定义,但并没有真正清晰.有人可以向我解释我是5,Javascript中经典模块脚本之间的区别吗?

cqu*_*zel 7

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

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


Ber*_*rgi 6

一个经典的剧本只是一个标准的JavaScript脚本,你也知道它。甲模块脚本是一个包含一个ES6模块,即它使用(或:可以使用)importexport声明。

从第8.1.3.8节开始,与JavaScript模块系统集成

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

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

还可以看看https://blog.whatwg.org/js-modules

  • 这显然是正确的,但它提供的信息太少,我仍然感到不满意。OP提供的*经典脚本*链接是无用的文档(这可能是混淆的原因)。这个答案“简单地”给出了基本的机制。但我的问题——也可能是其他人的——是如何使用它?例如,在其他语言中,模块是您(可以)导入的任何东西,而脚本是您(可以)执行的任何东西。但这个定义通常有点“模糊”。在新的 JS 中,他们似乎想要更严格。但最佳实践是什么? (7认同)