FAQ zu SmooshGate

Was ist mit dem Lämpchen passiert?!

Ein Angebot für ein JavaScript der Sprachfunktion Array.prototype.flatten Nicht mit dem Web kompatibel. Der Versand der Funktion in Firefox Nightly verursachte mindestens eine beliebte Website. zu brechen. Da der problematische Code Teil des weitverbreiteten MooTools ist, sind wahrscheinlich viel mehr Websites betroffen. (Trotzdem MooTools wird 2018 nicht mehr häufig für neue Websites verwendet. Sie war früher sehr beliebt und noch auf vielen Produktionswebsites vorhanden ist.)

Der Angebotsautor hat scherzhaft vorgeschlagen, "flatten" in "smoosh" umzubenennen in um Kompatibilitätsprobleme zu vermeiden. Dieser Witz war nicht für alle klar, manche glaubten sie fälschlicherweise, der neue Name sei bereits und die Sache eskalierte schnell.

Was macht Array.prototype.flatten?

Array.prototype.flat, ursprünglich vorgeschlagen als Array.prototype.flatten, Vereinfacht Arrays rekursiv bis zum angegebenen depth, der als Standardeinstellung festgelegt ist. an 1.

// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]

// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]

Dieses Angebot enthält Array.prototype.flatMap, was Array.prototype.map mit dem Unterschied, dass das Ergebnis in einem neuen Array vereinfacht wird.

[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]

Wodurch wird dieses Problem von MooTools verursacht?

MooTools definiert eine eigene, nicht standardmäßige Version von Array.prototype.flatten:

Array.prototype.flatten = /* non-standard implementation */;

Die flatten-Implementierung von MooTools weicht vom vorgeschlagenen Standard ab. Das ist jedoch nicht das Problem. Verfügbarkeit von Browsern Array.prototype.flatten nativ überschreibt, überschreibt MooTools die Implementierung. Dadurch wird Code, der auf dem MooTools-Verhalten basiert, funktioniert wie vorgesehen, unabhängig davon, ob die native flatten verfügbar ist. So weit, so gut!

Leider passiert dann etwas anderes. MooTools kopiert alle seine benutzerdefinierten Array-Methoden an Elements.prototype senden (wobei Elements ein MooTools-spezifische API):

for (var key in Array.prototype) {
  Elements.prototype[key] = Array.prototype[key];
}

forin iteriert über „auflistenbare“ Properties, die keine native Methoden wie Array.prototype.sort, enthält aber regelmäßig zugewiesenen Properties wie Array.prototype.foo = whatever. Aber – Das ist der Punkt, an dem Sie eine nicht aufzählbare Eigenschaft überschreiben, z.B. Array.prototype.sort = whatever ist, bleibt er nicht aufzählbar.

Derzeit erstellt Array.prototype.flatten = mooToolsFlattenImplementation Eine aufzählbare flatten-Eigenschaft, die später nach Elements kopiert wird. Wenn aber eine native Version von flatten ausliefern, wird diese nicht mehr aufzählbar und wird nicht nach Elements kopiert. Jeder Code, der auf den MooTools- Elements.prototype.flatten ist jetzt nicht erreichbar.

Es sieht zwar so aus, als würde die native Array.prototype.flatten in würde das Problem durch aufzählbare Elemente behoben werden, Kompatibilitätsprobleme. Jede Website, die auf for-in iteriert, ein Array (was nicht gut ist, aber passiert), dann plötzlich eine zusätzliche Schleifeniteration für das Attribut flatten.

Das größere zugrunde liegende Problem hier sind die Änderung integrierter Objekte. Wird verlängert werden native Prototypen heutzutage generell nicht akzeptiert, lässt sich nicht gut mit anderen Bibliotheken und Drittanbietercode kombinieren. Nicht ändern Objekte, die Ihnen nicht gehören!

Warum behalten wir nicht einfach den bisherigen Namen bei und zerstören das Web?

1996, bevor CSS verbreitete wurde und „HTML5“ lange bevor die Space Jam-Website wurde veröffentlicht. Die Website funktioniert auch heute noch, so wie vor 22 Jahren.

Wie ist das passiert? Hat jemand die Website all die Jahre gepflegt, jedes Mal aktualisiert werden, wenn Browseranbieter eine neue Funktion veröffentlicht haben?

Wie sich herausstellt, ist „das Web nicht brechen“ das wichtigste Designprinzip. für HTML, CSS, JavaScript und alle anderen Standards, die im Web Wenn die Lieferung einer neuen Browserfunktion dazu führt, dass bestehende Websites nicht mehr existieren funktioniert, schadet das für alle:

  • Bei Besuchern der betroffenen Websites ist die Nutzererfahrung plötzlich beeinträchtigt.
  • von einer perfekt funktionierenden Website zu einer ohne dass sie etwas verändern.
  • dass Browser-Anbieter, die die neue Funktion liefern, Marktanteile verlieren, da die Nutzenden den Browser wechseln, nachdem Sie bemerkt haben, „dass es mit Browser X funktioniert“;
  • Sobald das Kompatibilitätsproblem bekannt ist, verweigern andere Browseranbieter den Versand . Die Funktionsspezifikation entspricht nicht der Realität („nichts als eine Fiktion“). was für den Standardisierungsprozess schlecht ist.

