Was ist neu in Knoten 12?

Knoten 12 wurde kürzlich mit dem Codenamen Erbium , dessen langfristige Unterstützung (LTS) von Oktober 2019 bis April 2022 dauern wird.


Die neue Version hat viele Extras und Verbesserungen zur Laufzeit. Angesichts der Tatsache, dass der Knoten unter der Motorhaube des V8 auch alle Motorverbesserungen erhält.




import/export Unterstützung


Der Knoten tritt auf dem Weg zu ECMAScript-Modulen in Phase 3 ein . Anfangs war diese Funktion nur mit dem --experimental-modules verfügbar. Wenn Node zu LTS wechselt, ist die Verwendung dieses Flags nicht mehr erforderlich.


Die Syntax mit import/export seit der Standardisierung in ES6 bei der Arbeit mit Modulen für js-Entwickler vorzuziehen, und das Team hinter Node hat fleißig an der nativen Unterstützung gearbeitet. Diese Funktion war experimentell mit Knoten 8.0 ab Phase 0 verfügbar. Die aktuelle Version ist ein großer Schritt in diese Richtung. Die meisten gängigen Browser unterstützen diese Funktion bereits mit <script type="module"> .


Ab Phase 3 werden drei Importoptionen aus ES-Modellen unterstützt:


 //    import module from 'module' //   import { namedExport } from 'module' //     import * as module from 'module' 

Vanilla-Module können nur standardmäßig exportiert werden:


 import module from 'cjs-library' 

Sie können import() , um zur Laufzeit zu laden. import() gibt Promise und funktioniert sowohl mit ES-Modellen als auch mit CommonJS-Bibliotheken.


V8


Knoten 12 wird zunächst auf V8 7.4 ausgeführt und schließlich auf 7.6 aktualisiert. Das V8-Team erklärte sich bereit, ein ABI (Application Binary Interface) bereitzustellen. Bemerkenswerte Verbesserungen in V8 7.4 sind Leistungsverbesserungen für eine schnellere JavaScript-Ausführung, eine bessere Speicherverwaltung und eine verbesserte Unterstützung der ECMAScript-Syntax.



Async-Stack-Traces


Schauen wir uns diesen Code an:


 async function testAsyncStacktrace() { await killme(); return 42; } async function killme() { await Promise.resolve(); throw new Error('#Feelsbadman'); } testAsyncStacktrace().catch(error => console.log(error.stack)); 

Bei älteren Versionen erhalten Sie ungefähr Folgendes:


 Error: #Feelsbadman at killme (test.js:8:11) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:721:11) at startup (internal/bootstrap/node.js:228:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3) 

Wie Sie sehen können, wird in der Nachricht testAsyncStacktrace . Und jetzt ist das --async-stack-traces standardmäßig aktiviert, und das Protokoll sieht folgendermaßen aus:


 Error: #Feelsbadman at killme (test.js:8:11) at async testAsyncStacktrace (test.js:2:5) 

Beschleunigter Aufruf, wenn die Anzahl der Argumente nicht übereinstimmt


In JavaScript ist es durchaus akzeptabel, Funktionen mit weniger / mehr Argumenten aufzurufen (d. H. Weniger oder mehr deklarierte formale Parameter zu übergeben). Im ersten Fall ist es eine Unteranwendung , und im zweiten Fall ist es eine Überanwendung . Bei einer unzureichenden Anzahl von Argumenten sind die Parameter undefined , während sie bei einer großen Anzahl von Parametern einfach ignoriert werden.


JavaScript-Funktionen können jedoch weiterhin die tatsächlichen Parameter mithilfe der arguments , des Restparameterobjekts oder sogar mithilfe der nicht standardisierten Function.prototype.arguments in Funktionen im schlampigen Modus abrufen. Daher sollten JavaScript-Engines eine Möglichkeit bieten, die tatsächlichen Parameter abzurufen. In V8 erfolgt dies mithilfe der Argumentanpassungstechnik . Leider beeinträchtigen solche Methoden die Leistung.


In einigen Szenarien überspringt V8 die Anpassung der Argumente vollständig und reduziert den Anrufaufwand um bis zu 60%.



Details finden Sie im Dokument .


Beschleunigtes Parsen


In Chrome werden ausreichend große Skripte beim Laden in Worker-Threads analysiert. V8 7.4 hat das Problem mit der UTF-8-Decodierungsleistung behoben, was zu einer Beschleunigung von 8% führte.



Jeder Tropfen im Diagramm repräsentiert eine der Leistungsverbesserungen im Stream-Analysator.


Verbessertes await


Zusammen mit dem --async-stack-traces ist jetzt das Flag --harmony-await-optimization standardmäßig aktiviert. Details hier .


Private Klassenfelder


Die Möglichkeit, private Felder in V8 zu verwenden, wurde auf den Knoten migriert. Solche Felder sind außerhalb der Klasse nicht verfügbar. Um diese zu erstellen, müssen Sie vor der Variablen # angeben.


 class HelloThere { #hidden = 'Hidden'; get hidden() { return this.#hidden; } set hidden(txt) { this.#hidden = txt; } hi() { console.log(`Hello, ${this.#hidden}`); } } 

Wenn Sie versuchen, von außen auf #hidden zuzugreifen, wird ein Syntaxfehler #hidden .


 const hello = new HelloThere(); hello.#hidden = 'Visible'; // -> SyntaxError console.log(hello.#hidden); // -> SyntaxError 

Schnellstart


Knoten 12 verwendet den Cache für integrierte Bibliotheken, bevor er erstellt und als Binärdateien eingebettet wird. Aufgrund der Verwendung dieses Caches im Hauptthread wird die Startzeit um 30% reduziert.


TLS und Sicherheit


Noda unterstützt jetzt TLS 1.3, das verbesserte Sicherheit bietet und die Latenz verringert. TLS 1.3 hat das Protokoll stark verändert und wird aktiv in das Netzwerk integriert. Die Einführung von TLS 1.3 erhöht die Vertraulichkeit von Benutzerdaten und beschleunigt die Anforderungsverarbeitung, indem die Zeit für den Handshake in HTTPS verkürzt wird. Darüber hinaus sind TLS 1.0 und 1.1 standardmäßig deaktiviert, und veraltete Methoden wurden aus der crypto .


Dynamische Hüftgröße


Bisher wurde die Standardgröße des V8-Heapspeichers von 700 MB (32-Bit-Systeme) oder 1400 MB (64-Bit-Systeme) verwendet. Jetzt bestimmt der Knoten die Heap-Größen basierend auf dem verfügbaren Speicher, um die verwendeten Ressourcen des Computers zu optimieren.


Die Fähigkeit, die Hüfte zu entleeren


Knoten 12 bietet die Möglichkeit, Heaps zu sichern, wodurch Speicherprobleme leichter erkannt werden können. Details finden Sie hier und hier .


Experimentelle Diagnoseberichte


Noda bietet leistungsstärkere Tools zur Diagnose von Problemen (Leistung, CPU-Auslastung, Speicher, Abstürze usw.) direkt in der Anwendung und bietet eine experimentelle Funktion für Berichte.


Verbesserungen bei der Arbeit mit nativen Modulen


Knoten 12 setzt den Trend fort, die Arbeit mit der N-API zu vereinfachen. Diese Version hat die Unterstützung verbessert, insbesondere bei der Arbeit mit Arbeitsthreads.


Fazit


Knoten 12 hat viele Verbesserungen. Das vollständige CHANGELOG kann auf Github und auf der Website selbst eingesehen werden.

Source: https://habr.com/ru/post/de450292/


All Articles