image: bug: 1.3.0 could not load the sharp module

I’m not sure if this is a @nuxt/image, ipx, or sharp issue since updating to 1.3.0, @nuxt/image updates its ipx which also update its sharp.

Reproduction:

1.2.0 (Working): https://codesandbox.io/p/devbox/nuxt-image-1-2-0-build-output-8xnjr9 1.3.0 (Not working): https://codesandbox.io/p/devbox/nuxt-image-1-3-0-could-not-load-the-sharp-module-23zjtt

If needed, open a terminal in codesandbox to build and run it:

npm run build
node .output/server/index.mjs

You’ll see that 1.3.0 does not load the image in public directory properly with an error:

{
    "error": {
        "message": "[500] [IPX_ERROR] Could not load the \"sharp\" module using the linux-x64 runtime\nPossible solutions:\n- Ensure optional dependencies can be installed:\n    npm install --include=optional sharp\n    yarn add sharp --ignore-engines\n- Ensure your package manager supports multi-platform installation:\n    See https://sharp.pixelplumbing.com/install#cross-platform\n- Add platform-specific dependencies:\n    npm install --os=linux --cpu=x64 sharp\n- Consult the installation documentation:\n    See https://sharp.pixelplumbing.com/install"
    }
}

About this issue

  • Original URL
  • State: closed
  • Created 5 months ago
  • Reactions: 65
  • Comments: 40 (3 by maintainers)

Commits related to this issue

Most upvoted comments

@gorkie and others

Please refrain from posting comments that don’t add additional context like “+1”, “me too” or “bump”. Instead, just upvote the issue through reactions or provide additional context like a reproduction, a new scenario where it happens or anything else that helps resolving the issue.

Hey everyone! We are aware of the recent issues. The problem is how sharp bundles binaries for various platforms, especially causing issues when the prod environment is different than the dev/build environment.

Even downgrading my Nuxt to 3.9.1 and Nuxt Image to 1.2.0 I’m still getting the same error.

I’m on an M1 Mac, if that makes a difference.

It works for me without have to downgrade @nuxt/image package to v1.2.0, just pinning sharp to 0.32.6 and using Node v20.3.0

to pin sharp in package.json if you are using pnpm:

"resolutions": {
  "sharp": "0.32.6"
}

or using npm:

"overrides": {
  "sharp": "0.32.6"
}

I can confirm that a downgrade of @nuxt/image to v1.2.0 worked for me 👍🏼

We are using yarn v1 and falling back to sharp@0.32.6 works as a temporary fix in our projects:

"resolutions": {
  "sharp": "0.32.6"
}

This mechanism also exists for npm via overrides (untested):

"overrides": {
  "sharp": "0.32.6"
}

yeah, same here. After locking the package to 1.2.0 it works again.

Hmm… I’m facing the same issue … CleanShot 2024-01-23 at 18 15 34@2x

Edit: After reading the previous comments, finally this can be temporarily fixed by downgrading to 1.2.0

I’ve did some digging and found that for pnpm, turning on shamefully-hoist=true in .npmrc will work and shamefully-hoist=false will not. And npm works no matter what.

See:

The reason can be as follows. In sharp it imported the runtime like such:

in https://github.com/lovell/sharp/blob/main/lib/sharp.js

const paths = [
  `../src/build/Release/sharp-${runtimePlatform}.node`,
  '../src/build/Release/sharp-wasm32.node',
  `@img/sharp-${runtimePlatform}/sharp.node`,
  '@img/sharp-wasm32/sharp.node'
];

let sharp;
const errors = [];
for (const path of paths) {
  try {
    sharp = require(path);
    break;
  } catch (err) {
    /* istanbul ignore next */
    errors.push(err);
  }
}

When shamefully-hoist=false, @img/sharp-xxx does not exist in node_modules/ any more. Instead it’s in node_modules/.pnpm/@img+sharp-xxx.

Which afterwards it returns the topic error.

