总结安装node-sass遇到的问题

6,454 阅读3分钟

由于安装node-sass经常出现问题,所以决定找一下原因。

node-sass安装出现问题,通常跟一个名为binding.node的二进制文件有关,在安装过程中,需要用到这个二进制文件。

因此安装node-sass相关的失败原因有以下几种:

  1. binding.node文件下载不下来
  2. node.js版本与binding.node版本不兼容

binding.node文件下载不下来

因为需要从国外站点下载,网络可能不通。

主要有以下三种解决办法:

  1. 科学上网(翻墙)
  2. 通过SASS_BINARY_SITE环境变量指定binding.node文件的下载地址
  3. 手动下载,将其放在缓存文件中

翻墙我们就不讲了,我们主要讲讲通过设置SASS_BINARY_SITE环境变量和使用缓存这两种方法。

设置SASS_BINARY_SITE环境变量

SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ yarn add node-sass

使用缓存

node-sass总是先从缓存拉取,那么我们就在缓存那里,直接把正确的文件放在那里,这样在安装node-sass时,直接从缓存中拉倒了正确的binding.node文件,问题便得以解决。

我一般使用yarn来安装,我们先来聊聊yarn的缓存,npm是类似的。

yarn的缓存

查看存放yarn缓存的文件路径:

$ yarn cache dir
/home/user/.cache/yarn/v6

查看一下缓存文件长什么样子:

$ ls /home/user/.cache/yarn/v6
npm-select-hose-2.0.0-625d8658f865af43ec962bfc376a37359a4994ca-integrity
npm-selfsigned-1.10.11-24929cd906fe0f44b6d01fb23999a739537acbe9
npm-selfsigned-1.10.7-da5819fd049d5574f28e88a9bcc6dbc6e6f3906b-integrity
npm-semver-5.3.0-9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f-integrity
npm-semver-5.5.0-dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab-integrity
...

可以发现,每个缓存对应一个文件夹,对于一个具体包的具体版本,一个包的多个版本存储为不同的文件夹,如下所示:

20211110160134

20211110160915

单个缓存文件的结构如下所示:

npm-node-sass-5.0.0-4e8..
└── node_modules
    └── node-sass
        ├── CHANGELOG.md
        ├── LICENSE
        ├── README.md
        ├── bin
        ...
下载binding.node

下载地址: github.com/sass/node-s…

找到对应node-sass版本,我们以v5.0.0为例。

我们先确定版本确定的支持环境,比如支持哪些操作系统、什么系统架构、node.js的版本,如下图所示:

20211110164854

主要注意的是虽然目前为止,node.js稳定版本为17,但是node-sass并不支持。

然后是确定具体下载哪个binding.node文件,binding.node文件下载列表如下所示:

20211110165542

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

$ node -p "[process.platform, process.arch, process.versions.modules].join('-')"

linux-x64-83

说明:

  • process.platform: 操作系统平台
  • process.arch: 操作系统 CPU 架构
  • process.versions.modules: 表示当前的 ABI 版本,每当 C++ API 更改时都会增加,node.js的版本越高,值就越高,比如nodejs v17为102。

根据输出,所以我们需要下载 linux-x64-83_binding.node。

将binding.node放在缓存文件中

我安装的版本是node-sass@5.0.0,所以先找到缓存文件npm-node-sass-5.0.0-4e8..。

所以为了保证正确安装,我们需要按照这个格式把下载到的文件放到缓存的目录下。

.
└── node-sass
    ├── CHANGELOG.md
    ├── bin
    ...
    └── vendor
        └── linux-x64-83
            └── binding.node

找到vender目录,新建linux-x64-83文件夹,放入binding.node文件。

这样安装node-sass@5.0.0,就不会去下载binding.node了。

node.js版本与binding.node版本不兼容

简单来说,就是有些版本的node-sass只支持特定版本的node.js,比如node-sass@6.0.1只支持node版本12-16,如下图所示:

20211110171859

如果你必须使用node-sass@6.0.1,比如你使用的第三方库使用的是这个版本,那么你只有升或降node.js版本了。

比如我之前node.js版本为17,为了使用node-sass,我只有降低node.js版本,到目前为止,node-sass都不支持node.js 17。

不支持的原因还是没有对应的binding.node文件。

使用node.js 17运行如下命令:

node -p "[process.platform, process.arch, process.versions.modules].join('-')"

linux-x64-102

是找不到对应linux-x64-102的binding.node文件的。

process.versions.modules表示当前的 ABI 版本,每当 C++ API 更改时都会增加,node.js的版本越高,值就越高。