Canvas macOS issue

February 20, 2024 · Updated on March 28, 2025

Recently, while working on a project using Jest for testing, I encountered an issue that was weird. The error message was clear: Cannot find module '../build/Release/canvas.node'.

This error hinted at a missing file that bindings.js was attempting to reference but no luck!

The problem

The root of the problem lies in a missing file that is crucial for the Node canvas package, which many projects depend on for handling images and graphics. This can be particularly problematic on macOS, where certain dependencies might not be correctly installed or linked.

The solution

After some digging and experimentation, I pieced together a solution that resolved the issue. Here's a step-by-step guide:

  1. Install Necessary Dependencies

    Begin by opening your terminal and executing the following command. This installs critical packages such as pkg-config, cairo, pango, libpng, jpeg, giflib, and librsvg:

    brew install pkg-config cairo pango libpng jpeg giflib librsvg

    These packages are essential for the canvas module to function properly on macOS.

  2. Clean Slate Approach

    Next, it's often a good idea to start with a clean slate to ensure no corrupted or outdated files interfere with the installation. Remove your existing node_modules directory:

    rm -rf node_modules
  3. Reinstall Node Packages

    With the dependencies in place and a fresh start, proceed to reinstall your node packages:

    npm i

    This step will ensure that all packages, including canvas, are correctly installed with the necessary bindings.

And, viola it’s fixed!

Resources

  1. I found this solution originally at Flavio’s blog.
  2. There’s a related Github issue that you can find here.

tl;dr

If you're facing the Cannot find module '../build/Release/canvas.node' error on macOS, it's likely due to missing dependencies for the Node canvas package. Install the necessary packages using Homebrew, clear your node_modules, and reinstall your Node packages to resolve the issue.