[TOC]

问题背景

开发新的前端我的项目时,总少不了搭建开发环境和执行npm install装置依赖包,但npm install的过程总是充斥着玄学,很难保障一次性胜利,其中尤其以node-sass这个包的装置失败问题最为常见。
像其余npm包装置失败,通常是因为网络问题,能够采纳应用更好的网络环境或者切换源的形式进行装置,比方应用淘宝的源进行装置,命令如下:

npm install --registry=https://registry.npm.taobao.org

node-sass装置失败这个问题仿佛无奈通过上述命令解决。本文将总结遇到此类问题时的解决方案。

问题形容

笔者的测试环境如下:

操作系统:Windows 11Node版本:v14.16.0Npm版本:6.14.11

遇到的node-sass装置失败的报错如下:

gyp ERR! find VSgyp ERR! find VS msvs_version not set from command line or npm configgyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Promptgyp ERR! find VS checking VS2022 (17.5.33530.505) found at:gyp ERR! find VS "D:\Program Files\Microsoft Visual Studio\2022\Community"gyp ERR! find VS - found "Visual Studio C++ core features"gyp ERR! find VS - found VC++ toolset: v143gyp ERR! find VS - missing any Windows SDKgyp ERR! find VS could not find a version of Visual Studio 2017 or newer to usegyp ERR! find VS looking for Visual Studio 2015gyp ERR! find VS - not foundgyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8gyp ERR! find VSgyp ERR! find VS **************************************************************gyp ERR! find VS You need to install the latest version of Visual Studiogyp ERR! find VS including the "Desktop development with C++" workload.gyp ERR! find VS For more information consult the documentation at:gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windowsgyp ERR! find VS **************************************************************gyp ERR! find VSgyp ERR! configure errorgyp ERR! stack Error: Could not find any Visual Studio installation to usegyp ERR! stack     at VisualStudioFinder.fail (D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:122:47)gyp ERR! stack     at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:75:16gyp ERR! stack     at VisualStudioFinder.findVisualStudio2013 (D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:363:14)gyp ERR! stack     at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:71:14gyp ERR! stack     at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:384:16gyp ERR! stack     at D:\temp\npm-temp\node_modules\node-gyp\lib\util.js:54:7gyp ERR! stack     at D:\temp\npm-temp\node_modules\node-gyp\lib\util.js:33:16gyp ERR! stack     at ChildProcess.exithandler (child_process.js:315:5)gyp ERR! stack     at ChildProcess.emit (events.js:315:20)gyp ERR! stack     at maybeClose (internal/child_process.js:1048:16)gyp ERR! System Windows_NT 10.0.22621gyp ERR! command "C:\\Users\\zzcoder\\AppData\\Local\\nvs\\default\\node.exe" "D:\\temp\\npm-temp\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="gyp ERR! cwd D:\temp\npm-temp\node_modules\node-sassgyp ERR! node -v v14.16.0gyp ERR! node-gyp -v v8.4.1gyp ERR! not okBuild failed with error code: 1npm WARN npm-test@1.0.0 No descriptionnpm WARN npm-test@1.0.0 No repository field.npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! node-sass@8.0.0 postinstall: `node scripts/build.js`npm ERR! Exit status 1npm ERR!npm ERR! Failed at the node-sass@8.0.0 postinstall script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR!     C:\Users\zzcoder\AppData\Roaming\npm-cache\_logs\2023-05-06T06_13_42_083Z-debug.log

附上报错截图:

解决方案

1. 查看node-sass装置版本是否正确。

本地装置的node版本不同,须要装置的node-sass版本也是不一样的。node-sass官网给出了不同版本的nodenode-sass的对应关系,读者可拜访node-sass github仓库或者node-sass npm仓库进行查看。
本地装置的node版本,能够应用如下命令进行查看:

node -v

下图为截至node-sass@8.0.0版本时的对应关系。

在我的项目中还没有package.json或者有package.json然而此文件没有指定node-sass的版本时,默认会装置node-sass的最新版本。因为笔者装置的node版本时14.16.0,执行npm install node-sass命令默认装置了撰写本文时的node-sass最新版本8.0.0,所以才有了前文中报错。

依据版本对应关系,笔者应该装置node-sass4.14+版本,因而须要将装置命令改为:

npm install node-sass@^4.14.0 --registry=https://registry.npm.taobao.org

这样就是应用淘宝源来装置node-sass4.14+中的最新版本。

2. 查看是否是网络问题

在应用npm install装置node-sass时,会从 github.com 上下载 .node 文件。因为国内网络环境的问题,这个下载工夫可能会很长,甚至导致超时失败。

npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fsnpm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs> node-sass@8.0.0 install D:\temp\npm-temp\node_modules\node-sass> node scripts/install.jsDownloading binary from https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.nodeCannot download "https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.node":HTTP error ETIMEDOUT request to https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.node failed, reason: connect ETIMEDOUT 20.205.243.166:443Hint: If github.com is not accessible in your location      try setting a proxy via HTTP_PROXY, e.g.      export HTTP_PROXY=http://example.com:1234or configure npm proxy via      npm config set proxy http://example.com:8080> node-sass@8.0.0 postinstall D:\temp\npm-temp\node_modules\node-sass> node scripts/build.js

附上报错截图。

这种状况下仅应用--registry参数指定npm包的下载源是不够的,还须要应用--sass_binary_site参数指定sass二进制文件的下载源,因而须要将装置命令改为:

npm install node-sass@^4.14.0 --registry=https://registry.npm.taobao.org --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

这样一来就是指定node-sass版本,指定npm包下载源为淘宝源,指定sass下载源为淘宝源,应用此命令根本就都能装置胜利了。

总结

遇到node-sass装置失败时,能够应用以下命令:

# 查看本地node版本node -v# 装置node-sassnpm install node-sass@[本地node所对应的node-sass版本] --registry=https://registry.npm.taobao.org --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

通过下表查看版本对应关系,也可拜访node-sass github仓库或者node-sass npm仓库进行查看。

欢送批评指正。