Когда использовать JavaScript / MIME-тип приложения / javascript вместо text / javascript?

157

Исходя из вопроса, код jQuery, не работающий в IE , text/javascriptиспользуется в документах HTML, поэтому Internet Explorer может его понять.

Но мне интересно, когда бы вы использовали application/javascript, и что более важно, почему бы вы использовали его вместо text/javascript?

Марк Байенс
источник

Ответы:

243

В теории, в соответствии с RFC 4329 , application/javascript.

Причина, по которой это предполагается application, не связана с тем, является ли тип читаемым или исполняемым. Это связано с тем, что существуют собственные механизмы определения кодировки, установленные самим языком / типом, а не просто общим charsetпараметром. Подтип textдолжен иметь возможность транскодирования через прокси в другую кодировку, изменяя параметр кодировки. Это не верно для JavaScript, потому что:

а. RFC говорит, что пользовательские агенты должны делать BOM-сниффинг сценария, чтобы определить тип (хотя я не уверен, действительно ли какой-либо браузер делает это);

б. браузеры используют другую информацию - включая кодировку страницы, а в некоторых браузерах - script charsetатрибут - для определения кодировки. Таким образом, любой прокси, который пытался перекодировать ресурс, сломал бы его пользователей. (Конечно, в действительности никто никогда не использует транскодирующие прокси в любом случае, но это было намерением.)

Поэтому точные байты файла должны быть сохранены точно , что делает его двоичным applicationтипом, а не технически символьным text.

По той же причине application/xmlофициально предпочтительнее, чем text/xml: XML имеет свои собственные механизмы внутрисхемной сигнализации кодировки. И все applicationтоже игнорируют XML.

text/javascriptи, text/xmlвозможно, это не официальная правильная вещь, но есть то, что все используют сегодня по соображениям совместимости, и причины, по которым они не являются правильными, практически не имеют значения.

bobince
источник
4
Самое «совместимое» решение - вообще не включать какой-либо тип контента в ответ. RFC утверждает, что без явного типа контента получатель будет интерпретировать его «по контексту», что всегда является правильным поведением для всех браузеров, начиная с самых первых браузеров
Pacerier
Будьте осторожны с application/javascriptи IE работает в режиме совместимости с IE=8. Похоже, что встроенные скрипты не оцениваются должным образом. text/javascriptтам отлично работает.
Йоша
2
@Pacerier - я знаю, что этому комментарию уже 5 лет, но сегодня из соображений безопасности часто лучше включать типы пантомимы, особенно для сайтов типа форума. Из-за того, что получатель интерпретирует тип, он остается открытым для атаки, загружая вредоносный файл JavaScript в виде изображения, а затем браузер интерпретирует и запускает этот скрипт. Лучше, чтобы сервер возвращал mime-типы для всех ответов и использовал заголовок, X-Content-Type-Options: nosniffчтобы браузер не интерпретировал этот тип.
sammy_winter
@sammy_winter Я вижу подобные предупреждения везде и каждый раз съеживаюсь. Если бы я позволил пользователям загружать контент, я бы, вероятно, сделал бы больше проверки, чем «о, да, регулярное выражение с именем для файла png, я могу в это поверить», не так ли? Если неправильный заголовок становится «проблемой безопасности», проблема может быть где-то глубже, не так ли? Это то же самое, что и скрытие Server: nginxили все, что отправляет nginx. Как будто тот, кто способен найти дыру, нуждается в явном заголовке, чтобы знать, на каком сервере вы работаете ...
Sahsahae
17

Проблема с MIME-типом Javascript заключается в том, что годами не было стандарта. Теперь у нас есть application / javascript как официальный тип MIME.

Но на самом деле MIME-тип вообще не имеет значения, так как браузер может определить сам тип. Вот почему спецификации HTML5 заявляют, что type="text/javascript"больше не требуется.

Harmen
источник
5

applicationпотому что .js-файлы - это не то, что пользователь хочет прочитать, а то, что должно быть выполнено.

thejh
источник
Это официальный ответ, но IE его подавляет.
Бенн
20
@ Бенн: Может быть, потому что пользователи IE должны читать все файлы JS, потому что они не работают должным образом? По крайней мере, это честно от Microsoft;)
thejh
Мне нравится ваш комментарий, но, к сожалению, люди, которые не могут читать javascript, по-прежнему используют IE, поэтому мы должны с этим справиться :(.
Марк Байенс
1
Я не думаю, хотите ли вы прочитать это как-то связано с тем, почему. Это связано с тем, как данные транскодируются - или, скорее, могут ли они быть.
Zenexer
технически HTML и CSS также «исполняются» (анализируются) браузером для получения результата кода в виде визуального содержимого и не предназначены для того, чтобы пользователь «читал» его, поэтому этот ответ не имеет особого смысла. Я предполагаю, что есть большая путаница относительно того, что такое «текст» и что такое «приложение». Если бы я мог голосовать по этому вопросу, я бы сказал, что IETF должна рассматривать «текстовое» содержимое как text, или binaryкак application-ИЛИ «цель» указанного типа, как в «изображении», или «документ» и т. Д.
1

application / javascript - это правильный тип для использования, но так как он не поддерживается IE6-8, вы застрянете с text / javascript. Если вас не интересует валидность (исключая HTML5), просто не указывайте тип.

Radu
источник
Где ты это взял? Я уверен, что это поддерживается. Или, по крайней мере, это будет игнорироваться.
Zenexer
@ Zenexer прочитал свой ответ на другой вопрос . Казалось бы, IE совместимость означает нет application/javascript.
Камило Мартин
@CamiloMartin Я использую это хорошо с IE до 6 все время. Они просто по умолчанию для JavaScript.
Zenexer
@ Zenexer Хм, странно. Интересно, в чем была проблема в других вопросах и ответах?
Камила Martin
@ Zenexer Прошло много времени с тех пор, как мне приходилось сталкиваться с этим, но вот некоторые другие объяснения этого, вызывающие проблемы с IE6-8. Не совсем уверен, почему это, кажется, имеет значение только несколько раз, но по моему опыту это вызвало проблемы.
Раду