安装node-sass有以下几个步骤:
binding.node
,如有即跳过安装;binding.node
则从github下载该二进制文件并将其缓存到全局;binding.node
下载失败,则尝试本地编译出该文件;package-lock.json
;由此看到,实际上node-sass依赖了一个二进制文件binding.node
,从npm源安装完本体后还会从github下载binding.node
。
因此安装node-sass相关的失败原因有以下几种:
由于众所周知的国内网络环境,从国内安装官方源的依赖包会很慢。可以将npm源设置成国内镜像源(如淘宝npm):
npm config set registry https://registry.npm.taobao.org
或者通过.npmrc
文件设置:
- // .npmrc
- registry=https://registry.npm.taobao.org/
node-sass除了npm部分的代码,还会下载二进制文件binding.node
,默认源是github,国内访问较慢,特殊时期甚至无法访问。我们也可以将其改成国内源:
- // linux、mac 下
- SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
-
- // window 下
- set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ && npm install node-sass
或者通过.npmrc
文件设置:
- // .npmrc
- sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
有类似问题的还有chromedriver
,phantomjs
,electron
等常见依赖包,我们可以一并写到.npmrc
中:
- // .npmrc
- sass_binary_site=https://npm.taobao.org/mirrors/node-sass
- chromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriver
- phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs
- electron_mirror=https://npm.taobao.org/mirrors/electron
node-sass版本兼容性并不好,老项目中依赖的node-sass很可能已经不兼容新的node,对应版本兼容如下(或参考官方仓库):
NodeJS | Minimum node-sass version | Node Module |
---|---|---|
Node 13 | 4.13+ | 79 |
Node 12 | 4.12+ | 72 |
Node 11 | 4.10+ | 67 |
Node 10 | 4.9+ | 64 |
Node 8 | 4.5.3+ | 57 |
本文开头的安装例子中,binding.node
的版本是v4.13.0/win32-x64-64_binding.node
,可以看到,里面包括node-sass版本号v4.13.0
,平台win32
,架构x64
,以及Node Module
的版本64。Node Module是node的一个模块,其版本号可以在进程process.versions
中查到:
- PS D:\demo> node
- > console.log(process.versions);
- { 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',
- unicode: '11.0',
- cldr: '33.1',
- tz: '2018e' }
- undefined
- >
如上显示,node10.15.3对应的module版本为64。 假如node-sass与node的版本不兼容,就会找不到对应的binding.node
而报错,例如你的node是10.15.3,装node-sass4.6.1,则会尝试安装v4.6.1/win32-x64-64_binding.node
,但这个版本的binding.node
是不存在的。 此时改node-sass或node的版本即可。