JavaScript の MIME タイプが `text/javascript` に統一されようとしている

現在、 JavaScript の MIME タイプは2006年4月に公開された RFC 4329(www.rfc-editor.org) にて

  • text/javascript (OBSOLETE)
  • application/javascript (COMMON)
  • text/ecmascript (OBSOLETE)
  • application/ecmascript (COMMON)

の4つが定義されています。

この RFC 4329 では text/* の2つは OBSOLETE 扱いな一方で、 JavaScript を呼び出す HTML の仕様では HTML5 以降、 <script> 要素の type 属性を省略することが推奨(html.spec.whatwg.org)されたうえで、省略時の値は text/javascript である(html.spec.whatwg.org)とされました。

このように RFC 側と HTML 側で矛盾が生じる事態が長い間続いています。

実際には HTML5 が普及し出した当初は Internet Explorer 8 以前が application/javascriptapplication/ecmascript を認識しなかったため、 XHTML 1.0 にしろ HTML5 にしろ、やむを得ず(?) text/javascript を採用するしかありませんでした。現在では IE 8 を考慮する必要はないため、 application/javascript を採用しているサイトも見かけます[1]

さて、2017年8月には ES Modules の兼ね合いで RFC 4329 のアップデートの個人ドラフト(draft-bfarias-javascript-mjs-00)(datatracker.ietf.org)が公開され、そこでは HTML Living Standard 仕様に合わせて text/javascript の OBSOLETE 扱いを取り止めるとされました。この時点のドラフトでは MIME タイプは

  • text/javascript (COMMON)
  • application/javascript (COMMON)

の2種類とされていましたが、同年10月に個人ドラフトから WG ドラフト: draft-ietf-dispatch-javascript-mjs-00(datatracker.ietf.org) に移行した際、 application/javascript も OBSOLETE とされ、唯一 text/javascript のみが COMMON な値となりました。

  • appliaction/ecmascript (OBSOLETE)
  • application/javascript (OBSOLETE)
  • application/x-ecmascript (OBSOLETE)
  • application/x-javascript (OBSOLETE)
  • text/ecmascript (OBSOLETE)
  • text/javascript (COMMON)
  • text/javascript1.0 (OBSOLETE)
  • text/javascript1.1 (OBSOLETE)
  • text/javascript1.2 (OBSOLETE)
  • text/javascript1.3 (OBSOLETE)
  • text/javascript1.4 (OBSOLETE)
  • text/javascript1.5 (OBSOLETE)
  • text/jscript (OBSOLETE)
  • text/livescript (OBSOLETE)
  • text/x-ecmascript (OBSOLETE)
  • text/x-javascript (OBSOLETE)

この WG ドラフトは改定を重ね、2020年3月のバージョン 06(datatracker.ietf.org)では文字エンコーディングの章(4章)が追加、2022年1月のバージョン 14(datatracker.ietf.org)では改定の要とも言えるメディアタイプに関する6章の記述が大幅に変更され、現在(2022年2月時点)では MIME タイプは以下の2つとされました。

  • text/javascript (COMMON)
  • text/ecmascript (OBSOLETE)

ここで application/javascript のほか application/x-javascripttext/javascript1.0 などの古の値は text/javascript に対する非推奨のエイリアス名、同様に application/ecmascript 等は text/ecmascript に対するエイリアス名との扱いになりました。 text/ecmascript が OBSOLETE 扱いなのは変わらずなので、結局のところ今後は「JavaScript の MIME タイプは text/javascript のみ」ということになりそうです。

2020年5月20日追記5月6日に RFC 9239: Updates to ECMAScript Media Types(www.rfc-editor.org)として公開されました。 RFC 4329 では text/* を廃止していたにも関わらず、それを180度ひっくり返すことになった経緯が 2章 Compatibility(www.rfc-editor.org)の末尾に追加されています[2]。一言でまとめれば「歴史的経緯」なわけですが、締めのFuture registrations should not view this as a repeatable precedent.の文章にこれまでの長きにわたる混乱に対する想いが詰まっていて感慨深いです。