我遇到了一个 Webpack 构建过程突然中断的问题,导致以下错误......
\n<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules\nnode:internal/crypto/hash:67\n this[kHandle] = new _Hash(algorithm, xofLen);\n ^\n\nError: error:0308010C:digital envelope routines::unsupported\n at new Hash (node:internal/crypto/hash:67:19)\n at Object.createHash (node:crypto:130:10)\n at BulkUpdateDecorator.hashFactory (/app/node_modules/webpack/lib/util/createHash.js:155:18)\n at BulkUpdateDecorator.update (/app/node_modules/webpack/lib/util/createHash.js:46:50)\n at OriginalSource.updateHash (/app/node_modules/webpack-sources/lib/OriginalSource.js:131:8)\n at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:888:17)\n at handleParseResult (/app/node_modules/webpack/lib/NormalModule.js:954:10)\n at /app/node_modules/webpack/lib/NormalModule.js:1048:4\n at processResult (/app/node_modules/webpack/lib/NormalModule.js:763:11)\n at /app/node_modules/webpack/lib/NormalModule.js:827:5 {\n opensslErrorStack: [ \'error:03000086:digital envelope routines::initialization error\' ],\n library: \'digital envelope routines\',\n reason: \'unsupported\',\n code: \'ERR_OSSL_EVP_UNSUPPORTED\'\n}\ncommand terminated with exit code 1\nRun Code Online (Sandbox Code Playgroud)\n我尝试过谷歌搜索ERR_OSSL_EVP_UNSUPPORTED webpack,几乎没有产生任何有用的结果,但它确实突出了使用OpenSSL提供的 MD4 (显然已弃用?)来生成哈希值的问题。
webpack.config.js代码如下:
\nconst path = require(\'path\');\nconst webpack = require(\'webpack\');\n\n/*\n * SplitChunksPlugin is enabled by default and replaced\n * deprecated CommonsChunkPlugin. It automatically identifies modules which\n * should be splitted of chunk by heuristics using module duplication count and\n * module category (i. e. node_modules). And splits the chunks\xe2\x80\xa6\n *\n * It is safe to remove "splitChunks" from the generated configuration\n * and was added as an educational example.\n *\n * https://webpack.js.org/plugins/split-chunks-plugin/\n *\n */\n\n/*\n * We\'ve enabled TerserPlugin for you! This minifies your app\n * in order to load faster and run less javascript.\n *\n * https://github.com/webpack-contrib/terser-webpack-plugin\n *\n */\n\nconst TerserPlugin = require(\'terser-webpack-plugin\');\n\nmodule.exports = {\n mode: \'development\',\n entry: \'./src/js/scripts.js\',\n\n output: {\n path: path.resolve(__dirname, \'js\'),\n filename: \'scripts.js\'\n },\n\n devtool: \'source-map\',\n\n plugins: [new webpack.ProgressPlugin()],\n\n module: {\n rules: []\n },\n\n optimization: {\n minimizer: [new TerserPlugin()],\n\n splitChunks: {\n cacheGroups: {\n vendors: {\n priority: -10,\n test: /[\\\\/]node_modules[\\\\/]/\n }\n },\n\n chunks: \'async\',\n minChunks: 1,\n minSize: 30000,\n name: \'true\'\n }\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n如何将 Webpack 使用的哈希算法更改为其他算法?
\nJan*_*Jan 735
我能够通过以下方式修复它:
export NODE_OPTIONS=--openssl-legacy-provider
Run Code Online (Sandbox Code Playgroud)
sachaw 对Node.js v17.0.0 的评论 - 在开发模式下启动项目时出错 #30078
但他们说他们修复了它:ijjk 对Node.js v17.0.0 的评论 - 在开发模式下启动项目时出错 #30078:
您好,Next.js 已更新至 v11.1.3-canary.89,请更新并尝试一下!
对我来说,它仅适用于上面的注释。
我还想指出,它npm run start适用于-openssl-legacy-provider,但npm run dev不适用于。
好像有补丁: Node.js 17: digital Enveloperoutines::unsupported #14532
我个人降级为16-alpine.
Ben*_*son 184
我也有这个问题。我不小心运行在最新的 Node.js(撰写本文时为 17.0),而不是我想要安装的 LTS 版本(14.18)。将我的 Node.js 安装降级到 LTS 版本解决了我的问题。
小智 80
这实际上不是我的答案,但我发现了这个解决方法 /hack/ 来解决我的问题代码签入 GitHub 项目...请参阅此处的错误评论。
使用npm install更新后,我遇到了 ERR_OSSL_EVP_UNSUPPORTED 。
我将以下内容添加到 node_modules\react-scripts\config\webpack.config.js
const crypto = require("crypto");
const crypto_orig_createHash = crypto.createHash;
crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);
Run Code Online (Sandbox Code Playgroud)
我尝试了Ryan Brownell 的解决方案,但最终出现了不同的错误,但这有效......
打字稿等效:
import crypto from "crypto";
const crypto_orig_createHash = crypto.createHash;
Object.assign(crypto, {
createHash: (algorithm: string): crypto.Hash => crypto_orig_createHash(algorithm === "md4" ? "sha256" : algorithm),
});
Run Code Online (Sandbox Code Playgroud)
jbg*_*jbg 67
如果您使用 Webpack v5.54.0+,Ryan Brownell 的答案是理想的解决方案。
\n如果您使用的是较旧版本的 Webpack,您仍然可以通过将哈希函数更改为未弃用的函数来解决此问题。(它默认为古老的md4,OpenSSL 已删除了对它的支持,这是错误的根本原因。)支持的算法是crypto.createHash支持的任何算法。例如,要使用SHA-256:
module.exports = {\n output: {\n hashFunction: "sha256"\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n最后,如果您无法更改 Webpack 配置(例如,如果它是运行 Webpack 的传递依赖项),您可以启用 OpenSSL 的旧版提供程序以在 Webpack 构建期间临时启用 MD4。这是最后的手段。创建一个包含以下内容的文件openssl.cnf\xe2\x80\xa6
openssl_conf = openssl_init\n\n[openssl_init]\nproviders = provider_sect\n\n[provider_sect]\ndefault = default_sect\nlegacy = legacy_sect\n\n[default_sect]\nactivate = 1\n\n[legacy_sect]\nactivate = 1\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6,然后在运行 Webpack 时将环境变量设置OPENSSL_CONF为该文件的路径。
Rya*_*ell 64
Webpack v5.54.0+ 附带了一个不依赖 OpenSSL 的哈希算法。
要使用依赖于 npm 提供的依赖项而不是操作系统提供的依赖项的哈希函数,请修改 webpack.config.cjsoutput键以包含该hashFunction: "xxhash64"选项。
module.exports = {
output: {
hashFunction: "xxhash64"
}
};
Run Code Online (Sandbox Code Playgroud)
小智 27
Node.js 17.0.0 的发行说明中提到了此错误,并提供了建议的解决方法:
\n\n\n如果您在使用 Node.js 17 的应用程序中遇到ERR_OSSL_EVP_UNSUPPORTED错误,则您的应用程序或您正在使用的模块可能正在尝试使用不再适用的算法或密钥大小。 OpenSSL 3.0 默认允许。添加了命令行选项--openssl-legacy-provider来恢复到旧版提供程序,作为这些严格限制的临时解决方法。
\n
小智 22
我使用Laravel Mix (Webpack)遇到了这个问题,并能够通过在脚本开头添加(在Jan 的回答中引用)来修复文件package.json中的问题:NODE_OPTIONS=--openssl-legacy-provider
package.json:
{
"private": true,
"scripts": {
"production": "cross-env NODE_ENV=production NODE_OPTIONS=--openssl-legacy-provider node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"dependencies": {
...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
我在使用Next.js开发的项目中遇到了同样的问题。对于解决方案,我按如下方式运行项目并解决了问题。
cross-env NODE_OPTIONS='--openssl-legacy-provider' next dev
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
656056 次 |
| 最近记录: |