veilletech.fr
6 nov. Feed du jour
#02 NODE Article

Node.js 27 : v8.serialize illisible par Node 26

Entre Node 26 et 27, vos données sérialisées ne vont que dans un sens.

Node.js 27 alpha passe de V8 14.6 à 15.6. Le format de sérialisation de V8 change : ce que v8.serialize() écrit n'est plus lisible par les versions précédentes, la limite par défaut du tas double sur une machine de 8 Go, et Math, le tri ou error.stack changent de comportement à la marge. C'est la phase où ces ruptures sont autorisées, avant la LTS.

4 min de lectureavancévidéo 1:21
Partager
Sommaire8 sections
  1. Ce qui se passe
  2. Sérialisation : compatible dans un seul sens
  3. Mémoire : les défauts bougent
  4. Comportements JavaScript qui changent
  5. Outillage et diagnostics
  6. Ce qui arrive
  7. Comment s'y prendre
  8. À retenir

Ce qui se passe

Node.js 27, en phase alpha, embarque V8 15.6, contre V8 14.6 pour Node.js 26. Joyee Cheung en détaille les changements notables sur le blog du projet. Le contexte compte : avec le nouveau calendrier de Node.js, les phases Alpha et Current peuvent recevoir des ruptures de V8 ; celles qui touchent l'ABI des modules natifs s'accompagnent d'un saut de NODE_MODULE_VERSION. Une fois la ligne 27 en LTS, sa version de V8 est censée ne plus bouger.

Sérialisation : compatible dans un seul sens

v8.serialize(), structuredClone() et postMessage adoptent un nouveau format. Node 27 relit les données écrites par les versions précédentes, mais l'inverse échoue, sur une erreur « invalid or unsupported version ». Tout ce qui persiste la sortie de v8.serialize() — cache sur disque, file de messages, état partagé pendant un déploiement progressif où deux versions tournent côte à côte — casse dès que l'ancienne version lit ce que la nouvelle a écrit.

Le nouveau format accepte, dans structuredClone() et postMessage, des typed arrays et des ArrayBuffer redimensionnables de plus de 4 Go ; v8.serialize() garde la limite de 4 Go. Autre effet de bord : v8.cachedDataVersionTag() change désormais à chaque patch que Node applique sur V8, si bien que le cache de compilation des modules et les données en cache de vm.Script sont invalidés plus souvent d'une version à l'autre.

Mémoire : les défauts bougent

Comportements JavaScript qui changent

Outillage et diagnostics

Ce qui arrive

JavaScript
Math.sumPrecise([0.1, 0.2, 0.3]);                 // 0.6, sans erreur d'arrondi cumulée
[1, 2, 3].values().map((x) => x * 2).join('-');   // '2-4-6'
Iterator.zip([[1, 2], ['a', 'b']]).toArray();     // [[1, 'a'], [2, 'b']]

S'y ajoutent Iterator.prototype.includes(), Iterator.zipKeyed() et Intl.Locale.prototype.variants. Côté performance, les pires pauses du ramasse-miettes passent d'environ 45 ms à 10 ms dans les bancs de V8, et les expressions régulières sont compilées en code machine dès leur premier usage.

Comment s'y prendre

  1. Ajoutez Node 27 alpha à votre CI, en tâche non bloquante.
  2. Recensez ce qui relit des données produites par v8.serialize() sur une autre version de Node.
  3. Fixez --max-old-space-size là où la mémoire doit rester contenue.
  4. Nettoyez vos scripts de lancement des drapeaux --experimental-wasm-*.

Source : blog Node.js, billet de Joyee Cheung. Source en anglais.