node:internal/crypto/hash:79
this[kHandle] = new _Hash(algorithm, xofLen, algorithmId, getHashCache());
^
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:79:19)
at Object.createHash (node:crypto:139:10)
at module.exports (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\lib\util\createHash.js:135:53)
at NormalModule._initBuildHash (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\lib\NormalModule.js:417:16)
at handleParseError (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\lib\NormalModule.js:471:10)
at C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\lib\NormalModule.js:503:5
at C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\lib\NormalModule.js:358:12
at C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\loader-runner@2.4.0\node_modules\loader-runner\lib\LoaderRunner.js:373:3
at iterateNormalLoaders (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\loader-runner@2.4.0\node_modules\loader-runner\lib\LoaderRunner.js:214:10)
at Array.<anonymous> (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\loader-runner@2.4.0\node_modules\loader-runner\lib\LoaderRunner.js:205:4)
at Storage.finished (C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\enhanced-resolve@4.5.0\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:55:16)
at C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\enhanced-resolve@4.5.0\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:91:9
at C:\Users\Admin\AppData\Roaming\npm\node_modules\webpack\node_modules\.store\graceful-fs@4.2.11\node_modules\graceful-fs\graceful-fs.js:123:16
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read/context:68:3) {
opensslErrorStack: [
'error:03000086:digital envelope routines::initialization error',
'error:0308010C:digital envelope routines::unsupported'
],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
Node.js v20.14.0
- 问题原因:
- 这个错误
ERR_OSSL_EVP_UNSUPPORTED
通常是由于在较新版本的 Node.js 中,OpenSSL 的默认加密算法发生了变化。从 Node.js v17.0.0 开始,默认情况下,OpenSSL 启用了更严格的加密算法限制。Webpack 在构建过程中使用的某些哈希算法可能不再被默认支持。
- 这个错误
- 解决方案:
- 设置环境变量:
- 在 Windows 系统下,你可以在命令行中设置环境变量
NODE_OPTIONS
来解决这个问题。在启动 Webpack 构建的命令前加上以下命令:
然后再运行你的 Webpack 构建命令,例如set NODE_OPTIONS=--openssl - legacy - provider
webpack - - config webpack.config.js
。 - 在 Linux 或 macOS 系统下,使用以下命令:
之后再运行你的 Webpack 构建命令。export NODE_OPTIONS=--openssl - legacy - provider
- 在 Windows 系统下,你可以在命令行中设置环境变量
- 设置环境变量:
3.使用上述命令之后发生错误
直接在vscode的终端使用第一条命令,即
set NODE_OPTIONS=--openssl - legacy - provider
之后显示:
Set-Variable : 找不到接受实际参数“legacy”的位置形式参数。
所在位置 行:1 字符: 1
+ set NODE_OPTIONS=--openssl - legacy - provider
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Variable],ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetVariableCommand
这个问题,是因为在 PowerShell 中,设置环境变量的语法与命令提示符(CMD)略有不同。你可以使用以下方式在 PowerShell 中设置 NODE_OPTIONS
环境变量:
$env:NODE_OPTIONS = "--openssl-legacy-provider"
设置好环境变量后,你就可以运行 Webpack 相关的命令了。如果你想让这个环境变量在当前会话关闭后依然生效(持久化设置),可以使用以下命令:
[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--openssl-legacy-provider", "User")
上述命令将 NODE_OPTIONS
环境变量设置为用户级别的环境变量。你需要重新启动 PowerShell 会话,新设置的环境变量才会生效。如果希望设置为系统级别的环境变量,可以将 "User"
替换为 "Machine"
,但这需要管理员权限。