捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲

4 天前
 shadowyue

事情的起因很简单,在我运行一个老的 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 配置文件,那这是另外一个值得吐槽的草台故事了)

5560 次点击
所在节点    程序员
78 条回复
pyyalt
4 天前
我之前也遇到的同样的问题,后来直接统一版本解决的。😁
supuwoerc
4 天前
我是个人项目就不用 npmrc ,我喜欢借助 volta 来吧 node,pnpm,npm 啥的版本 pin 到项目,公司的项目因为有私服啥的才用 npmrc 来设置一些配置
shadowyue
4 天前
@pyyalt 难办哦,公司不少老项目,根本不敢升级
iamwin
4 天前
会不会可能你看到这些文章发的时候,还没有这个参数?
murmur
4 天前
我也遇到个这个问题,结果是我现在电脑上从 6.0 到 22 装了一大堆 node 环境,不知道啥时候哪个版本就八字不合
shadowyue
4 天前
@supuwoerc volta 我都没用过,跟你比我草台了
tcdw
4 天前
我们当时用的是 cross-env 解决了两个平台之间指定环境变量方式不一样的问题。不过我认为,楼主的这个方案会更加优雅。
shadowyue
4 天前
@iamwin 不可能,openssl-legacy-provider 这个参数很老的 node 版本都有了
shadowyue
4 天前
@murmur 项目多了这就是避不开的苦,得吃
penzi
4 天前
关于 env 那一部分评论,我觉得你对 node ,对操作系统,对命令行等等都不是太懂的样子
shadowyue
4 天前
@maggch97 可以多说说,我虚心接受
deplives
4 天前

deplives
4 天前
兄弟,你不知道 npmrc ?
shadowyue
4 天前
@deplives bro 没看完我内容吧?这个不是好方案。
thealert
4 天前
很简单的问题搞得这么复杂也是绝了
Vegetable
4 天前
nodejs 升级带来的兼容性问题很多很常见,我也是第一次听说 volta 这个工具,之前都没听说过锁 nodejs 版本的工具。这一点踩过坑的人应该很多,确实挺恶心的。
deplives
4 天前
@shadowyue #14 你给出的方案不就是 npmrc 增加 node-options=--openssl-legacy-provider
你都搜到了 export NODE_OPTIONS=--openssl-legacy-provider 觉得每次都要挂一个 export 不优雅都不知道这个是直接可以写到 npmrc 。那不就说明了你根本就不知道 npmrc 这个东西存在?
shadowyue
4 天前
@deplives #17 你看完我文章了吗,我最后说的方案就是你这个。
没看看完你就回复,别急兄弟。
ultimate42
4 天前
@maggch97 #10 我也觉得 稍微问了下 ai 给的几个方案都挺正常的,稍微做过几年前端都应该至少知道一个管理 node 版本的工具吧,项目固定 node 版本不是挺正常吗
mizuki9
4 天前
node 使用最新版,在项目根目录下创建 .npmrc

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1160278

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX