捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲
事情的起因很简单,在我运行一个老的 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 配置文件,那这是另外一个值得吐槽的草台故事了)
我之前也遇到的同样的问题,后来直接统一版本解决的。😁
我是个人项目就不用 npmrc ,我喜欢借助 volta 来吧 node,pnpm,npm 啥的版本 pin 到项目,公司的项目因为有私服啥的才用 npmrc 来设置一些配置
难办哦,公司不少老项目,根本不敢升级
会不会可能你看到这些文章发的时候,还没有这个参数?
我也遇到个这个问题,结果是我现在电脑上从 6.0 到 22 装了一大堆 node 环境,不知道啥时候哪个版本就八字不合
volta 我都没用过,跟你比我草台了
我们当时用的是 cross-env 解决了两个平台之间指定环境变量方式不一样的问题。不过我认为,楼主的这个方案会更加优雅。
不可能,openssl-legacy-provider 这个参数很老的 node 版本都有了
项目多了这就是避不开的苦,得吃
关于 env 那一部分评论,我觉得你对 node ,对操作系统,对命令行等等都不是太懂的样子
可以多说说,我虚心接受
兄弟,你不知道 npmrc ?
bro 没看完我内容吧?这个不是好方案。
很简单的问题搞得这么复杂也是绝了
nodejs 升级带来的兼容性问题很多很常见,我也是第一次听说 volta 这个工具,之前都没听说过锁 nodejs 版本的工具。这一点踩过坑的人应该很多,确实挺恶心的。
#14 你给出的方案不就是 npmrc 增加 node-options=--openssl-legacy-provider
你都搜到了 export NODE_OPTIONS=--openssl-legacy-provider 觉得每次都要挂一个 export 不优雅都不知道这个是直接可以写到 npmrc 。那不就说明了你根本就不知道 npmrc 这个东西存在?
#17 你看完我文章了吗,我最后说的方案就是你这个。
没看看完你就回复,别急兄弟。
#10 我也觉得 稍微问了下 ai 给的几个方案都挺正常的,稍微做过几年前端都应该至少知道一个管理 node 版本的工具吧,项目固定 node 版本不是挺正常吗
node 使用最新版,在项目根目录下创建 .npmrc
#18 [捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲]
这是你的标题,
我质疑的是,这么个东西,不需要很复杂的搜索,我 Google 第一条,第一个 SOF 的回复就是这个方案,但是你一直在纠结 npm 要在命令行前面加一个 export 却完全不知道环境变量可以写在 npmrc 中。所以问题不在于搜索到的质量差
里面加一行 node-options="--openssl-legacy-provider"
nvm fnm volta 都能锁 node 版本吧,很多开源项目都有个.nvmrc 或者.node-version 的文件,不过我个人喜欢 volta
启动项目用 npm ,就可以了,其他 pnpm ,yarn 不行
没看见题主已经给出方案了,我瞎了
AI 秒解决
#21
你这要求太高了,知道怎么配置 mac 或者 windows 环境变量的前端开发能有多少?
然后知道配置 npmrc 的前端开发又有多少?
你要知道普通开发只想要答案,你给解释思路是没用的,要把大家都当成草台班子。
啥 AI 这么牛,直接给优质解答了吗
这问题我也遇到过,搜到的都是绕过方法,最后自己研究了下是 webpack 一个插件内部调了 md4 hash ,这玩意高版本 Node 已经废弃删掉了
nvm 不是基本操作吗
多版本切换推荐 moonrepo.dev/proto
chatgpt.com/s/t_68cbda065cdc81919e265a9f925fdc39
ci/cd 碰到一次 原因是默认 nodejs 版本更新了 我 TM
你没看我我文章吧,我专门吐槽了 AI 的回答,除了最后的 nvm 版本切换方案,都不算好的办法。
nvm 不好用,很多奇怪的问题,现在都转 volta 或者 fnm 了
多版本 node 共存,然后切 node 是可以解决的。
但个人觉得优雅一点的方法是如题主所说,在 .npmrc 中加一行 node-options="--openssl-legacy-provider"
这样在小组中共同开发时,无论每个人用的时高版本还是低版本 node ,都可以直接 npm 运行,无需更多操作
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:
stackoverflow.com/questions/77420041/how-to-set-node-options-for-all-package-json-scripts-at-once
有没有发现你这个答案的帖子,看过的人少的可怜。
学到了,我去研究研究这个
后端,不懂,遇到过几次,我都选择直接 nvm/pnpm 切 nodejs 版本
感觉这不能说明 AI 草台吧,这已经能解决问题了,而且又不是唯一解
"这是 window 的命令行才能用,你让苹果设备的同事怎么办" 这也没啥好吐槽的吧 知道意思是设置环境变量不就行了
我没记错的话,当出现这个报错的时候, 报错信息里面就有引导添加 --openssl-legacy-provider 选项进行启动的说明
延申检索一下其实很容易找到相关的解决方案
至于你说的不同环境下设置环境变量的方式不一样,其实 node 也有相关的包 cross-env 来解决。
但是,如果当出现这个问题的时候,最好还是选择合适的 node 版本,因为你不知道还有没有其他更多的坑在等着你。
话说回来, 虽然 nvm 这类的 node 版本管理工具,但是很多前端开发,都没有管理 node 版本的这个概念,当拿到一个项目的时候,只有口口相传、或者靠猜,才能知道这个项目依赖的 node 版本是多少。
然而,nvm 有 .nvmrc ,社区还有 .node-verison ,package.json 里面甚至还有专门的 engines 字段用来保存记录这些信息等等各种方案,但是实际公司项目中却鲜有见到,都是靠口口相传。
制作了一个小程序,功能是用于网络推广 开发完成,开始备案,备案后上架 备案时候让我介绍我的小程序 我填的: 这个小程序是我公司开发的软件的小程序端,功能是用于网络推广辅…
在华为店里看到那个柔光屏的 pad ,想买个给一年级的小朋友玩(画画,看动画片,轻度益智类游戏) 因为没用过鸿蒙系统,不知道是否能安装安卓 apk 应用,不知道是否麻烦? 另外…
有一些史上最大的高科技公司的交易没有发生。有一些最有前途的产品和服务也没出现。为什么?因为这其中的人和公司当时都没有意识到是什么样的东西滑过了他们的手指,或者,他们只是简单地不…
合速度