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

94 天前
 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 配置文件,那这是另外一个值得吐槽的草台故事了)

6812 次点击
所在节点    程序员
78 条回复
Rache1
94 天前
我没记错的话,当出现这个报错的时候, 报错信息里面就有引导添加 --openssl-legacy-provider 选项进行启动的说明

延申检索一下其实很容易找到相关的解决方案


---

至于你说的不同环境下设置环境变量的方式不一样,其实 node 也有相关的包 cross-env 来解决。


---

但是,如果当出现这个问题的时候,最好还是选择合适的 node 版本,因为你不知道还有没有其他更多的坑在等着你。


话说回来, 虽然 nvm 这类的 node 版本管理工具,但是很多前端开发,都没有管理 node 版本的这个概念,当拿到一个项目的时候,只有口口相传、或者靠猜,才能知道这个项目依赖的 node 版本是多少。

然而,nvm 有 .nvmrc ,社区还有 .node-verison ,package.json 里面甚至还有专门的 engines 字段用来保存记录这些信息等等各种方案,但是实际公司项目中却鲜有见到,都是靠口口相传。
yigefanqie
94 天前
你以为你这个答案就完美了啊,别人用低版本 node 就起不来了
YsHaNg
94 天前
@shadowyue 前端就该不知道环境变量?“要把大家都当成草台班子” hmmmm
isa
94 天前
技术问题避免搜索、查看中文内容, Google 搜索语言切换为英文, 你的问题在 Google 搜索第一个 stack overflow 的高赞回答就是最完善的答案
kekxv
94 天前
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"
},
craftsmanship
94 天前
@supuwoerc 能具体说说 nvm 有哪些问题吗
Linho1219
94 天前
写 .npmrc 不一定是好方案,因为会影响整个项目。大多数情况下都是某个命令碰到问题专门做设置。你对整个项目应用设置之后,要是影响到其他命令,排错会把你搞疯掉(因为你改动默认行为了)。此外如果这部分代码改动了没这个问题了,留在 .npmrc 里后续鬼知道这个选项为什么要放着。最佳实践应该还是 cross-env
Linho1219
94 天前
以及同意上面说的楼主可能对 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 都不太适合干这个
w568w
94 天前
@shadowyue #11 10L 那位可以看看发言记录,反驳找茬型人格,张嘴就是阴阳怪气。建议直接 block 一劳永逸
wdssmq
94 天前
在八月份,我遇到个 TortoiseGit 的使用问题,有篇发在 CSDN 但是内容是「未渲染的 Markdown 」姑且是正确答案,但是混杂在各种错误答案中间,错误答案也是 AI 生成又被各种采集。。

刚才用更精确的搜索描述重新搜索,Bing 的 AI 基于那篇正确答案重新总结了一遍又,但是强行把假定操作目标为「前前次提交」,加重了阅读负担;

TortoiseGit 修改多条历史提交( commit message ) - 搜索
https://cn.bing.com/search?q=TortoiseGit+%E4%BF%AE%E6%94%B9%E5%A4%9A%E6%9D%A1%E5%8E%86%E5%8F%B2%E6%8F%90%E4%BA%A4%EF%BC%88commit+message%EF%BC%89
aloxaf
93 天前
我觉得 set NODE_OPTIONS=--openssl-legacy-provider 这个答案已经很简单很完美了,我不知道逆天在哪里:首先能看出这是设置了一个环境变量,其次能看出这是给 node 增加了一个默认选项,这还不够吗?

觉得这个答案很逆天,才是真的逆天。
ma46
93 天前
很难想象有程序员不会设置环境变量
wangtian2020
93 天前
又老又臭的项目会这样
NessajCN
93 天前
我明白了,楼主不是来抱怨互联网上答案
而是来黑前端们有多菜的

当然也可能只是自爆而已
lnbiuc
93 天前
培训出来的的前端?怎么会不知道系统环境变量这东西
Isuxiz
93 天前
环境变量属于不可配置的内容吗?是我癫了还是世界癫了?
cherryas
93 天前
环境变量都成高深的技术了?
kakakakaka8889
93 天前
你这个也没有解决本质问题啊,你只能解决你自己的整个项目的问题也没有解决,最佳方案就是切 node 版本用 nvm 或者其他管理工具多个项目多个版本就行了
lizy0329
93 天前
@shadowyue #3 用 volta 直接 pin 死版本,非常好用
deplives
93 天前
@shadowyue #27 连环境变量没听过,这可不叫草台班子,这就是单纯的菜,菜的抠脚。别给前端招黑了,前端也算开发,我不信大多数不知道怎么配置环境变量。别把自己身边菜的抠脚的开发当做全世界都是这样。

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

https://ex.noerr.eu.org/t/1160278

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

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

© 2021 V2EX