if (sharp) {
  module.exports = sharp;
} else {
  const [isLinux, isMacOs, isWindows] = ['linux', 'darwin', 'win32'].map(os => runtimePlatform.startsWith(os));

  const help = [`Could not load the "sharp" module using the ${runtimePlatform} runtime`];
  errors.forEach(err => {
    if (err.code !== 'MODULE_NOT_FOUND') {
      help.push(`${err.code}: ${err.message}`);
    }
  });

...

Yeap I’m also facing this issue

I’m facing the same issue …

I also reproduced this in a docker using node-alpine:20, running on Ubuntu 20. Downgrading to 1.2.0 did not solve the issue.

EDIT: In my case, I was able to fix it, by re-installing sharp (rebuild would do as well), since I was developing on Windows and Docker uses Linux.

RUN rm -rf server/node_modules/sharp && npm --prefix server install sharp

@Artem-Schander your lock file still shows version "1.3.0". I assume that your package.json contains "@nuxt/image": "^1.2.0",. Using ^ as a prefix for the version will install the latest minor version.

You will have to add "@nuxt/image": "1.2.0", to stick to the desired version.

For me this only happened in Docker environment. Using non-slim node images resolved our issue.

downgrading to 1.2.0 got no problem with me deploying to linux with docker, but when deploying with multi stage build and distroless image, it showing error, here my Dockerfile

FROM node:18-alpine as build

WORKDIR /app

COPY package*.json /app

RUN npm install

COPY . /app

RUN npm run build

FROM gcr.io/distroless/nodejs:18 as prod

WORKDIR /app

COPY --from=build /app/.output /app/.output

CMD ["/app/.output/server/index.mjs"]

@ThePlastic I had to restart my M1 Mac after downgrading to get this to work again.

Tried, no result.

+1

I’m facing the same issue on a Apple M1

In my case the issue was only when I run the app on the server, if I do

`npm run build

node .output/server/index.mjs`

everything works fine, the problem begins when I upload the build on a Centos9 and run it with PM2, there I get the:

{ "error": { "message": "[500] [IPX_ERROR] Could not load the \"sharp\" module using the linux-x64 runtime\nPossible solutions:\n- Ensure optional dependencies can be installed:\n npm install --include=optional sharp\n yarn add sharp --ignore-engines\n- Ensure your package manager supports multi-platform installation:\n See https://sharp.pixelplumbing.com/install#cross-platform\n- Add platform-specific dependencies:\n npm install --os=linux --cpu=x64 sharp\n- Consult the installation documentation:\n See https://sharp.pixelplumbing.com/install" } }

The only thing that changed something a bit was to put "@nuxt/image": "1.2.0" on my package.json dependencies.

On my local machine everything still run smoothly, but if I upload the build on the server the error now is:

{"error":{"message":"[500] [IPX_ERROR] \nSomething went wrong installing the \"sharp\" module\n\nCannot find module '../build/Release/sharp-linux-x64.node'\nRequire stack:\n- /usr/share/nginx/html/default/public/frontend/server/node_modules/sharp/lib/sharp.js\n- /usr/share/nginx/html/default/public/frontend/server/node_modules/sharp/lib/constructor.js\n- /usr/share/nginx/html/default/public/frontend/server/node_modules/sharp/lib/index.js\n\nPossible solutions:\n- Install with verbose logging and look for errors: \"npm install --ignore-scripts=false --foreground-scripts --verbose sharp\"\n- Install for the current linux-x64 runtime: \"npm install --platform=linux --arch=x64 sharp\"\n- Consult the installation documentation: https://sharp.pixelplumbing.com/install"}}

Hmm… I’m facing the same issue … CleanShot 2024-01-23 at 18 15 34@2x

Edit: After reading the previous comments, finally this can be temporarily fixed by downgrading to 1.2.0

Unfortunately, it didn’t help me… in fact, it’s a pity that the minor version completely disables the library…

@Artem-Schander your lock file still shows version "1.3.0". I assume that your package.json contains "@nuxt/image": "^1.2.0",. Using ^ as a prefix for the version will install the latest minor version.

You will have to add "@nuxt/image": "1.2.0", to stick to the desired version.

you’re right. should have noticed myself. sorry for the noise.

Yeah, ipx 3.0 + sharp 0.33 = bad.

Tried pinning sharp to 0.32 - still broken.

Only downgrading back to nuxt/image 1.2.x resolves it (which resolves to ipx 2.x and sharp 0.32)