事情的起因很简单,在我运行一个老的 vue 项目时候出现了报错:
error:0308010c:digital envelope routines::unsupported
经过简单的查询,我马上找到了根本原因:
我本地安装的 nodejs 版本太高了,在使用 OpenSSL 相关功能的时候有兼容性问题。为此,nodejs 专门提供了一个命令行参数--openssl-legacy-provider ,只要启用了这个参数就没问题了。
重点来了,只要你在网上搜索error:0308010c:digital envelope routines::unsupported这个异常信息,无论是 google 的还是百度的,给的解决方案都十分逆天,归类如下:
1.把高版本卸载掉,装低版本。简直是神仙的不能在神仙的解决方案。
如果回答者提了一嘴 nvm 还能算个正经方案。
以我多年的经验,不知道 nvm 的草台前端开发多的是。
2.在原始的启动命令 npm run dev 前面补充参数设置:
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 已经不知道烧掉了人类多少亿的资金了,这么小一个问题依然没有给出优质回答。
所以对 AI 感到焦虑的程序员朋友们,不必在意,AI 和我们一样有够草台的。
最后附上我觉得合理的解决方案:
我认为正确处理问题的思路应该是,既然这是 nodejs 的配置问题,
那我在运行这个项目启动 nodejs 的时候给增加所需要的参数就好了。
那我是怎么启动 nodejs 的?通过 npm ,那么 npm 执行 script 的时候,
有没有办法给 node 传参?顺着这个思路,查询 npm 的文档,
最终我认为最简单、最直接、而且能够配置化的解决方案是:
在你项目的.npmrc 文件中增加一行配置:
node-options=--openssl-legacy-provider
(什么?你说你的前端项目从来没用过.npmrc 配置文件,那这是另外一个值得吐槽的草台故事了)
