node-sass安装失败的解决方式

给着急的同学

着急的同学,直接看最后一节,操作步骤。先解决燃眉之急,然后有时间可以再回来细细品味。

写在前面

首先,segmentfault上已经有一位同学总结了比较多的情况,且文档写的非常详细。建议先到该同学的文章里找一下解决方案。
https://segmentfault.com/a/11...

如果经过一番操作,还是不行,那么请试一下我这里的方式。

先说思路

通常在各种方式都试过之后还是不行的时候,我们要考虑下是不是遗忘了哪个细节?
缓存!没错,可能我们思路本来都是对的,但是实际在运行时并没有按照我们预期的去执行,缓存就是可能导致这种情况的因素之一。

背景

现在前端安装依赖大家常用的工具是npm和yarn
而这两者都有各自的缓存机制,有时候,第一次安装node-sass失败后,可能这个包就已经被缓存了,导致我们后续再进行安装时,就不再会从远程服务器或者是代理去拉取了。这就导致了一个死循环,永远拉不到正确的文件。

问题成因

其实node-sass安装不成功的跟本原因大家基本都清楚,就是他在安装过程中,需要用到一个二进制文件:binding.node,但是坑爹的是,这个二进制文件在“外面”,也就是需要科学上网才能获取,这就导致了绝大部分的安装失败。
除此之外,其实还有一些是因为通过设置各种代理之后,仍然不能获取到正确的binding.node文件,具体原因可能多种多样,但其实我们不需要关心这些问题,我们知道了问题的成因,那么直接从根源上解决问题即可。

解决办法

分析清除了成因之后,解决问题就相对容易多了。既然node-sass总是从缓存拉取,那么我们就在缓存那里,直接把正确的文件放在那里,这样在安装node-sass时,直接从缓存中拉倒了正确的binding.node文件,问题便得以解决。
所以我们要做以下几件事情:

  • 检测当前环境中,node-sass要使用的binding.node对应的版本
  • 获取到对应版本的binding.node
  • 将获取到的binding.node放到缓存中

操作步骤

  1. 查看当前环境适用的binding.node

    node -p "[process.platform, process.arch, process.versions.modules].join('-')"
  2. 这里下载对应版本的文件。链接地址:https://github.com/sass/node-...
  3. 将下载好的文件放入缓存目录中
    yarn缓存目录:C:Users你的用户名AppDataLocalYarnCache
    npm缓存目录:C:Users你的用户名AppDataRoamingnpm-cachenode-sass

    注意
    node-sass最终安装正确的情况下,目录结构是这样的:

    node-sass|
        -...
        -vender|
            -win32-x64-57
                -binding.node

    所以为了保证正确安装,我们需要按照这个格式把下载到的文件放到缓存的目录下。
    这里,win32-x64-57在不同的环境下可能有不同的版本,要注意看一下你本地对应的是什么版本。
    查看版本上面给出了一个命令,可以试一下。
    查看版本还有一种方式,就是当你第一次安装失败时,你去node-modules中去找node-sass目录,然后找到vender目录,进去就能看到你的环境下,building.node对应的版本了。

    我本地的目录结构如下,供参考:
    node-sass安装失败的解决方式
    node-sass安装失败的解决方式

  4. 重新安装node-sass

祝你好运!

相关推荐