在提供JavaScript文件时,是使用application/javascript还是application/x-javascript更好?

107

整个问题可以概括为标题。为了补充一些背景信息,我不是在问根据规格说明哪种是最好的,而是根据如今部署的浏览器混合使用情况下哪种是最好的。

以下是一些数据点:

  • Google 在其首页使用 text/javascript 来使用 JS。
  • Google 在 Google Docs 上使用 text/javascript
  • Google 使用 application/x-javascript 来提供带有他们 AJAX 库服务的 JavaScript 文件。Ajax libraries service
  • Yahoo 使用 application/x-javascript 来提供他们的 JS。
  • Yahoo 在其首页使用 application/x-javascript 来使用 JS。

4
有趣。在你的例子中,你提供了第三种选择......根据Tim的说法,两个大玩家都是错误的(关于标准),这可能只意味着浏览器是宽容的(这里没有什么大新闻),并且可能无关紧要。 - PhiLho
1
可能是重复问题: Javascript MIME类型 - Bergi
这个问题的答案在这里和其他地方都是含糊不清的。程序员需要交叉手指,希望一切顺利。 - David Spector
6个回答

132
根据2021年2月22日的IETF(互联网工程任务组)ECMAScript Media Types UpdatesRFC-4329已过时。
因此:
  • text/javascript是推荐标准(由IETF和MDN都推荐)
  • application/x-javascript在决定转移时是实验性的...
  • application/javascript已经过时
注意:请保留原文中的HTML标记。

3
几个月前的问题说的正好相反。某人错了:)“Kelly是正确的,浏览器倾向于信任响应头中发送的MIME类型,而不是脚本标记的类型属性。” - Marco
6
哦不!那些庞大、僵化、缓慢的机构一定是正确的!规范一定是错的!啊。即使其中一个曾经雇佣过我,我仍将继续相信规范和我的个人经验而非大型(缓慢)公司。 - Quentin
1
哦,有人忘了告诉W3C text/javascript已经过时了。在HTML 5中似乎是默认值。 ::挠头:: 如果我粗略阅读这一部分的话,用户代理应该只根据type属性进行操作,因此忽略Content-type将是正确的行为。 - big_m
1
@big_m — 这是因为许多浏览器不识别 application/javascript,因此指定它会导致它们忽略脚本。用户代理不应该忽略 Content-Type。type 属性告诉它们可以期望什么。如果他们不支持它,就不应该请求它。如果服务器说它是其他类型,他们应该按照服务器的说法而不是 HTML 的说法(至少根据 HTTP 规范,你可能在看不同的规范,因为你没有提供任何链接)。 - Quentin
1
@Quentin,我指的是我链接的script元素上的HTML 5部分。我的理解与你描述的不同;它似乎非常重视type属性,并且没有提到检查Content-Type,除了确定字符编码之外。我同意,用户代理似乎应该验证Content-Type是否与预期相匹配,但我在HTML规范中没有找到任何要求或建议这样做的内容。 - big_m
显示剩余4条评论

14
这是针对此问题的2020年答案。
根据HTML标准text/javascript是正确的JavaScript MIME类型:

服务器应使用text/javascript来提供JavaScript资源。服务器不应使用其他JavaScript MIME类型来提供JavaScript资源,也不得使用非JavaScript MIME类型。

并且

[...] 在本规范中用于引用JavaScript的MIME类型是text/javascript,因为这是最常用的类型,尽管根据RFC 4329它已经被正式废弃。

正在进行工作以在IETF层面上反映这一现实:https://datatracker.ietf.org/doc/draft-ietf-dispatch-javascript-mjs/ 任何声称"text/javascript已过时"的说法都是基于RFC 4329,而HTML标准和上述即将发布的IETF草案(即即将发布的RFC)明确纠正了这一点。

12

在大多数情况下,服务器发送的MIME类型并没有实际影响。我建议使用application/javascript,这也是一份RFC推荐的。


8
曾经使用的是language="javacript",然后改为type="text/javascript",现在是type="application/javacript"。这变得很蠢了。一些旧的浏览器不认识新的application/javascript,但仍能识别旧的text/javascript。我打算继续使用这个,否则我将浪费数小时的时间来更改每个实例中的text/javascriptapplication/javascript
有一天可能会反过来。最新的浏览器可能会拒绝旧技术,以符合严格的标准。
但直到网站上的访问者开始抱怨“自从升级浏览器以来,你的网站中有50%消失了”,我就没有动力去更改我的网站代码。

非常有预见性! - Daniel X Moore

7
如果你在网页中使用application/javascript来作为js的话,IE7和IE8将无法运行你的脚本!你可以责怪微软,但如果你希望大多数人能够访问你的页面,请使用text/javascript。

3
当你说“application/javascript”无法使用时,是指将其设置为HTTP响应的内容类型还是作为脚本标签的“type”属性?原问题是关于HTTP响应内容类型的。根据其他答案,似乎只有脚本标签上“type”属性的值在IE中才会有所不同。 - Jesse Hallett

4

过去使用的是"text/javascript",但这已经过时了(请参见IANA列表),现在应该使用"application/javascript"(请参见另一个IANA列表)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接