9

Ich bin neugierig zu verstehen/herauszufinden, wenn die ECMAScript-6-Änderungen an den alten Browsern funktionieren oder nicht.EcmaScript-6 Abwärtskompatibilität

Warum ich diese Frage bin gefragt ist:

Ich erinnere mich an die Einführung von 'use strict'; in ECMAScript-5 wurde für die Kompatibilität mit den alten Versionen gemeint.

Das bedeutet, dass die alten Browser weiterhin gut funktionieren und sie ignorieren sie einfach, wenn sie die Anweisung 'use strict'; beim Parsen des neuen JavaScript-Codes treffen.

Und die neuen JS-Engines behandeln die Anweisung 'use strict'; in einer speziellen Weise wie hier beschrieben Strict mode.


Also, auf die Frage kommende

ich bezweifle ernsthaft, und neugierig, wie würde die ECMAScript-5 kompatibele Browser verhalten, wenn sie den ECMAScript-6-Code analysieren werden.

Der Grund für meine Zweifel ist, dass ECMAScript-6 neue Features Syntaxänderung/Updates beinhalten. Und der alte Browser, die neue Syntax-ahnungslos-Motoren sind, wird zu werfen Fehler beginnen, wenn sie begegnen eines der neuen Syntax aus den folgenden

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of etc.

Meine Sorge ist, hat die Entscheidung/Aufnahme neuer Funktionen in ECMAScript-6 auf die Unterstützung der alten Browser ohne jeden Code-Bruch geachtet?

Wenn ja dann wie?

Wenn nicht dann, was soll ich meinen alt-Browser-Benutzer glücklich zu halten tun?

Ich sehe eine Lösung, um die Benutzer mit alten Browsern glücklich zu halten, indem Sie einige transpiler wie traceur-compiler in meinem Projekt enthalten. Dies wird meinen ECMAScript-6-Code in ECMAScript-5-Äquivalent konvertieren. Aber habe ich eine andere Lösung, um meine Alt-Browser-Benutzer glücklich zu halten?

+1

Viele ES6-Funktionen sind nicht abwärtskompatibel und funktionieren nur in einer ES6-JS-Engine. Wenn Ihr Code in einem Browser ausgeführt wird, funktioniert er entweder nur in den neuesten Browsern oder Sie müssen warten, bis die gesamte Support-Basis Ihres Browsers bis ES6 reicht (in Jahren). Wenn Ihr Code in einer Datei wie node.js ausgeführt wird oder ein Plug-in für eine bestimmte Version eines bestimmten Browsers ist, haben Sie eine bessere Kontrolle über die JS-Engine und können die ES6-Funktionen wahrscheinlich früher verwenden. Der unterschiedliche Zweck von '" use strict ";' ist konsistenter mit Rückwärtskompatibilität. – jfriend00

+0

