ChatGPT解决这个技术问题 Extra ChatGPT

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

根据问题 jQuery code not working in IEtext/javascript 用于 HTML 文档,以便 Internet Explorer 可以理解。

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


b
bobince

理论上,根据RFC 4329application/javascript

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

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

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

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

出于同样的原因,application/xml 正式优于 text/xml:XML 有自己的带内字符集信号机制。对于 XML,每个人都会忽略 application

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


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

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

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


t
thejh

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


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

application/javascript 是正确使用的类型,但由于 IE6-8 不支持它,您将被 text/javascript 卡住。如果您不关心有效性(不包括 HTML5),那么就不要指定类型。


你从哪儿弄来的这个?我很确定它是受支持的。或者,至少,它将被忽略。
@Zenexer 读取 his answer to another question。看似 IE 兼容性意味着没有 application/javascript
@CamiloMartin 我一直在 IE 中使用它,直到 6。他们只是默认使用 JavaScript。
@Zenexer 嗯,奇怪。我想知道其他问答中有什么问题。
@Zenexer 我不得不处理这个问题已经有一段时间了,但是 here are some other accounts of this causing issues 使用的是 IE6-8。不完全确定为什么这似乎只在某些时候很重要,但根据我的经验,它已经引起了问题。
M
Mathias Bynens

过去对此有很多困惑和分歧,其他答案对此进行了详细解释。

RFC9239 最终通过与实施现实保持一致来解决这种困惑。 application/javascript 现已正式过时; text/javascript 是唯一正确的 JavaScript MIME 类型。