升级 Node 之后,npm run dev 直接报 error:0308010C digital envelope routines::unsupported。项目代码一行没改,构建却起不来,问题出在 Node 17 以后默认使用 OpenSSL 3,不再允许旧的摘要算法。
先确认是哪种情况
报错堆栈里如果出现 webpack、node-sass 或旧版 vue-cli,基本可以确定是老构建工具在调用 md4。新项目用 webpack 5 一般不会遇到。
临时方案:加兼容参数
$env:NODE_OPTIONS="--openssl-legacy-provider" npm run dev
Linux 和 macOS 上是 NODE_OPTIONS=–openssl-legacy-provider npm run dev。这个参数只是让旧算法继续可用,属于过渡手段,不要写进生产构建脚本。
稳妥方案:降 Node 或升工具链
用 nvm 切到 Node 16 可以立刻恢复开发。长期看应该把 webpack 升到 5、把 node-sass 换成 sass,这两个是报错最集中的依赖。升级后构建速度通常也会变快。
别忽略锁文件
换 Node 版本后先删掉 node_modules 和锁文件重装,混用不同版本安装出来的依赖会带来新的原生模块报错,排查成本更高。
团队协作时把这个版本要求写进 README 或 .nvmrc,避免新同事克隆下来第一件事就是踩这个坑。构建服务器上也一样,CI 镜像的 Node 版本最好和开发机保持一致。
如果必须留在新版本,优先升级依赖而不是长期依赖兼容参数,否则后续再升级会更麻烦。