Tous les guides
Déployer5 min de lecture

L’erreur « Cannot find native binding »

Le message vous oriente vers un bug de npm et vous conseille de supprimer votre verrou de dépendances. Ce conseil règle un cas sur deux. Dans l’autre, le plus fréquent aujourd’hui, vous pouvez supprimer et réinstaller autant que vous voulez : l’erreur revient à l’identique, parce qu’elle tient à la version de Node. Deux commandes suffisent pour savoir dans quel cas vous êtes.

Ce que ce guide démontre

  • Les deux causes reproduites séparément, avec la sortie exacte de chacune.
  • La preuve que le conseil du message ne corrige pas la première.
  • Deux commandes pour savoir laquelle vous touche.

Le message

$ npm ci && npx vite build, sous Node 22.11.0
Error: Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
    at file:///app/node_modules/rolldown/dist/shared/binding-BbrDfv1x.mjs:602:34
    at file:///app/node_modules/rolldown/dist/shared/binding-BbrDfv1x.mjs:9:49
Sortie réelle, dans un conteneur node:22.11.0 (linux/amd64), le 23 septembre 2026.

rolldown, le moteur de compilation de Vite 8, est écrit en Rust. Il est livré sous forme d’un binaire par système : un pour macOS sur puce Apple, un pour Linux x64, et ainsi de suite. npm n’installe que celui de la machine, en le traitant comme une dépendance optionnelle. Le message dit simplement que ce binaire est absent de node_modules. Il ne dit pas pourquoi, et il y a deux raisons possibles.

Savoir laquelle vous touche

terminal
node -v
grep -c '"node_modules/@rolldown/binding-linux-x64-gnu"' package-lock.json
À lancer là où la compilation échoue : votre CI, le conteneur de l’hébergeur, ou votre machine.
Ce que vous obtenezLa causeLa correction
Node sous 22.12 (ou sous 20.19 en 20.x)Node trop ancien : npm écarte le binaire sans le dire.Passer à Node 22.12 ou plus.
Node assez récent, et 0 au grepLe verrou ne connaît pas le binaire Linux.Régénérer le verrou, ou ne pas l’envoyer.

Cause 1 : Node est trop ancien

Le binaire Linux de rolldown déclare lui-même la version de Node qu’il accepte : ^20.19.0 || >=22.12.0. Sous Node 22.11, npm constate qu’il ne convient pas et, puisque c’est une dépendance optionnelle, il la saute. Sans erreur, sans même un avertissement à son nom. Il faut le mode le plus bavard de npm pour le voir.

$ npm ci --loglevel=silly | grep binding-linux-x64-gnu, puis ls node_modules/@rolldown
npm verbose reify failed optional dependency /app/node_modules/@rolldown/binding-linux-x64-gnu

pluginutils
Sortie réelle, sous Node 22.11.0, le 23 septembre 2026.

Le dossier @rolldown ne contient que pluginutils : aucun binaire. Sous Node 22.12, avec le même projet et le même verrou, on y trouve binding-linux-x64-gnu et la compilation passe. Le seul indice visible pendant l’installation est un avertissement EBADENGINE au nom de rolldown et de vite, qui défile bien avant l’erreur.

C’est ici que le conseil du message égare. Nous l’avons suivi à la lettre sous Node 22.11 : suppression du verrou et de node_modules, puis npm i.

$ rm -rf node_modules package-lock.json && npm i && npm run build (lignes EBADENGINE et erreur)
npm warn EBADENGINE   package: '@vitejs/plugin-react@6.1.1',
npm warn EBADENGINE   package: 'vite@8.3.0',
npm warn EBADENGINE   package: 'oxlint@1.85.0',
npm warn EBADENGINE   package: 'rolldown@1.2.9',

Error: Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
Sortie réelle, sous Node 22.11.0, sur le gabarit Vite 8 + React de create-vite, le 23 septembre 2026.

Même erreur, mot pour mot. La correction est ailleurs : déclarer une version suffisante dans le projet. Les versions testées une à une, et la façon de la déclarer chez chaque hébergeur, sont dans notre guide sur l’erreur « styleText », qui touche les versions encore plus anciennes.

package.json
{
  "engines": {
    "node": ">=22.12"
  }
}
Au moins 22.12 : « 22 » tout court peut encore vous donner 22.11 selon l’environnement.

Cause 2 : le verrou ne connaît pas le binaire Linux

C’est le défaut de npm que cite le message, ouvert en 2022. Dans certaines conditions, un package-lock.json fabriqué sur un Mac n’enregistre que le binaire macOS. npm ci, qui installe exactement ce que dit le verrou, n’a alors rien à installer pour Linux.

Nous avons reproduit cet état en retirant du verrou les entrées des binaires non macOS, puis compilé sous Node 22.14, une version suffisante. Seul le binaire manque : le message est le même.

$ npm ci && npx vite build, verrou sans les entrées Linux, sous Node 22.14.0
Error: Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
Sortie réelle, dans un conteneur node:22.14.0 (linux/amd64), le 23 septembre 2026.

Ici, le conseil du message est le bon. Régénérez le verrou avec un npm récent, qui enregistre les binaires de toutes les plateformes. Celui que nous avons fabriqué sur Mac avec npm 11 en listait quinze, Linux compris, et se compilait sans erreur sous Linux.

terminal
rm -rf node_modules package-lock.json
npm i
grep -c '"node_modules/@rolldown/binding-linux-x64-gnu"' package-lock.json
Sur votre machine, puis committez le nouveau verrou.

Si vous ne pouvez pas régénérer le verrou, n’envoyez pas de verrou du tout : le serveur résoudra les dépendances lui-même, sous Linux.

Sources

  1. [1]npm/cli, ticket 4828, le défaut des dépendances optionnelles absentes du verrou, cité par le message de rolldown.
  2. [2]Le paquet @rolldown/binding-linux-x64-gnu, champ engines : ^20.19.0 || >=22.12.0, relevé dans le verrou de rolldown 1.2.9.
  3. [3]Nos essais, images Docker officielles node:22.11.0, 22.12.0 et 22.14.0 en linux/amd64, projet Vite 8.3.0, le 23 septembre 2026.

Votre projet en ligne. Hébergé en Suisse.

Un dépôt, une archive ou un site déjà en ligne. On détecte, on compile, on met en ligne en HTTPS. 30 jours offerts.