Разница между типами содержимого application / x-javascript и text / javascript

245

В чем разница между этими заголовками?

Content-Type: application/javascript
Content-Type: application/x-javascript
Content-Type: text/javascript

Какой из них лучше и почему?

Пожалуйста, не говорите, что они идентичны - если бы они были идентичны, их бы не было трое. Я знаю обе работы - но я хотел бы знать разницу.

Обмерк Кронен
источник
1
Разница также является классической причиной, по которой ваши скрипты не сжимаются. Убедитесь, что в httpCompression есть запись для фактического типа, который вы обслуживаете, и обратите внимание, что IIS Express по умолчанию сжимает только application / x-javascript и text / *.
RISM
NB. Полный список «типов пантомимы javascript» можно найти здесь: html.spec.whatwg.org/multipage/… . то есть это список значений, которые браузер должен разрешить для атрибута scriptтега, typeкогда nosniffуказана директива. developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
JohnLBevan

Ответы:

320

text/javascriptустарела и application/x-javascriptбыла экспериментальной (отсюда и x-префикс) в течение переходного периода, пока application/javascriptне могла быть стандартизирована.

Вы должны использовать application/javascript. Это задокументировано в RFC .

Что касается браузеров, то нет никакой разницы (по крайней мере, в заголовках HTTP). Это было просто изменение так , что text/*и application/*группа типа MIME имела последовательный смысл , где это возможно. ( text/*MIME-типы предназначены для удобочитаемого контента, JavaScript не предназначен для прямой передачи смысла людям).

Обратите внимание, что использование application/javascriptв typeатрибуте элемента script приведет к игнорированию сценария (как на неизвестном языке) в некоторых старых браузерах. Либо продолжайте использовать text/javascriptтам, либо полностью пропустите атрибут (что разрешено в HTML 5).

Это не проблема для заголовков HTTP, поскольку браузеры повсеместно (насколько я знаю) либо полностью игнорируют сценарии типа HTTP-содержимого, либо достаточно современны, чтобы их распознавать application/javascript.

Quentin
источник
Большое спасибо за подробный ответ. Еще одна проблема - вы сказали, что я могу опустить его полностью (только HTML5?), - но мой вопрос (который позже был отредактирован кем-то) был конкретно о JS в PHP - будет ли он работать как PHP / JS combo на всех серверах / браузерах если я опущу это полностью ??
Обмерк Кронен
8
Вы можете опустить type атрибут на <script>элемент. Вы не можете опустить Content-TypeHTTP-заголовок ... когда-либо (если вы не укажете его в PHP, PHP по умолчанию text/htmlбудет очень неправильным).
Квентин
2
Следуя понятной человеку логике, не следует ли классифицировать CSS и в приложении, а не в тексте?
Фабрицио Мате
2
@frnhr Ваше редактирование этого ответа изменило предполагаемое значение (которое должно было указать, что text/javascriptоно устарело и application/x-javascriptявляется экспериментальным). Хуже того, начало ответа было бессвязным, а блок с надписью text/javascriptпросто бесполезно зависал в верхней части ответа без видимой причины.
Марк Амери
1
В SVN обязательно используйте text / javascript. SVN рассматривает все, что НЕ начинается с text /, как двоичный файл. Чтобы исправить всю вашу рабочую копию SVN, вам нужно создать файл mime.cmd, содержащий следующее: @echo off for /r . %%X in (*.js) do ( svn propset svn:mime-type text/javascript "%%X" ) который при выполнении изменит тип mime всех файлов JS в вашем хранилище на text / javascript. Затем вам нужно отправить файлы JS в SVN с новым типом mime.
Марк Элдридж
21

mime-типы, начинающиеся с x-, не стандартизированы. В случае с Javascript он немного устарел. Дополнительный второй фрагмент кода

<?Header('Content-Type: text/javascript');?>

требует short_open_tagsвключения. вам следует избегать этого.

<?php Header('Content-Type: text/javascript');?>

Тем не менее, полностью правильный MIME-тип для JavaScript

application/javascript

http://www.iana.org/assignments/media-types/application/index.html

KingCrunch
источник
1
Старый ответ, но не знаю, будет ли хорошо начинать с коротких открытых тегов, пока это не лучшая практика (мы настоятельно рекомендуем вам отключить PHP-SOT на самом деле)
Бен Кассинат,
8

В соответствии с RFC 4329 правильный тип MIME для JavaScript должен быть application/javascript. Однако более старые версии IE задыхаются от этого, так как они ожидают text/javascript.

Бьерн
источник
7
Насколько я знаю, IE не дает обезьянам то, что говорит тип контента HTTP; только то, что typeговорит атрибут HTML (а в черновиках HTML 5 этот атрибут может быть опущен для JavaScript).
Квентин
@ Квентин, ааа ... это то, что доставляло мне неприятности. Спасибо!
мартин
3

Используйте type = "application / javascript"

В случае HTML5 атрибут type устарел, вы можете удалить его. Обратите внимание: по умолчанию он имеет значение «text / javascript» в соответствии с w3.org, поэтому я бы предложил добавить «application / javascript» вместо его удаления.

http://www.w3.org/TR/html5/scripting-1.html#attr-script-type
Атрибут type указывает язык сценария или формат данных. Если атрибут присутствует, его значение должно быть допустимым типом MIME. Параметр charset не должен быть указан. По умолчанию, который используется, если атрибут отсутствует, это «text / javascript».

Используйте «application / javascript», потому что «text / javascript» устарел :

RFC 4329: http://www.rfc-editor.org/rfc/rfc4329.txt

  1. Развернутые типы сценариев и совместимость

    Различные незарегистрированные типы носителей использовались специальным образом для маркировки и обмена программами, написанными на ECMAScript и JavaScript. Это включает:

    + ------------------------------------------------- ---- + | текст / JavaScript | текст / экмаскрипт | | text / javascript1.0 | текст / javascript1.1 | | текст / javascript1.2 | текст / javascript1.3 | | текст / javascript1.4 | текст / javascript1.5 | | текст / jscript | текст / сценарий жизни | | текст / x-javascript | текст / x-ecmascript | | application / x-javascript | application / x-ecmascript | | приложение / javascript | приложение / экмаскрипт | + ------------------------------------------------- ---- +

Использование типа «текст» верхнего уровня для такого рода контента, как известно, проблематично. Таким образом, этот документ определяет текст / javascript и текст /
ecmascript, но помечает их как «устаревшие». Использование экспериментальных и
незарегистрированных типов носителей, как указано выше, не рекомендуется.
Типы носителей,

  * application/javascript
  * application/ecmascript

которые также определены в этом документе, предназначены для общего пользования и должны использоваться вместо.

Этот документ определяет эквивалентные требования к обработке для
типов text / javascript, text / ecmascript и application / javascript.
Использование и поддержка для медиа-типа application / ecmascript
значительно менее распространены, чем для других медиа-типов, определенных в
этом документе. Используя это в своих интересах, этот документ определяет
более строгие правила обработки для этого типа, чтобы способствовать более совместимой
обработке.

x-javascript - экспериментальный, не используйте его.

ЮФО
источник