何时使用 JavaScript MIME 类型 application/javascript 而不是 text/javascript?

IT技术 javascript mime-types
2021-01-31 18:53:38

基于jQuery code not working in IE 的问题text/javascript用于 HTML 文档以便 Internet Explorer 可以理解它。

但我想知道,您什么时候会使用application/javascript,更重要的是,为什么要使用它而不是text/javascript

4个回答

从理论上讲,根据RFC 4329application/javascript

它应该application的原因与类型是否可读或可执行无关。这是因为语言/类型本身规定了自定义字符集确定机制,而不仅仅是通用charset参数。的子类型text应该能够被代理转码为另一个字符集,更改字符集参数。这不适用于 JavaScript,因为:

一个。RFC 说用户代理应该对脚本进行 BOM 嗅探以确定类型(我不确定是否有任何浏览器确实这样做了);

浏览器使用其他信息——包括页面的编码和在某些浏览器中的script charset属性——来确定字符集。因此,任何试图对资源进行转码的代理都会破坏其用户。(当然,实际上无论如何都没有人使用转码代理,但这就是意图。)

因此,必须准确地保留文件的确切字节,这使其成为二进制application类型,而不是技术上基于字符的text

出于同样的原因,application/xml官方更喜欢text/xml:XML 有自己的带内字符集信号机制。每个人也忽略application了 XML。

text/javascript并且text/xml可能不是官方正确的东西,但是出于兼容性原因,今天每个人都使用什么,而为什么它们不是正确的东西的原因实际上完全不重要。

@sammy_winter 我到处都看到这样的警告,每次都感到畏缩。如果我允许用​​户上传内容,我可能会做更多的验证而不是“哦,是的,png 文件的名称匹配正则表达式,我可以相信”,不是吗?如果不正确的标题成为“安全问题”,那么问题可能在更深的地方,你不觉得吗?这与隐藏Server: nginx或 nginx 发送的任何内容相同好像任何能够找到漏洞的人都需要明确的标题才能知道您运行的服务器......
2021-03-25 18:53:38
WHATWG HTML 标准似乎不同意 IETF 关于应该使用哪种 MIME 类型html.spec.whatwg.org/#scriptingLanguages但在实践中并不重要,因为mimesniff.spec.whatwg.org/#javascript-mime-type
2021-03-28 18:53:38
最“兼容”的解决方案是在响应中根本不包含任何内容类型。RFC 指出,如果没有明确的内容类型,接收者将“通过上下文”解释它这对于所有浏览器来说都是正确的,从第一个浏览器开始
2021-04-03 18:53:38
小心application/javascriptIE 在兼容模式下运行IE=8好像内联脚本没有被正确评估。text/javascript在那里工作正常。
2021-04-09 18:53:38
@Pacerier - 我知道这个评论已经有 5 年了,但今天通常最好包括 mime 类型,特别是对于论坛类型的网站,出于安全原因。通过将恶意 javascript 文件作为图像上传,然后让浏览器解释并运行该脚本,让接收器解释类型使人容易受到攻击。最好让服务器为所有响应返回 MIME 类型,并使用标头X-Content-Type-Options: nosniff防止浏览器解释该类型。
2021-04-10 18:53:38

Javascript 的 MIME 类型的问题是多年来一直没有标准。现在我们已经将application/javascript作为官方 MIME 类型。

但实际上,MIME 类型根本无关紧要,因为浏览器可以自行确定类型。这就是 HTML5 规范声明type="text/javascript"不再需要 的原因。

application因为.js-Files 不是用户想要阅读的东西,而是应该被执行的东西。

这是官方的答案,但 IE 对此感到窒息。
2021-03-16 18:53:38
@Benn:也许是因为 IE 用户必须阅读所有 JS 文件,因为它们没有正确执行?至少,微软是诚实的;)
2021-03-19 18:53:38
从技术上讲,HTML 和 CSS 也由浏览器“执行”(解析)以将代码的结果生成为可视内容,而不是为了让用户“阅读”它,因此,这个答案没有多大意义。我想对于什么是“文本”和什么是“应用程序”存在很大的混淆。如果我可以在这个问题上投票,我会说 IETF 应该将“文本”内容视为textbinary或者application将所述类型的“目的”视为“图像”或“文档”等。
2021-03-24 18:53:38
喜欢你的评论,但不幸的是,那些不会阅读 JavaScript 的人仍然使用 IE,所以我们必须处理它:(。
2021-04-02 18:53:38
我不认为你是否想阅读它与为什么有任何关系。它与数据如何转码有关——或者更确切地说,是否可以转码。
2021-04-12 18:53:38

application/javascript 是可以使用的正确类型,但由于 IE6-8 不支持它,因此您将被 text/javascript 困住。如果您不关心有效性(HTML5 除外),则不要指定类型。

@Zenexer 自从我不得不处理这个问题已经有一段时间了,但这里有一些其他帐户会导致IE6-8 出现问题不完全确定为什么这似乎只在某些时候很重要,但根据我的经验,它引起了问题。
2021-03-21 18:53:38
@Zenexer 阅读他对另一个问题的回答看似 IE 兼容性意味着没有application/javascript
2021-03-26 18:53:38
你从哪里得到这个?我很确定它是受支持的。或者,至少,它将被忽略。
2021-04-02 18:53:38
@Zenexer 嗯,奇怪。我想知道其他问答中的问题是什么。
2021-04-02 18:53:38
@CamiloMartin 我一直在 IE 下使用它,直到 6。他们只是默认为 JavaScript。
2021-04-12 18:53:38