我创建了默认的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天前遇到了这个问题,目前仍在处理。


当前回答

有很多变通办法(主要是降级Node.js, OpenSSL,或允许不安全的散列),但潜在的问题是Webpack的输出。hashFunction默认为md4,这会在最新版本的OpenSSL中触发此错误。

从Webpack的输出。hashFunction文档:

从Webpack v5.54.0+开始,hashFunction支持xxhash64作为一种更快的算法,当 实验。futureDefaults已启用。

解决方案是:

设置输出。hashFunction = 'xxhash64' 设置实验。futureDefaults = true

在Webpack配置中。

如果您使用的是较旧版本的Webpack(在v5.54.0之前),请遵循输出。hashFunction链接可以查看其他可用的哈希算法。

其他回答

窗户

安装nvm-windows。 安装你需要的Node.js版本。

nvm install 16

更改Node.js版本

nvm use 16

检查已安装的Node.js版本

nvm list

在使用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);
  };
}

这在我的应用博览会上很管用(从Node.js 17降级到Node.js 12或14)。

如果你安装了nvm,你可以改变node的版本:

首先在nvm中检查Node.js的版本:

nvm list

其次,安装版本12或14:

nvm install v12.22.8

在你的包裹里。Json:更改这一行

"start": "react-scripts start"

to

"start": "react-scripts --openssl-legacy-provider start"

PowerShell:

$env:NODE_OPTIONS = "--openssl-legacy-provider"

它适用于Node.js v18.7.0。