Vorteile der Verwendung von immutable.js über Object.weisen Sie oder spread-Betreiber
Bisher sind die meisten "starter-Textbausteinen" und einige posts zu reagieren /redux ich habe gesehen, fördern die Nutzung von immutable.js zu Adresse Veränderbarkeit. Ich persönlich verlassen Sie sich auf Object.assign
oder spread-Betreiber, um diese zu bewältigen, daher kann Sie nicht wirklich sehen Vorteile in immutable.js wie fügt es zusätzliche Lern-und verschiebt sich ein bisschen von vanilla js Techniken, die für die Veränderlichkeit. Ich war auf der Suche nach einem triftigen Grund für einen Wechsel, aber war nicht in der Lage, daher Frage ich hier, um zu sehen, warum es so beliebt ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier geht es um Effizienz.
Persistente Datenstrukturen
Einer persistenten Datenstruktur hält früheren Versionen von sich selbst, wenn es mutiert ist immer gedeckt, eine neue Datenstruktur. Um zu vermeiden, teure Klonen nur der Unterschied zum vorherigen Datenstruktur gespeichert ist, in der Erwägung, dass die Schnittmenge zwischen Ihnen geteilt. Diese Strategie nennt strukturellen teilen. Daher persistente-Daten-Strukturen sind viel effektiver als das Klonen mit
Object.assign
oder der spread-operator.Nachteile von persistenten Datenstrukturen in Javascript
Leider von Javascript keine Unterstützung für die persistente Datenstrukturen nativ. Das ist der Grund, immutable.js vorhanden ist und dass die Objekte unterscheiden sich stark von plain old Javascript
Object
s. Dies führt zu mehr verbose code und eine Menge von Bekehrungen von persistenten Datenstrukturen, um native Javascript-Datenstrukturen.Die entscheidende Frage
Wann wird die Vorteile von immutable.js's structural sharing (Effizienz) ist größer als seine Nachteile (Ausführlichkeit, conversions)?
Ich denke, die Bibliothek zahlt nur in großen Projekten mit zahlreichen und umfangreichen Objekten und Sammlungen, beim Klonen der gesamten Daten, Strukturen und Müllabfuhr wird teurer.
Immutable.js
Verwendung von persistenten Datenstruktur zu speichern, die Teil des ursprünglichen array oder Objekt, das nicht verändert wurde. Aber Sie haben noch zuordnen der unveränderte Teil und eine veränderte Teil der Variablen, so kommen, wie es ist effizienter alsObject.assign()
oderarray.slice()
? Welche internen OperationenImmutable.js
führt es geschehen zu lassen, die mit weniger Speicher nutzen?Ich habe die performance-benchmarks für mehrere unveränderlich Bibliotheken, das Skript und die Ergebnisse befinden sich innerhalb der unveränderlich zuweisen (GitHub-Projekt), die zeigt, dass immutable.js ist optimiert für schreib-Operationen schneller als das Objekt.assign(), aber es ist langsamer, für lese-Operationen. Im folgenden sind die Zusammenfassung der Benchmark-Ergebnisse:
Daher, ob immutable.js oder nicht, hängt von der Art der Anwendung, und seine Lesen, zu schreiben-Verhältnis. Wenn Sie viele schreib-Operationen, dann immutable.js wird eine gute option sein.
Idealerweise sollten Sie das Profil Ihrer Anwendung vor der Einführung der performance-Optimierung, aber, Unveränderlichkeit ist einer dieser design-Entscheidung muss frühzeitig entschieden. Wenn Sie beginnen mit immutable.js, müssen Sie es in Ihrer gesamten Anwendung, um die performance-Vorteile, weil interop mit einfachen JS-Objekte mit fromJS() und toJS() ist sehr teuer.
Ich denke, der wesentliche Vorteil von ImmutableJs ist in seinen Datenstrukturen und Geschwindigkeit. Sicher, es setzt auch der Unveränderlichkeit, aber Sie sollten dies tun sowieso, also das ist nur ein zusätzlicher Vorteil.
Zum Beispiel, sagen, Sie haben ein sehr großes Objekt in Ihrem reducer und Sie ändern möchten, zu einem sehr kleinen Teil des Objekts. Wegen der Unveränderlichkeit, die Sie nicht ändern können das Objekt direkt, sondern erstellen Sie eine Kopie des Objekts. Sie tun, indem Sie kopieren alles (in ES6 mit dem spread-operator).
Wo ist also das problem? Kopieren von sehr großen Objekten sehr langsam. Datenstrukturen in ImmutableJS tun etwas namens strukturellen teilen, wo du wirklich nur die Daten ändern, die Sie wollen. Die anderen Daten, die Sie ändern sich nicht gemeinsam zwischen den Objekten, so dass es nicht kopiert wird.
Das Ergebnis dieses hoch effizienten Datenstrukturen, mit schnell schreibt.
ImmutableJS bietet auch einfache Vergleiche für Tiefe Objekte. Zum Beispiel
Ohne diese, würden Sie brauchen eine Art von tiefen-Vergleich-Funktion, das würde auch viel Zeit in Anspruch nehmen, in der Erwägung, dass der root-Knoten, die hier enthalten einen hash der gesamte datastructure (don ' T zitieren Sie mich auf dieser, das ist, wie ich es in Erinnerung habe, aber die Vergleiche sind immer instant), so dass Vergleiche sind immer
O(1)
d.h. sofortige, unabhängig von der Größe des Objekts.Dies ist besonders nützlich, Reagieren die
shouldComponentUpdate
Methode, wo man nur vergleichen Sie die Requisiten mit dieserequals
Funktion, die ausgeführt wird, sofort.Natürlich gibt es auch Nachteile, wenn Sie mischen immutablejs Strukturen und regelmäßige Objekte, kann es schwierig sein, zu sagen, was was ist. Auch die codebase ist übersät mit den immutableJS syntax, die unterscheidet sich von regulären Javascript.
Ein weiterer Nachteil ist, dass, wenn Sie nicht gehen, um tief verschachtelte Objekte, es ist ein bisschen langsamer ist als plain old js, da die Datenstrukturen haben einigen overhead.
Just my 2 cents.
let obj = {listWith200MillionsObjects: [...], username: 'Kevin'}; let newObj= {...obj, username: 'Pavlin'};
zu kopieren einfach einen Verweis auf die 200 Millionen Objekte-Liste, und nicht zu kopieren jeweils 200 Millionen Objekte? Und auch für den Vergleich, wäre es dann nicht schnell zu?obj == newObj
zurückkehren würdefalse
da es zwei verschiedene Objekt, also nur ein Zeiger-Vergleich? Obwohllet newObj2 = {...obj};
machen würdenewObj2 == obj
zurückfalse
, auch wenn Sie die gleichen Daten.Den Vorteil, immutable.js ist, dass es erzwingt eine unveränderliche redux store (könnte man vergessen, zu erweitern, oder machen einen schlampigen job zu schützen Ihr speichern von änderungen) und vereinfacht die Reduzierstücke viel im Vergleich zu
Object.assign
oder verbreiten Operatoren (beide sind flach, übrigens!).That being said ich habe redux+unveränderliche in einem großen Winkel 1.x-Projekt und gibt es Nachteile: performance-Probleme, es ist nicht klar, was unveränderlich ist und was nicht -, Winkel verwenden können immutable.js Strukturen in
ng-repeat
usw. Nicht sicher zu Reagieren, obwohl, würde gerne Meinungen zu hören.immutable.js gibt Ihnen eine Menge von Dienstprogrammen, die immer wieder ein neues Objekt.
Beispiel:
Nur für reagieren /redux finde ich persönlich das Objekt.zuweisen ist mächtig genug, aber in einigen Fällen die Nutzung der Bibliothek könnte sparen Sie ein paar Zeilen code.
Es ist nicht nur über performance-Gewinne über persistente Datenstrukturen. Unveränderlichkeit ist höchst wünschenswert Qualität für sich, da es komplett beseitigt alle bugs, verursacht durch zufällige Mutationen. Plus, es ist schön, gesund Datenstrukturen mit den bequemen API in Javascript, etwas tatsächlich nutzbar sind, und immutable.js weit Voraus ist der Vanille-Objekte und-arrays, die auch mit den jüngsten Ergänzungen des ES6 und ES7. Es ist wie jQuery - es ist so beliebt, weil es die API ist wirklich toll und einfach zu verwenden im Vergleich zu Vanille-DOM-API (das ist nur ein Alptraum). Sicher, Sie können versuchen, zu bleiben unveränderlich mit Vanille-Objekte, aber dann haben Sie nicht vergessen, zu widersprechen.zuweisen und array-Ausbreitung JEDES FREAKING ZEIT, und mit immutable.js man kann einfach nicht schief gehen, alle Mutationen, hier sind explizite