Das ist traurig, aber scheint wahr :(Sie können den Kommentar als Ihre Antwort als auch .... – dopeddude

+0

Karte, Set und WeakMap kann polyfilled sein, und wenn Sie die neue Syntax vermeiden können, es6 Code wird auf es5 .. – dandavis

Antwort

6

Viele ES6-Funktionen funktionieren nicht in einer ES5 JS-Engine, insbesondere neue Syntaxfunktionen wie for/of oder Pfeilfunktionen, Generatoren usw. Einige Funktionen wie das Set-Objekt können teilweise für ältere Browser, andere nicht erfüllt werden .

der Liste der Funktionen, die Sie in Ihrer Frage haben:

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of 

Keiner von denen ist kompatibel mit älteren Versionen von Javascript und wird entweder Syntax oder Referenzfehler verursachen. Einige Eigenschaften von Map und Set können polyfiliert werden (obwohl nicht alle). Ausbeute, Generatoren, Pfeilfunktionen und für ... von sind nur eine neue Syntax, die ältere Browser nicht verarbeiten und nicht ausführen können. Es ist möglich, einen ES6-Transpiler zu verwenden, der Ihren Code in ES5-kompatiblen Code konvertiert. Das ist nicht wirklich rückwärtskompatibel mit ES6, sondern eine Code-Konvertierung, die nur die ES5-Syntax verwendet, um die gleichen Dinge zu erreichen, die in der neueren ES6-Syntax ausgedrückt werden.Ein Teil davon wird mit Polyfills gemacht und einige mit alternativen Möglichkeiten, ein ES6-Konstrukt mit nur ES5-Code (und normalerweise mehr ES5-Code) auszudrücken.

Wenn Ihr Code in einer Datei wie node.js ausgeführt wird oder ein Plug-in für eine bestimmte Version eines bestimmten Browsers ist, können Sie die JS-Engine besser steuern und ES6-Funktionen wahrscheinlich früher als in einem Browser verwenden .

Wenn Ihr Code in einem Browser läuft und Sie keinen Transpiler verwenden, um auf ES5-Code umzustellen, dann wird es eine Weile (viele Jahre) dauern, bis die meisten Browser im Internet ES6-fähig sind. Der unterschiedliche Zweck von "use strict"; (Beseitigung der Unterstützung für schlechte Praktiken) ist konsistenter mit der Kompatibilität mit älteren Versionen als neue Sprachfunktionen wie Generatoren zu ermöglichen, da das "use strict"; Konstrukt speziell dafür ausgewählt wurde, etwas zu sein, das ein neuer Browser erkennen könnte ein älterer Browser würde das nur als normale Zeichenkette sehen. Neue ES6-Funktionen, die eine neue Sprachsyntax darstellen, sind einfach nicht so, da ältere Browser nicht wissen, wie sie zu verarbeiten sind, und selbst wenn sie die neuere Syntax irgendwie ignorieren könnten, unterstützen sie die Funktionalität der neuen Syntax nicht.

Sie finden diesen Artikel nützlich, die bei dem Versuch, einige der Probleme diskutiert ES6 heute zu verwenden:

ECMAScript 6 Resources For The Curious JavaScripter

Wenn Sie die meisten ES6 Fähigkeiten heute in einer Vielzahl von Browsern verwenden möchten, dann Ihre beste Option ist wahrscheinlich, Ihren Code mit etwas wie BabelJS zu übertragen. Dadurch wird Ihr ES6-Code in ES5-kompatiblen Code umgewandelt, der in jedem ES5-Browser ausgeführt wird. Sie können in ES6 schreiben, aber der Code wird in einer Vielzahl von Browsern ausgeführt.

Oder wenn Sie nur in einer bestimmten Umgebung (z. B. einem Browser-Plug-in für eine bestimmte Version dieses Browsers) oder einer bestimmten Laufzeit-Engine wie node.js arbeiten, können Sie Code schreiben, der verwendet die ES6-Funktionen, die in dieser spezifischen Engine bereits unterstützt werden.

+3

Diese Antwort ist sehr irreführend, da sie den Begriff "abwärtskompatibel" falsch verwendet. – ben

+0

@ben - Bitte beschreiben Sie, wie Sie denken, dass der Begriff falsch verwendet wird. Ich bin glücklich, die Antwort zu verbessern, verstehe aber nicht ganz, was Sie meinen. – jfriend00

+0

Sicher. Siehe die WIKI-Definition der Abwärtskompatibilität: https://en.wikipedia.org/wiki/Backward_compatibility ES6 ist vollständig abwärtskompatibel, d. H. Jedes ES5-Programm läuft auf ES6, da es eine Obermenge von ES5 (AFAIK) ist. – ben

3

Was Sie hier zu erklären versuchen, ist Vorwärtskompatibilität. Offensichtlich ist ES 5 (oder genauer ES 5 Motor) nicht vorwärtskompatibel. Es ist schwer zu erreichen und selten zu finden.

Obwohl Sie sehen können, dass einige der Features der kommenden ES 7 bereits aus sind und daher möglicherweise ES 6-Engine unter Berücksichtigung dieser Verbesserung implementiert werden kann. Wann immer ES 7 kommt, werden einige Funktionen in älteren Motoren funktionieren. Beantworten Sie die Frage, ob ES 6 rückwärtskompatibel ist, wird "ja" sein. Ja! Die ES 6-Engine wird den Code von ES 5 gerne ausführen, aber umgekehrt ist das nicht der Fall.

Verwandte Themen