node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen); ^

Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19)

rror: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object.createHash (node:crypto:133:10)

这个错误 (ERR_OSSL_EVP_UNSUPPORTED) 出现是因为从 Node.js 17 版本开始,Node.js 默认使用了 OpenSSL 3,这会限制某些旧版加密算法的使用。在情况下,Webpack 和一些其他依赖项依赖于旧的加密算法,而 OpenSSL 3 不再支持这些算法。

解决方案:

1. 使用环境变量允许使用旧版 OpenSSL 算法

这是最简单且最直接的解决方法,尤其是当你不打算降级 Node.js 时。你可以通过设置 NODE_OPTIONS 环境变量来允许使用 OpenSSL 3 中的旧版加密算法。

对于 Windows 系统:

打开命令提示符或 PowerShell,运行以下命令:

set NODE_OPTIONS=--openssl-legacy-provider

对于 macOS/Linux 系统:

打开终端,运行以下命令:

export NODE_OPTIONS=--openssl-legacy-provider

设置完之后,再次运行开发服务器或构建命令:

npm run serve

或者:

npm install

这样 Webpack 和其他依赖项就可以继续使用旧版加密算法了,避免出现 ERR_OSSL_EVP_UNSUPPORTED 错误。

2. 降级 Node.js 版本

如果你不想使用 --openssl-legacy-provider 这个环境变量,也可以选择降级 Node.js 到版本 16 或更早版本。这些版本使用 OpenSSL 1.1.1,因此不会遇到此类问题。

使用 NVM(Node Version Manager)来管理不同版本的 Node:

  • Windows 上: 安装 nvm-windows
  • macOS/Linux 上: 安装 NVM

安装并切换到 Node.js v16:

nvm install 16
nvm use 16

然后重新运行:

npm install

3. 更新 Webpack 和依赖项

有时,问题可能是由于某些依赖项(例如 Webpack)不兼容 Node.js 18。你可以尝试更新 Webpack 和相关依赖项到兼容的版本。

更新 Webpack:

npm install webpack@latest --save-dev

然后再执行:

npm install

4. 清除 npm 缓存并重新安装依赖

有时依赖项或缓存可能会导致问题,你可以尝试删除 node_modules 和缓存,然后重新安装依赖项。

  • 删除 node_modules 文件夹:

    rm -rf node_modules
    
  • 清除 npm 缓存:

    npm cache clean --force
    
  • 重新安装依赖:

    npm install
    

总结:

最简单的解决方法是设置 NODE_OPTIONS=--openssl-legacy-provider 环境变量,它可以让 Webpack 和其他依赖项继续使用旧版加密算法。如果你希望避免使用这个环境变量,可以考虑降级 Node.js 或更新依赖项以确保兼容性。