sharp: Cannot find module '../build/Release/sharp-{platformAndArch}.node on typescript project
Possible install-time or require-time problem
- I have read the documentation relating to installation.
- I have ensured that the architecture and platform of Node.js used for
npm installis the same as the architecture and platform of Node.js used at runtime.
Are you using the latest version of sharp?
- I am using the latest version of
sharpas reported bynpm view sharp dist-tags.latest.
If you cannot confirm this, please upgrade to the latest version and try again before opening an issue.
If you are using another package which depends on a version of sharp that is not the latest, please open an issue against that package instead.
Is this a problem with filesystem permissions? NO
If you are using npm v6 or earlier and installing as a root or sudo user, have you tried with the npm install --unsafe-perm flag?
If you are using npm v7 or later, does the user running npm install own the directory it is run in?
If you are using the ignore-scripts feature of npm, have you tried with the npm install --ignore-scripts=false flag?
What is the complete output of running npm install --verbose sharp?
Too Long, but no visible error during this step.
What is the output of running npx envinfo --binaries --system --npmPackages=sharp --npmGlobalPackages=sharp?
System: OS: macOS 12.2 CPU: (8) x64 Apple M1 Memory: 35.98 MB / 8.00 GB Shell: 5.8 - /bin/zsh Binaries: Node: 14.19.0 - ~/.nvm/versions/node/v14.19.0/bin/node Yarn: 1.22.17 - ~/.nvm/versions/node/v14.19.0/bin/yarn npm: 6.14.16 - ~/.nvm/versions/node/v14.19.0/bin/npm npmPackages: sharp: ^0.30.2 => 0.30.2
Suspicions and additional context
I do understand the platform and arch are different but sharp is clever enough to detect the platform and install the appropriate pre-built binaries. In addition, the installation process is restarted on the lambda. Lastly, this error is only occuring at runtime. Project is setup to use typescript. I have tried using different kinds of imports like require(‘sharp’), import {sharp} from ‘sharp’, import * as sharp from ‘sharp’ and import sharp from ‘sharp’ as in other issues but with no luck.
Error on lambda function

@lovell does this library currently support typescript? I dove deep into the documentation but could not find how to use it with typescript. This image shows the error I was encountering both on my local on Mac and on AWS lambda. Please assist.
Error on M1 showing the file actually exists

About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 15 (8 by maintainers)
@SayefReyadh I found a good solution that should be added to the sharp docs, I think.
You can set this up quite easily by using the
NodejsFunctionfromaws-cdk-lib/aws-lambda-nodejs. It has esbuild as bundler built in and allows for some useful bundling configurations, which help in this case:node_modulesfile and not bundle them into the final .js fileSHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch= arm64 --platform=linux --libc=glibc sharp. I tested it with setting the Lambda architecture toArchitecture.ARM_64and it workedJust as a reminder, this is for
cdkLambda projects using sharpHere is a code snippet:
For AWS lambda deployment with Sharp module from
win32-x64OS, the following worked for me when using serverless, esbuild and serverless-esbuild. Changed theserverless.ymlfile with the below configuration. It is basically telling esbuild to download sharp again with the following --arch=x64 --platform=linux considering your lambda uses x64 arch. Check serverless-esbuild packager and packagerOptions options for more understanding.Note: If you are using AWS code build for automatic deployment no other additional script was needed for my end. Also, you need to comment out the script
npm install --arch=x64 --platform=linux sharpwhile testing with serverless-offline fromwin32-x64OS@SayefReyadh Thanks for the hint. As far as I can see the mentioned PR is not relevant here. The cdk setup with esbuild seems to be different from serverless.
I managed to get it to work which also made me realized what is missing. Since we have to mark
sharpas external dependency with esbuild, we have to make sure the lib the present in the lambda function. For this I had to change the Lambda setup in cdk from using a single js file (which was the whole point for using esbuild) to create an S3 asset with all the files (including the node_modules). In the end I did a hybrid version. I created the single js file bundle with esbuild but excludedsharpand then added another package.json that only hassharpas dependency to create a node_modules only withsharpand its dependencies (I then also had to run the code that installssharpfor the right target architecture) and upload all of that to S3 as my Lambda code.Not a great solution, I think. Ideally I would like to just use esbuild without marking sharp as external but I guess that is not possible due to the compiled source files. Another option would be to offer a lambda layer with
sharpand all it’s dependencies installed. I saw that people created this but it wasn’t very well maintained. Would be better to offer this from the main maintainer.Thank you, this pins down the challenge I was having. Thank you for your amazing library!
I’ve just added a section to the docs (not published yet) about use with esbuild - see https://github.com/lovell/sharp/blob/main/docs/install.md#esbuild