我正在读一本关于学习JavaScript的书,里面有这样几段:
...1997 年中,微软和 Netscape 联手 欧洲计算机制造商协会,
发布了第一个 名为或正式形式的标准版本ECMAScript
...ECMA-262
正如我在本书和类似内容中发现的那样,JavaScript 和 ECMAScript 是相同的,只是名称不同。
另一方面,在 Dreamweaver、bracket 和其他一些编辑器中,有一些像这样的自动完成建议:
当我想向我的页面添加脚本标签时。
我想知道
ECMAScript
和Javascript
之间是否有区别以及何时应该使用text/javascript
或text/ecmascript
?
TL;DR 省略
type
属性或使用 type="module"
。服务器应使用内容类型 text/javascript
。
ECMAScript 是 ECMA International 标准化的语言规范,称为 ECMA-262 和 ISO/IEC 16262。 JavaScript 是实现该规范的编程语言。 ECMAScript 存在多个版本。
除了 ECMAScript 之外,常见的 JavaScript 实现通常会添加更多功能,这些功能可能由其他机构(如 W3C)标准化,或者可能是特定实现的专有(也称为“浏览器特定”)功能。所以你可以说,ECMAScript 代表了 JavaScript 的一个子集。
JavaScript 代码的 MIME 类型在 RFC 4329 文档中定义,其中指出
text/javascript
和 text/ecmascript
均已过时,应替换为 application/javascript
和 application/ecmascript
:
众所周知,对于此类内容使用“文本”顶级类型 有问题。 因此,本文档定义了 text/javascript 和 text/ ecmascript 但将它们标记为“过时”。
RFC 为
application/ecmascript
定义了比 application/javascript
更严格的处理规则,但这指的是 MIME 类型参数和字符编码的处理,而不是代码本身的解释:
在引用的案例中,text/javascript、text/ecmascript 和 application/javascript 类型的实现应该以及 application/ecmascript 类型的实现必须实现本节中定义的要求:[...]
对于 application/ecmascript 媒体类型,实现不得处理标有“version”参数的内容,就好像没有指定此类参数一样; [...]
对于媒体类型 text/javascript、text/ecmascript 和 application/javascript,建议使用以下错误处理行为;对于媒体类型 application/ecmascript,则需要以下错误处理行为。
但是,除了 RFC 之外,还有 W3C 的 HTML5 标准:较旧版本 表示空
type
属性的默认值为 application/javascript
,但较新版本 没有不再提及任何特定的 MIME 类型。相反, type
属性现在似乎用于定义何时以及如何解释脚本:
省略该属性,将其设置为空字符串,或将其设置为JavaScript MIME类型本质匹配,意味着该脚本是经典脚本,将根据JavaScript Script顶级产生来解释。
将属性设置为“module”的 ASCII 不区分大小写的匹配意味着该脚本是 JavaScript 模块脚本,将根据 JavaScript 模块顶级生成进行解释。
仍然只允许与 JavaScript 无关的 MIME 类型:
将该属性设置为任何其他值意味着该脚本是一个数据块[...]作者必须使用与 JavaScript MIME 类型本质匹配的有效 MIME 类型字符串来表示数据块。
有趣的是,新版本的 HTML5 标准提到服务器应该发送具有内容类型的 JavaScript 代码
text/javascript
:
根据 ECMAScript 媒体类型更新,服务器应使用 text/javascript 作为 JavaScript 资源。服务器不应将其他 JavaScript MIME 类型用于 JavaScript 资源,并且不得使用非 JavaScript MIME 类型。
一般来说,对于经典脚本,我会省略
type
属性或使用 type="text/javascript"
(如果您必须支持旧版浏览器)。 JavaScript 模块需要 type="module"
,因此 MIME 类型的问题在那里不适用。
当前版本的 HTML 标准(最后更新时间为 2019 年 7 月 16 日)表示,如果省略,使用
type
标签的 <script>
属性指定的语言类型将回退到 text/javascript
。
该规范还指定:
服务器应该使用 text/javascript 作为 JavaScript 资源。服务器不应将其他 JavaScript MIME 类型 用于 JavaScript 资源,并且不得使用非 JavaScript MIME 类型。