error:0308010c:digital envelope routines::unsupported
经过简单的查询,我马上找到了根本原因:
我本地安装的 nodejs 版本太高了,在使用 OpenSSL 相关功能的时候有兼容性问题。 为此,nodejs 专门提供了一个命令行参数--openssl-legacy-provider , 只要启用了这个参数就没问题了。
重点来了,只要你在网上搜索error:0308010c:digital envelope routines::unsupported
这个异常信息,
无论是 google 的还是百度的,给的解决方案都十分逆天,归类如下:
如果回答者提了一嘴 nvm 还能算个正经方案。
以我多年的经验,不知道 nvm 的草台前端开发多的是。
set NODE_OPTIONS=--openssl-legacy-provider && npm run dev
你要是觉得这个答案有简单又完美,我 TM 直接化身户晨风,安卓人安卓思维是吧,这是 window 的命令行才能用,你让苹果设备的同事怎么办??
ok,ok ,你继续搜索发现有质量更高的回答说,
Unix-like 系统在运行 npm run dev 之前执行 export NODE_OPTIONS=--openssl-legacy-provider
Windows 系统则先执行 set NODE_OPTIONS=--openssl-legacy-provider
哇哦,太棒了,简直完美,个屁。你让我每次运行项目之前都额外敲命令行吗??
这种不能配置化、代码化的解决方案,我要是明天来了十个新同事,
有用苹果的有用微软的,我是不是还得一个口头传授这个宝贵经验吗?
哎,其实写到这里我自己都心累了,有兴趣的 bro 你可以自己搜索试试。
我把我自己觉得最简单直接的解决方案写在这个帖子的最后面,欢迎交流。
我专门发这个帖子还有个目的,我在搜索的时候谷歌的 AI 也给了答案,
明显是参考了大量网络上的回答,都是我总结所述的方案,我实在是觉得,
AI 已经不知道烧掉了人类多少亿的资金了,这么小一个问题依然没有给出优质回答。
我认为正确处理问题的思路应该是,既然这是 nodejs 的配置问题,
那我在运行这个项目启动 nodejs 的时候给增加所需要的参数就好了。
那我是怎么启动 nodejs 的?通过 npm ,那么 npm 执行 script 的时候,
有没有办法给 node 传参?顺着这个思路,查询 npm 的文档,
最终我认为最简单、最直接、而且能够配置化的解决方案是:
在你项目的.npmrc 文件中增加一行配置:
node-options=--openssl-legacy-provider
(什么?你说你的前端项目从来没用过.npmrc 配置文件,那这是另外一个值得吐槽的草台故事了)
![]() |
1
pyyalt 8 小时 3 分钟前
我之前也遇到的同样的问题,后来直接统一版本解决的。😁
|
![]() |
2
supuwoerc 8 小时 1 分钟前
我是个人项目就不用 npmrc ,我喜欢借助 volta 来吧 node,pnpm,npm 啥的版本 pin 到项目,公司的项目因为有私服啥的才用 npmrc 来设置一些配置
|
4
iamwin 8 小时 0 分钟前
会不会可能你看到这些文章发的时候,还没有这个参数?
|
![]() |
5
murmur 8 小时 0 分钟前 ![]() 我也遇到个这个问题,结果是我现在电脑上从 6.0 到 22 装了一大堆 node 环境,不知道啥时候哪个版本就八字不合
|
![]() |
7
tcdw 7 小时 58 分钟前 ![]() 我们当时用的是 cross-env 解决了两个平台之间指定环境变量方式不一样的问题。不过我认为,楼主的这个方案会更加优雅。
|
10
maggch97 7 小时 56 分钟前
关于 env 那一部分评论,我觉得你对 node ,对操作系统,对命令行等等都不是太懂的样子
|
12
deplives 7 小时 51 分钟前
|
13
deplives 7 小时 50 分钟前
兄弟,你不知道 npmrc ?
|
15
thealert 7 小时 50 分钟前 ![]() 很简单的问题搞得这么复杂也是绝了
|
![]() |
16
Vegetable 7 小时 49 分钟前 ![]() nodejs 升级带来的兼容性问题很多很常见,我也是第一次听说 volta 这个工具,之前都没听说过锁 nodejs 版本的工具。这一点踩过坑的人应该很多,确实挺恶心的。
|
17
deplives 7 小时 46 分钟前
@shadowyue #14 你给出的方案不就是 npmrc 增加 node-options=--openssl-legacy-provider
你都搜到了 export NODE_OPTIONS=--openssl-legacy-provider 觉得每次都要挂一个 export 不优雅都不知道这个是直接可以写到 npmrc 。那不就说明了你根本就不知道 npmrc 这个东西存在? |
![]() |
19
ultimate42 7 小时 42 分钟前
@maggch97 #10 我也觉得 稍微问了下 ai 给的几个方案都挺正常的,稍微做过几年前端都应该至少知道一个管理 node 版本的工具吧,项目固定 node 版本不是挺正常吗
|
20
mizuki9 7 小时 40 分钟前 ![]() node 使用最新版,在项目根目录下创建 .npmrc
|
21
deplives 7 小时 40 分钟前 ![]() @shadowyue #18 [捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲]
这是你的标题, 我质疑的是,这么个东西,不需要很复杂的搜索,我 Google 第一条,第一个 SOF 的回复就是这个方案,但是你一直在纠结 npm 要在命令行前面加一个 export 却完全不知道环境变量可以写在 npmrc 中。所以问题不在于搜索到的质量差 |
![]() |
23
ultimate42 7 小时 39 分钟前
@Vegetable nvm fnm volta 都能锁 node 版本吧,很多开源项目都有个.nvmrc 或者.node-version 的文件,不过我个人喜欢 volta
|
25
mizuki9 7 小时 37 分钟前 ![]() 没看见题主已经给出方案了,我瞎了
|
26
dode 7 小时 34 分钟前
AI 秒解决
|
![]() |
27
shadowyue OP @deplives #21
你这要求太高了,知道怎么配置 mac 或者 windows 环境变量的前端开发能有多少? 然后知道配置 npmrc 的前端开发又有多少? 你要知道普通开发只想要答案,你给解释思路是没用的,要把大家都当成草台班子。 |
![]() |
29
the1812 7 小时 32 分钟前 ![]() 这问题我也遇到过,搜到的都是绕过方法,最后自己研究了下是 webpack 一个插件内部调了 md4 hash ,这玩意高版本 Node 已经废弃删掉了
|
30
humbass 7 小时 31 分钟前 via Android ![]() nvm 不是基本操作吗
|
31
syseven 7 小时 31 分钟前 ![]() 多版本切换推荐 https://moonrepo.dev/proto
|
32
dode 7 小时 27 分钟前
|
33
TabGre 7 小时 26 分钟前 via iPhone ![]() ci/cd 碰到一次 原因是默认 nodejs 版本更新了 我 TM
|
36
mizuki9 7 小时 20 分钟前 ![]() 多版本 node 共存,然后切 node 是可以解决的。
但个人觉得优雅一点的方法是如题主所说,在 .npmrc 中加一行 node-options="--openssl-legacy-provider" 这样在小组中共同开发时,无论每个人用的时高版本还是低版本 node ,都可以直接 npm 运行,无需更多操作 |
37
FalconD 7 小时 19 分钟前 via Android ![]() @shadowyue
Gemini 2.5 Pro w/ built-in search Prompt: Persist it for node projects: NODE_OPTIONS=--openssl-legacy-provider npm run dev Response: 1.Modifying `package.json` Scripts 2.Using a `.npmrc` file 3.Setting Environment Variables at the OS Level Citations: https://stackoverflow.com/questions/77420041/how-to-set-node-options-for-all-package-json-scripts-at-once |
40
way2create 6 小时 36 分钟前
后端,不懂,遇到过几次,我都选择直接 nvm/pnpm 切 nodejs 版本
感觉这不能说明 AI 草台吧,这已经能解决问题了,而且又不是唯一解 "这是 window 的命令行才能用,你让苹果设备的同事怎么办" 这也没啥好吐槽的吧 知道意思是设置环境变量不就行了 |
41
Rache1 6 小时 20 分钟前
我没记错的话,当出现这个报错的时候, 报错信息里面就有引导添加 --openssl-legacy-provider 选项进行启动的说明
延申检索一下其实很容易找到相关的解决方案 --- 至于你说的不同环境下设置环境变量的方式不一样,其实 node 也有相关的包 cross-env 来解决。 --- 但是,如果当出现这个问题的时候,最好还是选择合适的 node 版本,因为你不知道还有没有其他更多的坑在等着你。 话说回来, 虽然 nvm 这类的 node 版本管理工具,但是很多前端开发,都没有管理 node 版本的这个概念,当拿到一个项目的时候,只有口口相传、或者靠猜,才能知道这个项目依赖的 node 版本是多少。 然而,nvm 有 .nvmrc ,社区还有 .node-verison ,package.json 里面甚至还有专门的 engines 字段用来保存记录这些信息等等各种方案,但是实际公司项目中却鲜有见到,都是靠口口相传。 |
![]() |
42
yigefanqie 2 小时 47 分钟前 via iPhone
你以为你这个答案就完美了啊,别人用低版本 node 就起不来了
|
![]() |
44
isa 2 小时 30 分钟前
技术问题避免搜索、查看中文内容, Google 搜索语言切换为英文, 你的问题在 Google 搜索第一个 stack overflow 的高赞回答就是最完善的答案
|
45
kekxv 2 小时 16 分钟前 via iPhone
package.json 里面直接加上,提交到仓库就好了:
"scripts": { "serve": "vue-cli-service serve --mode dev --host 0.0.0.0", "build": "vue-cli-service build --mode prod", "dev-height": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve --mode dev --host 0.0.0.0", "build-height": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build --mode prod", "install-height": "npm install --legacy-peer-deps", "build:zip": "node build/build-zip.js" }, |
46
craftsmanship 2 小时 15 分钟前 via Android
@supuwoerc 能具体说说 nvm 有哪些问题吗
|
![]() |
47
Linho1219 2 小时 10 分钟前 via Android
写 .npmrc 不一定是好方案,因为会影响整个项目。大多数情况下都是某个命令碰到问题专门做设置。你对整个项目应用设置之后,要是影响到其他命令,排错会把你搞疯掉(因为你改动默认行为了)。此外如果这部分代码改动了没这个问题了,留在 .npmrc 里后续鬼知道这个选项为什么要放着。最佳实践应该还是 cross-env
|
![]() |
48
Linho1219 1 小时 35 分钟前
以及同意上面说的楼主可能对 node ,跨平台这些不太熟悉。cross-env 算比较基本的工具了,问 AI 或者上网搜肯定一下子就出来了,怀疑楼主不仅不熟悉这些,prompt 水平也有限。
还有一点是我遇到兼容性问题的话第一反应是先找有没有替代的包,实在不行去尝试 patch 出问题的包。因为如果只是小问题的话 patch 一下是最方便的,而且如果后续包更新了,patch 也会在第一时间抛出错误要求人工介入,可维护性优良。npm 下使用 patch-package ,pnpm 下自带了。像命令行开关这种依赖 node 版本的,尤其是这种和 legacy 相关的指不定后面就移除了(不是指此例,而是指一般思路)。 针对这个问题我查了一下,实际上这个命令行开关对应 OpenSSL 的 OSSL_PROVIDER-legacy ,文档描述如下:The OpenSSL legacy provider supplies OpenSSL implementations of algorithms that have been deemed legacy. Such algorithms have commonly fallen out of use, have been deemed insecure by the cryptography community, or something similar. 那,本质是楼主的部分代码,或者依赖的代码使用了过时、不安全的密码学算法。如果是自己的代码,应该换用更安全的加密;如果不是自己的代码而是某个依赖,那这个依赖绝对会报 deprecated ,应当更换或者 patch 掉,这才是根本路径,用这个命令行开关不过是掩耳盗铃,把安全性问题埋起来了。如果你说安全性无所谓,如果不是密码学安全问题那用什么 OpenSSL 呢? 还有一个点,楼主疑似有点半桶水了,自己学得并不算特别怎么样却在那里说全世界都是烂的。所有回答都是社区共建共享的,每个回答都有局限性,有些是临时解法,有些是针对特定环境。如果你觉得 StackOverflow 或者其他论坛上的回答不好,你应该在下面回帖,而不是抱怨完拍拍屁股走了。如果楼主觉得这些和自己无关,那可能更适合去贴吧微博小红书发泄情绪,V2EX 都不太适合干这个 |