安装失败的原因,为什么node—sass总是安装失败?有非常详尽的解释。下面引用一下原理:
我们在说失败原因之前,先来分析一下node-sass的安装过程(以下node版本为v10.15.3):
PS D:demo> npm i node-sass
// 从npm源安装到node_modules
> node-sass@4.13.0 install D:demo
ode_modules
ode-sass
> node scripts/install.js
// 下载binding.node
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.13.0/win32-x64-64_binding.node
Download complete .] - :
Binary saved to D:demo
ode_modules
ode-sassvendorwin32-x64-64inding.node
// 缓存binding.node
Caching binary to C:UsersleepiAppDataRoaming
pm-cache
ode-sass4.13.0win32-x64-64_binding.node
> node-sass@4.13.0 postinstall D:demo
ode_modules
ode-sass
> node scripts/build.js
Binary found at D:demo
ode_modules
ode-sassvendorwin32-x64-64inding.node
Testing binary
Binary is fine
// 写package-lock.json
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN demo@1.0.0 No description
npm WARN demo@1.0.0 No repository field.
+ node-sass@4.13.0
added 174 packages from 138 contributors and audited 529 packages in 24.379s
found 0 vulnerabilities
我们可以看到,安装node-sass有几个步骤:
- 校验本地node_modules中是否已安装node-sass,版本是否一致;
- 如未安装或版本不符,从npm源安装node-sass本体;
- 检测全局缓存和本地中是否有binding.node,如有即跳过安装;
- 没有binding.node则从github下载该二进制文件并将其缓存到全局;
- 假如binding.node下载失败,则尝试本地编译出该文件;
- 将版本信息写到package-lock.json;
由此看到,实际上node-sass依赖了一个二进制文件binding.node,从npm源安装完本体后还会从github下载binding.node。
我的问题是npm无法从github网页上自行下载binding.node
解决方法:(这里的下载网址注意一下版本号)
- 先到网页 https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-64_binding.node 自行下载binding.node
- 把binding.node放在全局node_cache中(我的路径是D:AppDataNodejs ode_cache,默认路径是C:UsersxymAppDataRoaming pm-cache)
- 然后针对版本安装
npm install --save-dev node-sass@4.12.0
- 解决。