Layer 8Ehrlicher Tech-Support

Nach dem Node-Update lädt das native Modul nicht (ABI-Bruch)

Node aktualisiert, schon streikt ein natives Addon. Warum V8-Addons pro Hauptversion neu kompiliert werden müssen und Node-API das Problem löst.

Aufwand:
ca. 25 Min.

Das Symptom

Du hebst Node von einer Hauptversion auf die nächste – ein Kommando, eine Minute – und die Anwendung startet nicht mehr. Der Stacktrace zeigt keine Zeile deines Codes, sondern das Laden einer .node-Datei tief in node_modules. Irgendein Paket, das du nie bewusst installiert hast, sondern das als Abhängigkeit einer Abhängigkeit mitkam.

Der Quelltext hat sich nicht geändert. Das Lockfile hat sich nicht geändert. Geändert hat sich nur die Zahl hinter node --version.

Die „Layer 8“-Wahrheit

Native Addons sind kein JavaScript. Es sind kompilierte Binärdateien, die direkt gegen die C++-Innereien von Node und gegen V8 gebaut wurden – und die Node-Doku macht daraus kein Geheimnis: „The V8 API can, and has, changed dramatically from one V8 release to the next (and one major Node.js release to the next). With each change, addons may need to be updated and recompiled in order to continue functioning.“ Übersetzt: Diese Binärdatei war nie für die Node-Version gebaut, die du gerade installiert hast, und sie tut auch nicht so als ob.

Das Unangenehme daran ist die Verteilung der Schuld. Du hast nichts falsch gemacht, das Paket auch nicht – die Kombination passt nur nicht. Und weil das Paket typischerweise drei Ebenen tief in der Abhängigkeitskette sitzt, hat niemand in deinem Team es je bewusst ausgewählt. Ein Node-Update ist deshalb nie nur ein Node-Update, sondern immer auch ein Test darauf, ob alle kompilierten Anteile deines Baums für die neue Version verfügbar sind.

Dass das überhaupt noch ein Alltagsproblem ist, ist ein Erbe. Node-API ist ausdrücklich als Ausweg gebaut: „This API will be Application Binary Interface (ABI) stable across versions of Node.js. It is intended to insulate addons from changes in the underlying JavaScript engine and allow modules compiled for one major version to run on later major versions of Node.js without recompilation.“ Wer Node-API benutzt, hat dieses Problem nicht mehr. Wer weiter direkt gegen v8.h baut, hat es bei jeder Hauptversion wieder – und du erbst es mit.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Feststellen, welche Node-Version jetzt tatsächlich läuft

    Der Bruch entsteht am Wechsel der Hauptversion. Zuerst klären, von wo nach wo gesprungen wurde – auch Versionsmanager wechseln die Version manchmal unbemerkt beim Verzeichniswechsel:

    node --version
    
  2. 2.

    Das betroffene Paket identifizieren

    Die Fehlermeldung nennt den Pfad der nicht ladbaren Binärdatei. Der Verzeichnisname darin ist das Paket, um das es geht – nicht das Paket, das den Import ausgelöst hat:

    ls node_modules/<paket>/build/Release/
    
  3. 3.

    Die kompilierten Anteile für die aktuelle Version neu erzeugen

    Das vorhandene Binärartefakt gehört zu der alten Node-Version und ist wertlos. node_modules und das Rebuild-Ergebnis verwerfen und frisch bauen lassen:

    rm -rf node_modules
    npm ci
    
  4. 4.

    Wenn das nicht reicht: gezielt neu bauen

    Kommen vorgebaute Binärdateien zum Einsatz, die für die neue Version noch fehlen, hilft ein erzwungener Neubau aus dem Quelltext. Dafür muss eine C++-Toolchain auf dem Rechner sein:

    npm rebuild --build-from-source
    
  5. 5.

    Auf Dauer: Pakete bevorzugen, die Node-API benutzen

    Node-API ist laut Node-Doku ABI-stabil über Node-Versionen hinweg und soll Addons gegen Änderungen der JavaScript-Engine abschirmen. Für eine Hauptversion kompilierte Module laufen damit ohne Neuübersetzung auch auf späteren Hauptversionen – der Bruch entfällt schlicht.

Häufige Fragen (FAQ)

?Warum trifft es nur manche Pakete?

Weil es nur native Addons trifft, also Pakete mit kompiliertem C- oder C++-Code. Reine JavaScript-Pakete haben keine Binärschnittstelle, die brechen könnte. Und unter den nativen Addons trifft es nur die, die direkt gegen die V8- oder Node-C++-Header gebaut sind – nicht die, die Node-API benutzen.

?Hilft es, node_modules zu löschen und neu zu installieren?

Meistens ja, weil dabei die kompilierten Anteile neu gebaut oder passend vorgebaut heruntergeladen werden. Das ist aber Symptombehandlung: Beim nächsten Sprung auf eine neue Node-Hauptversion steht dasselbe Problem wieder da, solange das Paket nicht auf Node-API umgestellt ist.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

  1. [1]
    Node.js Dokumentation – Node-API (ABI-Stabilität)

    nodejs.org · abgerufen am

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWLästig

npm meldet Schwachstellen (vulnerabilities)

npm warnt nach der Installation vor Sicherheitslücken? Nicht jede ist gefährlich — und ein blindes npm audit fix kann mehr kaputt machen, als es behebt.