Diagnosing and Fixing node-sass Installation Failures
Common failure modes for installing node-sass almost always trace back to how its native binary (binding.node) is resolved. The npm package installs the JavaScript wrapper, then attempts to obtain a prebuilt binary that matches you're OS, CPU, and Node ABI. If that fetch fails or the ABI doesn’t match, node-sass falls back to compiling from source.
Typical enstall flow (example using Node v10.15.x):
- Check if a compatible binary is already present in node_modules/vendor or cache.
- If not, install the node-sass package from the registry (npm install node-sass).
- Try to locate a cached binding.node in the global cache; skip download if found.
- If missing, download binding.node from a mirror (default: GitHub releases) into vendor and cache.
- If the download fails, build the binary locally with node-gyp and system toolchains.
- Write/refresh the lockfile.
Sample output (paths and versinos vary by platform):
> npm i node-sass
> node-sass@4.13.1 install C:\work\demo\node_modules\node-sass
> node scripts/install.js
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.13.1/win32-x64-64_binding.node
Saved to C:\work\demo\node_modules\node-sass\vendor\win32-x64-64\binding.node
Cached to C:\Users\you\AppData\Roaming\npm-cache\node-sass\4.13.1\win32-x64-64_binding.node
> node-sass@4.13.1 postinstall C:\work\demo\node_modules\node-sass
> node scripts/build.js
Binary found at vendor\win32-x64-64\binding.node
Testing binary
Binary is fine
Reasons installations fail and concrete fixes
- Slow or unreachable npm registry
When pulling the package itself is slow (common in certain networks), switch the npm registry to a closer mirror.
Using npm config:
npm config set registry https://registry.npm.taobao.org
# or a modern mirror
# npm config set registry https://registry.npmmirror.com
Using a project-level .npmrc:
# .npmrc
registry=https://registry.npm.taobao.org/
# registry=https://registry.npmmirror.com/
- Downloading the prebuilt binary (binding.node) is blocked or slow
The JavaScript package is not enough—node-sass requires a native binding. By default it’s fetched from GitHub releases, which may be throttled or blocked. Point SASS_BINARY_SITE to a mirror.
POSIX shells (Linux/macOS):
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
# or
# SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass/ npm ci
Windows CMD:
set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ && npm install node-sass
# or
# set SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass/ && npm ci
Persist via .npmrc:
# .npmrc
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
# sass_binary_site=https://npmmirror.com/mirrors/node-sass/
Other native-binary packages often need mirrors as well:
# .npmrc
sass_binary_site=https://npm.taobao.org/mirrors/node-sass
chromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriver
electron_mirror=https://npm.taobao.org/mirrors/electron
phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs
- Node version and node-sass version (ABI) mismatch
node-sass binary are built per Node ABI (process.versions.modules). If your Node is too new or too old for the node-sass version being installed, the installer cannot find a matching binary and either fails or attempts a source build.
Minimum node-sass versions for common Node lines:
- Node 13 → node-sass 4.13+ (ABI 79)
- Node 12 → node-sass 4.12+ (ABI 72)
- Node 11 → node-sass 4.10+ (ABI 67)
- Node 10 → node-sass 4.9+ (ABI 64)
- Node 8 → node-sass 4.5.3+ (ABI 57)
Check your ABI quickly:
node -p "process.versions"
# or just the ABI
node -p "process.versions.modules"
Example output on Node 10:
{
http_parser: '2.8.0',
node: '10.15.3',
v8: '6.8.275.32-node.51',
uv: '1.23.2',
zlib: '1.2.11',
ares: '1.15.0',
modules: '64',
nghttp2: '1.34.0',
napi: '3',
openssl: '1.1.0j',
icu: '62.1'
}
If the ABI does not match the downloadable binary for your node-sass version, either downgrade/upgrade Node or adjust the node-sass version to a compatible one.
- Cached binary does not match the current environment
Switching Node versions or moving between machines can leave a stale binary in cache or vendor. Errors often include a hint like:
Found bindings for the following environments:
- Windows 64-bit with Node.js 6.x
Fix by rebuilding or clearing caches:
# in the project
npm rebuild node-sass
# or force a clean reinstall
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
On Windows (PowerShell):
rm -r -fo node_modules
rm package-lock.json
npm cache clean --force
npm i
- Reinstalling after a partial/failed install
If an installation aborted mid-way, locked files or partially written vendor directories can break subsequent attempts. Remove the package and try again cleanly:
npm uninstall node-sass
rm -rf node_modules\node-sass
npm install node-sass
If the uninstall fails due to permissions, ensure the folder is removed manually before reinstalling.
- Local build fallback requires build tools (Python, compiler toolchains)
When the prebuilt binary cannot be downloaded, node-sass falls back to building binding.node locally with node-gyp. This requires:
- Python (v2.7 for very old setups; modern node-gyp supports Python 3)
- C/C++ build tools
- Windows: Visual Studio Build Tools (MSVC) and proper environment variables
- macOS: Xcode Command Line Tools
- Linux: build-essential (GCC, make), and other headers as needed
If you’ve configured mirrors correctly but still see "python not found" or build failures, install the toolchain and retry:
Windows (elevated PowerShell):
# Ensure Python 3 in PATH and VS Build Tools installed
npm config set msvs_version 2019
npm rebuild node-sass --force
macOS/Linux:
# Ensure Python and compilers are available
xcode-select --install # macOS
sudo apt-get update && sudo apt-get install -y build-essential python3 # Debian/Ubuntu
npm rebuild node-sass --force
When possible, align Node and node-sass versions so that a prebuilt binary is available to avoid local compilation entirely.