Różnica między typami aplikacji / x-javascript a tekstem / javascript

245

Jaka jest różnica między tymi nagłówkami?

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

Który jest najlepszy i dlaczego?

Nie mów, że są identyczne - gdyby były identyczne, nie byłoby ich trzech. Wiem, że obie działają - ale chciałbym poznać różnicę.

Obmerk Kronen
źródło
1
Różnica jest również klasycznym powodem, dla którego skrypty nie są kompresowane. Upewnij się, że masz wpis w httpCompression dla faktycznie obsługiwanego typu i zwróć uwagę, że IIS Express domyślnie kompresuje tylko application / x-javascript i text / *.
rism
NB: Pełna lista „typów mimów javascript” znajduje się tutaj: html.spec.whatwg.org/multipage/… . tj. jest to lista wartości, które przeglądarka powinna dopuścić do atrybutu scriptznacznika, typegdy nosniffokreślona jest dyrektywa. developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
JohnLBevan

Odpowiedzi:

320

text/javascriptjest przestarzały i application/x-javascriptbył eksperymentalny (stąd x-przedrostek) przez okres przejściowy, aż application/javascriptmógł zostać znormalizowany.

Powinieneś użyć application/javascript. Jest to udokumentowane w RFC .

Jeśli chodzi o przeglądarki, nie ma różnicy (przynajmniej w nagłówkach HTTP). Było to po prostu tak, że zmiana text/*i application/*grupy typ MIME miał możliwie spójne znaczenia gdzie. ( text/*Typy MIME są przeznaczone do treści czytelnych dla ludzi, JavaScript nie jest przeznaczony do bezpośredniego przekazywania znaczenia ludziom).

Zauważ, że użycie application/javascriptw typeatrybucie elementu skryptu spowoduje zignorowanie skryptu (jako w nieznanym języku) w niektórych starszych przeglądarkach. Kontynuuj używanie text/javascriptlub całkowicie pomiń atrybut (co jest dozwolone w HTML 5).

Nie stanowi to problemu w nagłówkach HTTP, ponieważ przeglądarki powszechnie (o ile mi wiadomo) albo całkowicie ignorują skrypty typu HTTP, albo są wystarczająco nowoczesne, aby je rozpoznać application/javascript.

Quentin
źródło
wielkie dzięki za szczegółową odpowiedź. jeszcze jeden problem - powiedziałeś, że mogę go całkowicie pominąć (tylko HTML5?) - ale moje pytanie (które zostało później przez kogoś edytowane) dotyczyło konkretnie JS w PHP - czy będzie działać jako kombinacja PHP / JS na wszystkich serwerach / przeglądarkach czy całkowicie to pominę?
Obmerk Kronen
8
Można pominąć ten type atrybut na <script>elemencie. Nie możesz pominąć Content-Typenagłówka HTTP… nigdy (jeśli nie określisz go w PHP, wówczas PHP domyślnie text/htmlbędzie bardzo źle).
Quentin,
2
Czy zgodnie z logiką czytelną dla człowieka nie należy klasyfikować CSS pod kątem zastosowania, a nie tekstu?
Fabrício Matté
2
@frnhr Twoja edycja tej odpowiedzi zmieniła zamierzone znaczenie (które miało oznaczać, że text/javascriptjest przestarzałe i application/x-javascripteksperymentalne). Co gorsza, pozostawił początek odpowiedzi niespójny, z blokowym napisem text/javascriptpo prostu spędzającym czas bez znaczenia na górze odpowiedzi bez wyraźnego powodu.
Mark Amery
1
W SVN zdecydowanie użyj text / javascript. SVN traktuje wszystko NIE zaczynające się od tekstu / jako binarne. Aby naprawić całą kopię roboczą SVN, musisz utworzyć plik mime.cmd zawierający następujące elementy: @echo off for /r . %%X in (*.js) do ( svn propset svn:mime-type text/javascript "%%X" ) który po uruchomieniu zmieni typ mime wszystkich plików JS w repozytorium na text / javascript. Następnie musisz zatwierdzić pliki JS do SVN z nowym typem MIME.
Mark Eldridge
21

typy mime rozpoczynające się od x-nie są standaryzowane. W przypadku javascript jest to trochę przestarzałe. Dodatkowo drugi fragment kodu

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

wymaga short_open_tagswłączenia. powinieneś tego unikać.

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

Jednak całkowicie poprawnym typem MIME dla javascript jest

application/javascript

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

KingCrunch
źródło
1
Stara odpowiedź, ale nie wiem, czy dobrze jest zacząć od krótkich otwartych tagów, dopóki nie jest to najlepsza praktyka (zdecydowanie zalecamy wyłączenie PHP-SOT w rzeczywistości)
Ben Cassinat
8

Zgodnie z RFC 4329 prawidłowy typ MIME dla JavaScript powinien być application/javascript. Jednak starsze wersje IE dławią się tym, ponieważ się spodziewają text/javascript.

Björn
źródło
7
O ile mi wiadomo, IE nie podaje małpy tego, co mówi typ zawartości HTTP; tylko to, co typemówi atrybut HTML (aw wersjach roboczych HTML 5 ten atrybut może zostać pominięty w JavaScript).
Quentin,
@Quentin ahh ... to sprawiło mi kłopot. Dzięki!
martin
3

Użyj type = "application / javascript"

W przypadku HTML5 atrybut type jest nieaktualny, możesz go usunąć. Uwaga: domyślnie jest to „text / javascript” według w3.org, więc sugerowałbym dodanie „application / javascript” zamiast go usuwać.

http://www.w3.org/TR/html5/scripting-1.html#attr-script-type
Atrybut type określa język skryptu lub format danych. Jeśli atrybut jest obecny, jego wartość musi być poprawnym typem MIME. Parametr charset nie może być określony. Domyślną wartością, która jest używana, gdy atrybut jest nieobecny, jest „tekst / javascript”.

Użyj „application / javascript”, ponieważ „text / javascript” jest przestarzały :

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

  1. Wdrożone typy nośników skryptów i ich kompatybilność

    Różne niezarejestrowane typy mediów zostały wykorzystane w ad-hoc do oznaczania i wymiany programów napisanych w ECMAScript i JavaScript. Obejmują one:

    + ------------------------------------------------- ---- + | tekst / javascript | tekst / ekmascript | | text / javascript1.0 | text / javascript1.1 | | text / javascript1.2 | text / javascript1.3 | | text / javascript1.4 | text / javascript1.5 | | tekst / jscript | text / livescript | | text / x-javascript | text / x-ecmascript | | application / x-javascript | application / x-ecmascript | | application / javascript | application / ecmascript | + ------------------------------------------------- ---- +

Użycie typu „tekstowego” najwyższego poziomu dla tego rodzaju treści jest znane jako problematyczne. Dokument ten definiuje zatem tekst / javascript i text /
ecmascript, ale oznacza je jako „przestarzałe”. Używanie eksperymentalnych i
niezarejestrowanych typów mediów, wymienionych w części powyżej, jest odradzane.
Rodzaje mediów,

  * application/javascript
  * application/ecmascript

które są również zdefiniowane w tym dokumencie, są przeznaczone do powszechnego użytku i powinny być używane zamiast tego.

Ten dokument określa równoważne wymagania przetwarzania dla
typów text / javascript, text / ecmascript i application / javascript.
Użycie i obsługa aplikacji typu media / ecmascript jest
znacznie mniej rozpowszechniona niż w przypadku innych typów mediów zdefiniowanych w
tym dokumencie. Wykorzystując to na swoją korzyść, dokument ten określa
bardziej rygorystyczne reguły przetwarzania dla tego typu, aby wspierać bardziej interoperacyjne
przetwarzanie.

x-javascript jest eksperymentalny, nie używaj go.

juFo
źródło