原文链接作者李平海node-sass是我们开发中很常见的一个依赖包,也是安装时间比较长,最常报错的依赖。安装node-sass失败的原因有很多。在说失败原因之前,先分析下node-sass的安装过程(以下node版本为v10.15.3):PSD:\demo>npminode-sass//Installfromnpmsourcetonode_modules>node-sass@4.13.0installD:\demo\node_modules\node-sass>nodescripts/install.js//从https://github.com/sass/node-sass/releases/download下载binding.nodeDownloading二进制文件/v4.13.0/win32-x64-64_binding.node下载完成。]-:二进制保存到D:\demo\node_modules\node-sass\vendor\win32-x64-64\binding.node//缓存binding.nodeCaching二进制到C:\Users\leepi\AppData\Roaming\npm-cache\node-sass\4.13.0\win32-x64-64_binding.node>node-sass@4.13.0安装后D:\demo\node_modules\node-sass>nodescripts/build.jsBinaryfoundatD:\demo\node_modules\node-sass\vendor\win32-x64-64\binding.nodeTestingbinaryBinaryisfine//writepackage-lock.jsonnpmnoticecreatedalockfile作为包锁.json。你应该提交这个文件。npmWARNdemo@1.0.0没有描述npmWARNdemo@1.0.0没有存储库字段。+node-sass@4.13.0添加了174packagesfrom138contributorsandaudited529packagesin24.379sfound0vulnerabies我们可以看到安装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,安装node-sass相关失败,原因如下:原因一:npm源慢由于国内众所周知的网络环境,从官方源安装依赖包会很慢在中国。可以将npm源设置为国内镜像源(如淘宝npm):npmconfigsetregistryhttps://registry.npm.taobao.org或通过.npmset//.npmrcregistry=https://registry.npm。npmrc文件。taobao.org/原因2:binding.node源无法访问或速度慢。除了npm部分的代码,node-sass还会下载二进制文件binding.node。默认源是github。国内访问速度慢,特殊时期甚至无法访问。我们也可以改成国内的源://SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/npminstallnode-sasslinux和mac下//setSASS_BINARY_SITE=https://window下npm.taobao.org/mirrors/node-sass/&&npminstallnode-sassorsetthrough.npmrcfile://.npmrcsass_binary_site=https://npm.taobao.org/mirrors/node-sass/有类似的问题还有还有chromedriver、phantomjs、electron等常用的依赖包,我们可以一起写入.npmrc://.npmrcsass_binary_site=https://npm.taobao.org/mirrors/node-sasschromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriverphantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjselectron_mirror=https://npm.taobao.org/mirrors/electron原因三:node版本与node-sass版本不兼容兼容性不好。老项目中依赖的node-sass新节点可能不兼容。对应版本兼容如下(或参考官方仓库):NodeJS最低node-sass版本NodeModuleNode134.13+79Node124.12+72Node114.10+67Node104.9+64Node84.5.3+57本文开头的安装示例中,binding.node的版本是v4.13.0/win32-x64-64_binding.node,可以看到,它包括node-sass版本号v4.13.0,平台win32,Architecturex64,NodeModule版本64。NodeModule是node的一个模块,它的版本号可以在进程process.versions:PSD:\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',模块:'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对应的模块版本是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的版本即可。原因四:缓存中的binding.node版本不一致。如果更改了本地node版本,或者在不同机器上运行时node版本不一致,也会报类似的错误:Foundbindingsforthefollowingenvironments:-Windows64-bitwithNode.js6.x这是因为原来的binding.node缓存与当前节点版本不一致。按照提示npmrebuildnode-sass或清除缓存重新安装。原因五:安装失败后重新安装。安装失败后重新安装。您可能无权删除已安装的内容。这个时候npmuninstallnode-sass或者手动删除原来的目录再安装。原因六:提示未安装python,构建失败等如果拉取binding.node失败,node-sass会尝试在本地编译binding.node,需要python。如果你已经解决了前面的情况,而实际上将无法在本地构建,那么我们就不要谈论失败中的失败:-)
