V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shadowyue
0.35D
V2EX  ›  程序员

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

  •  
  •   shadowyue · 8 小时 7 分钟前 · 1608 次点击

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

    49 条回复    2025-09-19 00:44:31 +08:00
    pyyalt
        1
    pyyalt  
       8 小时 3 分钟前
    我之前也遇到的同样的问题,后来直接统一版本解决的。😁
    supuwoerc
        2
    supuwoerc  
       8 小时 1 分钟前
    我是个人项目就不用 npmrc ,我喜欢借助 volta 来吧 node,pnpm,npm 啥的版本 pin 到项目,公司的项目因为有私服啥的才用 npmrc 来设置一些配置
    shadowyue
        3
    shadowyue  
    OP
       8 小时 0 分钟前
    @pyyalt 难办哦,公司不少老项目,根本不敢升级
    iamwin
        4
    iamwin  
       8 小时 0 分钟前
    会不会可能你看到这些文章发的时候,还没有这个参数?
    murmur
        5
    murmur  
       8 小时 0 分钟前   ❤️ 1
    我也遇到个这个问题,结果是我现在电脑上从 6.0 到 22 装了一大堆 node 环境,不知道啥时候哪个版本就八字不合
    shadowyue
        6
    shadowyue  
    OP
       7 小时 59 分钟前
    @supuwoerc volta 我都没用过,跟你比我草台了
    tcdw
        7
    tcdw  
       7 小时 58 分钟前   ❤️ 1
    我们当时用的是 cross-env 解决了两个平台之间指定环境变量方式不一样的问题。不过我认为,楼主的这个方案会更加优雅。
    shadowyue
        8
    shadowyue  
    OP
       7 小时 57 分钟前
    @iamwin 不可能,openssl-legacy-provider 这个参数很老的 node 版本都有了
    shadowyue
        9
    shadowyue  
    OP
       7 小时 56 分钟前
    @murmur 项目多了这就是避不开的苦,得吃
    maggch97
        10
    maggch97  
       7 小时 56 分钟前
    关于 env 那一部分评论,我觉得你对 node ,对操作系统,对命令行等等都不是太懂的样子
    shadowyue
        11
    shadowyue  
    OP
       7 小时 54 分钟前
    @maggch97 可以多说说,我虚心接受
    deplives
        12
    deplives  
       7 小时 51 分钟前

    deplives
        13
    deplives  
       7 小时 50 分钟前
    兄弟,你不知道 npmrc ?
    shadowyue
        14
    shadowyue  
    OP
       7 小时 50 分钟前
    @deplives bro 没看完我内容吧?这个不是好方案。
    thealert
        15
    thealert  
       7 小时 50 分钟前   ❤️ 1
    很简单的问题搞得这么复杂也是绝了
    Vegetable
        16
    Vegetable  
       7 小时 49 分钟前   ❤️ 1
    nodejs 升级带来的兼容性问题很多很常见,我也是第一次听说 volta 这个工具,之前都没听说过锁 nodejs 版本的工具。这一点踩过坑的人应该很多,确实挺恶心的。
    deplives
        17
    deplives  
       7 小时 46 分钟前
    @shadowyue #14 你给出的方案不就是 npmrc 增加 node-options=--openssl-legacy-provider
    你都搜到了 export NODE_OPTIONS=--openssl-legacy-provider 觉得每次都要挂一个 export 不优雅都不知道这个是直接可以写到 npmrc 。那不就说明了你根本就不知道 npmrc 这个东西存在?
    shadowyue
        18
    shadowyue  
    OP
       7 小时 45 分钟前
    @deplives #17 你看完我文章了吗,我最后说的方案就是你这个。
    没看看完你就回复,别急兄弟。
    ultimate42
        19
    ultimate42  
       7 小时 42 分钟前
    @maggch97 #10 我也觉得 稍微问了下 ai 给的几个方案都挺正常的,稍微做过几年前端都应该至少知道一个管理 node 版本的工具吧,项目固定 node 版本不是挺正常吗
    mizuki9
        20
    mizuki9  
       7 小时 40 分钟前   ❤️ 1
    node 使用最新版,在项目根目录下创建 .npmrc
    deplives
        21
    deplives  
       7 小时 40 分钟前   ❤️ 1
    @shadowyue #18 [捏麻麻的😡😡😡为什么很简单的前端问题网上搜到的答案质量居然这么差劲]
    这是你的标题,
    我质疑的是,这么个东西,不需要很复杂的搜索,我 Google 第一条,第一个 SOF 的回复就是这个方案,但是你一直在纠结 npm 要在命令行前面加一个 export 却完全不知道环境变量可以写在 npmrc 中。所以问题不在于搜索到的质量差
    mizuki9
        22
    mizuki9  
       7 小时 40 分钟前
    @mizuki9 里面加一行 node-options="--openssl-legacy-provider"
    ultimate42
        23
    ultimate42  
       7 小时 39 分钟前
    @Vegetable nvm fnm volta 都能锁 node 版本吧,很多开源项目都有个.nvmrc 或者.node-version 的文件,不过我个人喜欢 volta
    mizuki9
        24
    mizuki9  
       7 小时 39 分钟前
    @mizuki9 启动项目用 npm ,就可以了,其他 pnpm ,yarn 不行
    mizuki9
        25
    mizuki9  
       7 小时 37 分钟前   ❤️ 1
    没看见题主已经给出方案了,我瞎了
    dode
        26
    dode  
       7 小时 34 分钟前
    AI 秒解决
    shadowyue
        27
    shadowyue  
    OP
       7 小时 34 分钟前
    @deplives #21
    你这要求太高了,知道怎么配置 mac 或者 windows 环境变量的前端开发能有多少?
    然后知道配置 npmrc 的前端开发又有多少?
    你要知道普通开发只想要答案,你给解释思路是没用的,要把大家都当成草台班子。
    shadowyue
        28
    shadowyue  
    OP
       7 小时 32 分钟前
    @dode 啥 AI 这么牛,直接给优质解答了吗
    the1812
        29
    the1812  
       7 小时 32 分钟前   ❤️ 1
    这问题我也遇到过,搜到的都是绕过方法,最后自己研究了下是 webpack 一个插件内部调了 md4 hash ,这玩意高版本 Node 已经废弃删掉了
    humbass
        30
    humbass  
       7 小时 31 分钟前 via Android   ❤️ 1
    nvm 不是基本操作吗
    syseven
        31
    syseven  
       7 小时 31 分钟前   ❤️ 1
    多版本切换推荐 https://moonrepo.dev/proto
    TabGre
        33
    TabGre  
       7 小时 26 分钟前 via iPhone   ❤️ 1
    ci/cd 碰到一次 原因是默认 nodejs 版本更新了 我 TM
    shadowyue
        34
    shadowyue  
    OP
       7 小时 23 分钟前
    @dode 你没看我我文章吧,我专门吐槽了 AI 的回答,除了最后的 nvm 版本切换方案,都不算好的办法。
    supuwoerc
        35
    supuwoerc  
       7 小时 22 分钟前
    @shadowyue nvm 不好用,很多奇怪的问题,现在都转 volta 或者 fnm 了
    mizuki9
        36
    mizuki9  
       7 小时 20 分钟前   ❤️ 1
    多版本 node 共存,然后切 node 是可以解决的。
    但个人觉得优雅一点的方法是如题主所说,在 .npmrc 中加一行 node-options="--openssl-legacy-provider"
    这样在小组中共同开发时,无论每个人用的时高版本还是低版本 node ,都可以直接 npm 运行,无需更多操作
    FalconD
        37
    FalconD  
       7 小时 19 分钟前 via Android   ❤️ 1
    @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
    shadowyue
        38
    shadowyue  
    OP
       7 小时 17 分钟前
    @FalconD 有没有发现你这个答案的帖子,看过的人少的可怜。
    ksjob
        39
    ksjob  
       7 小时 14 分钟前
    @supuwoerc 学到了,我去研究研究这个
    way2create
        40
    way2create  
       6 小时 36 分钟前
    后端,不懂,遇到过几次,我都选择直接 nvm/pnpm 切 nodejs 版本

    感觉这不能说明 AI 草台吧,这已经能解决问题了,而且又不是唯一解

    "这是 window 的命令行才能用,你让苹果设备的同事怎么办" 这也没啥好吐槽的吧 知道意思是设置环境变量不就行了
    Rache1
        41
    Rache1  
       6 小时 20 分钟前
    我没记错的话,当出现这个报错的时候, 报错信息里面就有引导添加 --openssl-legacy-provider 选项进行启动的说明

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


    ---

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


    ---

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


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

    然而,nvm 有 .nvmrc ,社区还有 .node-verison ,package.json 里面甚至还有专门的 engines 字段用来保存记录这些信息等等各种方案,但是实际公司项目中却鲜有见到,都是靠口口相传。
    yigefanqie
        42
    yigefanqie  
       2 小时 47 分钟前 via iPhone
    你以为你这个答案就完美了啊,别人用低版本 node 就起不来了
    YsHaNg
        43
    YsHaNg  
       2 小时 33 分钟前 via iPhone
    @shadowyue 前端就该不知道环境变量?“要把大家都当成草台班子” hmmmm
    isa
        44
    isa  
       2 小时 30 分钟前
    技术问题避免搜索、查看中文内容, Google 搜索语言切换为英文, 你的问题在 Google 搜索第一个 stack overflow 的高赞回答就是最完善的答案
    kekxv
        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"
    },
    craftsmanship
        46
    craftsmanship  
       2 小时 15 分钟前 via Android
    @supuwoerc 能具体说说 nvm 有哪些问题吗
    Linho1219
        47
    Linho1219  
       2 小时 10 分钟前 via Android
    写 .npmrc 不一定是好方案,因为会影响整个项目。大多数情况下都是某个命令碰到问题专门做设置。你对整个项目应用设置之后,要是影响到其他命令,排错会把你搞疯掉(因为你改动默认行为了)。此外如果这部分代码改动了没这个问题了,留在 .npmrc 里后续鬼知道这个选项为什么要放着。最佳实践应该还是 cross-env
    Linho1219
        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 都不太适合干这个
    w568w
        49
    w568w  
       51 分钟前
    @shadowyue #11 10L 那位可以看看发言记录,反驳找茬型人格,张嘴就是阴阳怪气。建议直接 block 一劳永逸
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1183 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:35 · PVG 01:35 · LAX 10:35 · JFK 13:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.