Im Nachhinein hat MooTools das Falsche getan, aber das Web kaputt. nicht für sie, sondern für die Nutzenden. Diese Nutzer wissen nicht, ist. Alternativ können wir eine andere Lösung finden und die Nutzer können fortfahren. um das Web zu nutzen. Die Entscheidung ist einfach.

Bedeutet das, dass fehlerhafte APIs nie von der Webplattform entfernt werden können?

Das ist unterschiedlich. In seltenen Fällen können schlechte Funktionen aus dem Web entfernt werden. Es reicht nicht aus, herauszufinden, ob es möglich ist, eine Funktion zu entfernen, erfordert umfangreiche Telemetriedaten, um zu quantifizieren, wie viele Webseiten geändert hat. Ist die Funktion jedoch nicht sicher, schadet es dem Nutzer, oder sehr selten verwendet wird, ist das möglich.

<applet>, <keygen> und showModalDialog() sind alle Beispiele für fehlerhafte APIs, die erfolgreich von der Webplattform entfernt wurden.

Warum beheben wir nicht einfach MooTools?

Es ist sinnvoll, MooTools so zu patchen, dass integrierte Objekte nicht mehr erweitert werden. Idee. Das vorliegende Problem wird dadurch jedoch nicht gelöst. Selbst wenn MooTools um eine Patchversion zu veröffentlichen, müssten alle bestehenden Websites, die diese Version nutzen, zum Beheben des Kompatibilitätsproblems.

Können Nutzer nicht einfach ihre Kopie von MooTools aktualisieren?

In einer perfekten Welt veröffentlichte MooTools einen Patch und jede einzelne Website mit MooTools am nächsten Tag aktualisiert. Problem gelöst, oder?!

Das ist leider unrealistisch. Selbst wenn jemand irgendwie identifizierte, alle betroffenen Websites enthält, finden Sie Kontaktinformationen für Sie wenden sich erfolgreich an alle Websiteinhaber, und sie alle davon zu überzeugen, die Aktualisierung durchzuführen (was eine Refaktorierung gesamte Codebasis), würde der gesamte Prozess bestenfalls Jahre in Anspruch nehmen.

Beachten Sie, dass viele dieser Websites veraltet sind und wahrscheinlich nicht mehr verwaltet werden. Auch wenn der Pfleger noch da ist, ist es möglich, dass er kein versierten Webentwickler wie Sie. Wir können nicht erwarten, dass alle und seine acht Jahre alte Website aufgrund eines Webkompatibilitätsproblems ändern.

Wie funktioniert der TC39-Prozess?

TC39 ist der Ausschuss, der die Entwicklung der JavaScript-Sprache durch dem ECMAScript-Standard.

#SmooshGate brachte einige auf die Idee, dass „TC39 möchte flatten umbenennen in smoosh“, aber es war ein Scherz, der extern nicht gut kommuniziert wurde. Wichtige Entscheidungen wie die Umbenennung eines Angebots werden nicht leichtfertig getroffen, von einer einzigen Person durchgeführt und auf keinen Fall über Nacht eingenommen werden, GitHub-Kommentar.

TC39 nutzt für Funktionsvorschläge einen klaren Staging-Prozess. ECMAScript-Vorschläge und alle größeren Änderungen daran (einschließlich Methoden Umbenennung) werden bei TC39-Meetings besprochen und müssen vom bevor sie offiziell werden. Im Fall von Array.prototype.flatten, das Angebot wurde bereits mehrere Male überprüft bis hin zu Phase 3, in der angegeben wird, dass das Element und kann in Webbrowsern implementiert werden. Häufig sind zusätzliche Spezifikationen bei der Implementierung auftreten. In diesem Fall ist die wichtigste Feedback kam nach dem Versuch, die Funktion zu versenden: In ihrem aktuellen Zustand bricht das Web. Schwierige Probleme wie diese sind unter anderem der Grund dafür, Der TC39-Prozess endet nicht nur mit der Bereitstellung einer Funktion durch den Browser.

TC39 basiert auf dem Konsens, d. h. der Ausschuss muss sich auf alle neuen Änderungen. Auch wenn smoosh ein ernster Vorschlag gewesen wäre, scheint es, dass würde ein Ausschussmitglied dagegen Einspruch erheben und stattdessen einen gebräuchlicheren Namen wie compact oder chain.

Die Umbenennung von flatten in smoosh erfolgt nie bei einem TC39-Meeting diskutiert wurden. Daher gilt die offizielle Haltung von TC39 Dieses Thema ist derzeit unbekannt. Keine Einzelperson kann im Namen von alle TC39-Mitglieder, bis beim nächsten Meeting ein Konsens erreicht wird.

TC39-Meetings werden in der Regel von Menschen mit sehr unterschiedlichem Einige haben jahrelange Erfahrung im Design von Programmiersprachen, andere arbeiten an einem Browser oder einer JavaScript-Engine. Immer mehr Assistenten dienen dazu, die JavaScript-Entwickler-Community zu repräsentieren.

Wie wurde SmooshGate schließlich gelöst?

Während der TC39-Konferenz im Mai 2018 hat #SmooshGate wurde offiziell geklärt, indem flatten in flat umbenannt wurde.

Array.prototype.flat und Array.prototype.flatMap in V8, Version 6.9, und Chrome 69.