我创建了默认的IntelliJ IDEA React项目,并得到了这个:
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
at module.exports (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/util/createHash.js:135:53)
at NormalModule._initBuildHash (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:417:16)
at handleParseError (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:471:10)
at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:503:5
at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:358:12
at /Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:373:3
at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
/Users/user/Programming Documents/WebServer/untitled/node_modules/react-scripts/scripts/start.js:19
throw err;
^
这似乎是最近才出现的问题——webpack在4天前遇到了这个问题,目前仍在处理。
危险
这个问题有30多个答案,大多数人建议要么把Node.js降级到v17之前,要么使用传统的SSL提供程序。这两种解决方案都是黑客攻击,使您的构建容易受到安全威胁。
错误原因
在Node.js v17中,Node.js开发人员关闭了SSL提供者中的一个安全漏洞。这个修复是一个破坏性的更改,与NPM中SSL包中的类似破坏性更改相对应。当您试图在Node.js v17或更高版本中使用SSL而不升级包中的SSL包时。Json,然后你会看到这个错误。
正确的(安全的)解决方案(适用于npm用户)
使用最新版本的Node.js,并使用带有安全补丁的最新包。
对于很多人来说,下面的命令可以解决这个问题:
npm audit fix --force
但是,请注意,对于复杂的构建,上面的命令将引入可能破坏构建的安全修复程序。
Yarn用户注意事项
正如一些评论者指出的那样,如果你使用Yarn而不是Npm,那么上述基于Npm的修复可能不适合你,或者可能会产生不完整的结果。我不使用纱线,所以不能帮助;然而,概念应该是一样的。
Webpack的一个不那么笨拙(也是正确的)的解决方案
在Webpack配置中,设置以下任意一个:
(见输出。hashFunction文档)
A. (Webpack v5)设置输出。hashFunction = 'xxhash64'。
B. (Webpack v4)这将取决于nodejs在你的系统上支持什么散列算法。您可以尝试的一些常见选项是输出。hashFunction = 'sha512'或输出。hashFunction = 'sha256'。
在Greg的回答中可以看到更多信息。
在使用VueJS时遇到了这个问题。
使用-openssl-legacy-provider的一个缺点是旧版本的Node不支持它。当提供此标志时,旧版本的Node根本不运行。
但我仍然希望与Node v16及更早版本兼容。
VueJS使用md4算法来生成散列(实际上它是WebPack的底层)。出于这些目的,md5可以很容易地取代Md4。所使用的算法类型,在大多数地方都是硬编码的,所以没有办法配置另一种算法。
所以我想出了另一个变通办法。从crypto模块拦截原始createHash()调用并将其替换为修改后的版本的函数。这是vue.config.js文件的开头:
const crypto = require('crypto');
/**
* md4 algorithm is not available anymore in NodeJS 17+ (because of lib SSL 3).
* In that case, silently replace md4 by md5 algorithm.
*/
try {
crypto.createHash('md4');
} catch (e) {
console.warn('Crypto "md4" is not supported anymore by this Node version');
const origCreateHash = crypto.createHash;
crypto.createHash = (alg, opts) => {
return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
};
}