公司2019年的项目采用了vue-template-admin,这个架子中依赖了node-sass@4.9.0及sass-loader@7.1.0,后来迁移到了公司内网,由于npm源过大,所以采用verdaccio搭建的中转npm服务器,外网环境开发一切正常,后来迁移到内网环境后新人环境总是出现node-sass安装失败,究其原因主要有两个,一是node-sass底层采用的是libsass这个c++库,而在将libsass编译成nodejs平台的node二进制文件时会和平台关联,我们可以看到这个相关node包列表链接中提供了一些列相关平台的node二进制文件,但总会有遗漏。二是执行安装时会从上述github链接中下载,我们知道github国内访问极其不稳定,会导致安装出错。
解决方案:
1、x86/ubuntu环境
我们的开发环境都是采用x86/ubuntu环境,通常为了解决该问题我们采用copy正常环境的node_module中的node-sass安装包到故障机器,然后先执行npm install /home/xxxx/lib/node-sass, 使用本地安装包安装node-sass,最后再执行npm install,这样是可以正常解决问题的。上面说了我们安装失败还有一个重要原因就是安装node-sass时会去下载编译好了的libsass node文件,而这个下载地址极其不稳定,所以我们可以先根据自己的环境把这个文件下载下载放到本地,然后npm配置sass_binary_path如:
npm config set sass_binary_path /home/xxx/lib/linux-x64-72_binding.node -g这样我们在直接安装时就是直接采用本地这个node文件,或者配置sass_binary_site指向一个可下载的地址如淘宝node-sass镜像npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass -g
2、arm-kylin/centos环境
我们产品需要构建rpm包,所以公司有一个专门用于构建的arm64架构的centos编译服务器,结果发现在构建前端时失败,原因也是node-sass的问题,按照方案1的解决方式发现并没有什么作用,搜索了一圈之后发现时node-sass不支持arm平台,所以果断更换node-sass为sass@1.26.2,执行构建发现有错,错误原因是以前写scss时修改子组件样式使用的/deep/不能使用了,需要用::v-deep替换,嗯,全局替换后构建成功! 在使用该方法修改另外一个项目时发现有个内部关联依赖deasync这个包也安装失败报错,最后通过npm install --ignore-scripts时正常解决。