« Could not load the sharp module » : le binaire Linux n’a jamais été installé.
Depuis la version 0.33, sharp place son code natif dans des paquets distincts par plateforme, comme @img/sharp-linux-x64, installés en dépendances facultatives. L’erreur veut dire que ce paquet manque dans node_modules sur le serveur. En général, le fichier de verrouillage a été créé sous macOS ou Windows sans les entrées Linux. Régénérez-le et redéployez.
Faits vérifiés le
Le message exact
sharp affiche l’environnement d’exécution qu’il a cherché, puis une liste de pistes. Sur un serveur Linux x64, ça donne :
Error: Could not load the "sharp" module using the linux-x64 runtime
Possible solutions:
- Ensure optional dependencies can be installed:
npm install --include=optional sharp
- Ensure your package manager supports multi-platform installation:
See https://sharp.pixelplumbing.com/install#cross-platform
- Add platform-specific dependencies:
npm install --os=linux --cpu=x64 sharp
- Consult the installation documentation:
See https://sharp.pixelplumbing.com/installPourquoi le binaire disparaît
Le paquet sharp lui-même ne contient aucun binaire précompilé. Ses optionalDependencies comptent un paquet par plateforme : @img/sharp-darwin-arm64, @img/sharp-win32-x64, @img/sharp-linux-x64, @img/sharp-libvips-linux-x64, etc. Chacun déclare le système et le processeur visés, et le gestionnaire de paquets n’installe que ceux qui correspondent à la machine qui fait l’installation.
L’installation sur le serveur doit donc trouver les entrées Linux dans votre fichier de verrouillage, et avoir le droit d’installer les dépendances facultatives. Si l’une des deux conditions manque, l’installation réussit quand même. L’erreur n’apparaît qu’au premier require('sharp') : pendant la compilation si elle traite des images, sinon dans les journaux de l’appli au premier redimensionnement.
Les causes, et le correctif de chacune
| Cause | Comment le savoir | Correctif |
|---|---|---|
package-lock.json a été régénéré sous macOS ou Windows alors que node_modules existait : npm n’a noté que le paquet sharp de cette machine (bogue npm #4828) † † | grep '@img/sharp-linux' package-lock.json ne trouve rien | Supprimez node_modules et package-lock.json, lancez npm install, versionnez le nouveau fichier. Ou ajoutez le paquet explicitement : npm install --os=linux --cpu=x64 sharp |
Les dépendances facultatives ont été sautées : --omit=optional, --no-optional ou optional=false dans .npmrc † | Votre commande d’installation ou .npmrc parle de « optional » | Retirez l’option. Le message de sharp propose npm install --include=optional sharp |
| pnpm ou Yarn n’ont installé que pour la machine courante, et le fichier ou le magasin a servi sur deux plateformes † | Un monodépôt ou une image Docker construite sur un Mac | Ajoutez Linux à supportedArchitectures (exemple plus bas) |
node_modules a été copié depuis votre poste : un COPY . . Docker sans .dockerignore, ou une archive qui inclut node_modules † | Le serveur n’a jamais fait d’installation | Excluez node_modules et installez sur la cible. Copier ce dossier d’une plateforme à l’autre cause des erreurs de chargement de modules natifs |
| sharp 0.32 ou plus ancien, installé avec les scripts désactivés † | npm ls sharp affiche 0.32.x ou moins | Ces versions téléchargent libvips et le binaire dans leur script d’installation. Passez à sharp 0.33 ou plus récent |
| Node.js est plus ancien que ce que sharp prend en charge † | Le message dit Please upgrade Node.js avec des lignes Found et Requires | sharp 0.35 exige Node 20.9.0 ou plus récent. Montez la version de Node |
† Les détails sur les concurrents proviennent des pages publiées par chaque fournisseur aux dates indiquées; les prix et forfaits changent, vérifiez auprès du fournisseur avant de décider. `package-lock.json` a été régénéré sous macOS ou Windows alors que `node_modules` existait : npm n’a noté que le paquet sharp de cette machine (bogue npm #4828) (2026-10-29) · `package-lock.json` a été régénéré sous macOS ou Windows alors que `node_modules` existait : npm n’a noté que le paquet sharp de cette machine (bogue npm #4828) (2026-10-29) · Les dépendances facultatives ont été sautées : `--omit=optional`, `--no-optional` ou `optional=false` dans `.npmrc` (2026-10-29) · pnpm ou Yarn n’ont installé que pour la machine courante, et le fichier ou le magasin a servi sur deux plateformes (2026-10-29) · `node_modules` a été copié depuis votre poste : un `COPY . .` Docker sans `.dockerignore`, ou une archive qui inclut `node_modules` (2026-10-29) · sharp 0.32 ou plus ancien, installé avec les scripts désactivés (2026-10-29) · Node.js est plus ancien que ce que sharp prend en charge (2026-10-29)
Vérifiez le fichier de verrouillage avant de pousser
C’est le correctif dans la plupart des cas avec npm. Les paquets Linux figurent dans package-lock.json sous node_modules/@img/sharp-linux-x64 et node_modules/@img/sharp-libvips-linux-x64. Si un npm install ultérieur sur votre poste les fait disparaître, refaites la vérification : certaines versions de npm 11 ont, semble-t-il, ramené le bogue.
# 1. Does the lockfile list sharp's Linux packages?
grep -c '"node_modules/@img/sharp-linux-x64"' package-lock.json
grep -c '"node_modules/@img/sharp-libvips-linux-x64"' package-lock.json
# 2. If either prints 0, regenerate the lockfile from scratch
rm -rf node_modules package-lock.json
npm install
grep -c '"node_modules/@img/sharp-linux-x64"' package-lock.json # should be 1 now
# 3. Commit it
git add package-lock.json
git commit -m "lockfile: include sharp's Linux binaries"pnpm et Yarn
pnpm et Yarn 3+ lisent un réglage supportedArchitectures qui installe aussi les dépendances facultatives d’autres plateformes. Il ne sert que lorsqu’une même arborescence doit fonctionner sur deux plateformes, comme une image Docker construite à partir du magasin d’un Mac. Une installation normale sur le serveur choisit Linux d’elle-même.
# pnpm-workspace.yaml: also install the Linux binaries on a Mac or Windows machine
supportedArchitectures:
os:
- current
- linux
cpu:
- current
- x64Ce qui s’applique sur Canner
- L’installation se fait sous Linux, à la compilation. Canner lance l’installation figée de votre gestionnaire de paquets (
npm ci,pnpm install --frozen-lockfile, etc.) avec--ignore-scripts. Il ne passe pas--omit=optional: les paquets Linux s’installent dès que votre fichier de verrouillage les mentionne. - `--ignore-scripts` n’est pas en cause pour sharp 0.33 et plus. Ces versions tirent leur binaire des paquets facultatifs, pas d’un script d’installation (sharp 0.35 n’en a plus du tout).
- L’avertissement du journal de compilation. Quand sharp figure dans
dependenciesoudevDependencies, le journal affiche[canner] ⚠ Native modules need a postinstall allowlist (sharp). Avec un sharp récent, vous pouvez ajouter"canner": { "allowedBuildScripts": ["sharp"] }àpackage.jsonpour le faire taire, sans effet néfaste. Avec pnpm,"pnpm": { "onlyBuiltDependencies": ["sharp"] }fonctionne aussi. Avec Yarn, la liste n’a aucun effet : Yarn n’a pas de commande de recompilation. - Un vieux sharp ne fonctionnera pas. Canner relance les scripts autorisés sans accès au réseau : le script de sharp 0.32 ne peut pas télécharger ce qu’il lui faut. Mettez-le à jour.
- Next.js. Next 16 déclare
sharpcomme dépendance facultative denext: inutile de l’ajouter vous-même. Les règles sur le fichier de verrouillage s’appliquent quand même. - Où le voir. Si votre compilation charge sharp, l’erreur est dans le journal de compilation. Sinon, elle est dans les journaux de l’appli, sur la page Journaux, à la première requête d’image. Voir journaux et erreurs.
Reproduire l’erreur en local
Un conteneur Linux propre installe exactement ce que dit votre fichier de verrouillage. Si sharp ok ne s’affiche pas ici, ça ne marchera sur aucun hôte Linux :
# Install the way a Linux server does, from a copy so your own node_modules is untouched
docker run --rm -v "$PWD":/src:ro node:22 sh -c \
"cp -r /src /app && cd /app && rm -rf node_modules \
&& npm ci --ignore-scripts && node -e \"require('sharp'); console.log('sharp ok')\""Questions
Pourquoi sharp marche-t-il sur mon Mac et pas sur le serveur?
Votre Mac a @img/sharp-darwin-arm64 (ou la version x64); le serveur a besoin de @img/sharp-linux-x64. Si votre fichier de verrouillage ne note que le paquet du Mac, le serveur n’installe jamais celui de Linux.
Est-ce que `npm rebuild sharp` règle le problème?
Pas quand le paquet de plateforme manque. Une recompilation exécute les scripts des paquets déjà installés; elle n’ajoute pas @img/sharp-linux-x64. Corrigez plutôt le fichier de verrouillage.
Faut-il ajouter sharp à allowedBuildScripts sur Canner?
Pas pour sharp 0.33 ou plus récent : le binaire vient d’une dépendance facultative. L’ajouter ne fait que taire l’avertissement du journal. sharp 0.32 ou plus ancien a besoin du réseau dans son script d’installation, ce que l’étape de recompilation de Canner n’offre pas : mettez-le à jour.
Existe-t-il une solution de rechange sans binaire natif?
sharp peut tourner en WebAssembly avec le paquet facultatif @img/sharp-wasm32 (npm install sharp @img/sharp-wasm32). C’est plus lent que la version native; réservez-le aux plateformes sans binaire précompilé.
À lire aussi
- GuideSvelteKit : « Cross-site POST form submissions are forbidden »
- GuideDjango : DisallowedHost et CSRF 403 en production
- GuideContenu mixte derrière un proxy : par cadriciel
- GuideErreurs CORS qui n’arrivent qu’en production
- RubyHébergement Ruby on Rails au Canada
- PythonHébergement Django au Canada
Déployez avec un journal qui nomme le problème.
Canner signale les modules natifs avant qu’ils échouent à l’exécution. L’interface en ligne de commande diffuse le même journal dans votre terminal.