除了必须升级 node 版本以外的所有情况
对社会进步感觉恐惧的时候
🤣团队他人的能力完全 cover 不住任何技术迭代所带来的任何问题的时候,老老实实 nvm use 14 就得了。大家都是赚口饭钱没啥必要
项目年久失修的情况下
项目依赖导致升不上去了. 不维护升级的话, 这个项目基本的所有依赖就锁死版本上限了, 后续想要升级都不敢动, 最后变成💩山, 只能推倒重来
例如我们的 nuxt2 项目, 好家伙, 直接锁死在 16.14.2, 再高一点点都跑不起来, 其他项目我都升到 18.17.1 了, 就这个不敢动也没法动…
#5 就是部分依赖不支持高版本的 node ?
比如老旧项目,升级不如重写,
我司现在有
- 两个 Angular 6 的项目,Node v12
- 两个 Angular 8 的项目,Node v14
- 三个 Angular 13 的项目,Node v16
纠正一下上文,检查了一个 Angular 6 和 8 的项目,Node 版本是 8 和 10 (掩面)
当你接手一个依赖 sass 的项目时。
小项目随便,大项目 node 升级带来的破坏改动传导到依赖升级,依赖升级带来的破环改动传导到项目本身,然后项目本身兼容这些破环性改动的带来的 bug 和测试成本,算算成本和毛利率基本就放弃了……
没有时间的时候
看来我接触的项目还是不够老😂
能用
#6 依赖 webpack 4 ,webpack 4 使用了旧版 OpenSSL 的接口。webpack 4 貌似使用了 md4 ,无法适配新的 openssl 接口。
其次,nuxt2 ,vue-cli (这货弃用前还能更 webpack5 ) 都直接弃用了😂,要么加参数,要么就只能摆烂了。
让不会 node 的人搞基建,就会成这个样子
暂时无法联网的时候。
#14 那新需求能用的依赖都不支持低版本的 node ,怎么办
#17
因此 Node 有 node 版本管理器啊。比如说 NVM 、N 、PNPM 自带的 env 。
你可以把这个理解成 python 的虚拟环境,不过这个本质更简单,只是改了下 PATH 中 node 的位置。
P.S 三个里面 n 应该是最好用的,全局包是共享的,但是可能会引入版本冲突问题(如果你往全局赛的不只是 cli tool )
#18 我知道有版本管理工具,我的意思是在一个低版本 node 才能跑的项目中,某一天要加新功能,而这个功能用到的依赖不支持低版本 node ,这时候要怎么处理?
#19 看看库的老版本支不支持,不支持的话只能换别的库、找 polyfill 或者转义(尤其是针对新的 ES 语法,譬如 JS 的 private field )、要么就是自己移植。
---------
这种坑蛮多的,比如说 chalk ,got 这种:node 现在掀起了一股重写成 esm 的潮流——老的 CommonJS 项目,要么找个转义器,比如说 babel ;要么就是用他的旧版本;要么就是花时间换别的库替代。
hahaha 我们 node8 webpack 1.x ,没人想改。npm install 都无法成功,必须通过特殊手段安装。
说到底就是成本和收益的权衡。有很多屎山业务系统,用的基础组件已经爆出很多严重安全漏洞了,但就是不去更新。因为安全问题并不一定真的会导致事故,但把业务系统更新挂了又修不好那可是要丢饭碗的。
现实中有很多程序员在对用到的 library/SDK/API/whatever 理解不到位的情况下,发现实际由于 bug 导致的测试行为跟文档不一致,并不会意识到是 bug ,而是凭着瞎猜各种补来补去搞定,还自以为有了新经验。这种你要是去升了,fix bug 了,人家依赖 bug 行为而写的业务系统铁定挂掉。
#23 所以定位 bug 的能力也挺重要的
开发环境:nvm 随便改
生产环境:非必要不更新
无所谓,就算升到 v20 还是会用npm install --legacy-peer-deps
古老項目
如果不升级,项目跑不了,那升级;如果升级可以加薪,那升级。否则,都不升级。
patch 版本通常都会修复 bug 和安全漏洞的,所以一般能升就升。
minor 版本通常会引入新特性,或积累比较多的更新,出了一个 minor 之后就不会出上一个 minor 的 patch ,所以一般能升就升。
major 版本通常有支持周期的,如果过了周期也就不会有修复 bug 或安全更新了,所以最好随时保证 major 版本仍有更新支持。其他的就是看依赖包是不是兼容,像 gyp 包就有可能跟 major 版本强相关,node 过新可能编译失败。
当然不管什么时候给项目升级,都要做好测试,最好能灰度发布看一看;这个不论是升级 node 还是升级依赖还是升级系统环境都是一样的。
代码层面,新版本废除了一些老版本的 API
服务端一般不升。但是打包比如 webpack 总是尽量升
没有写单元测试就不升级,写了完善的测试就修改到可以全 PASS 为止
升不上去的时候,选择不升级 node 版本。
核心业务跑在 Ubuntu 16 上,实在是升不上去各种依赖缺失。
试了几个版本用不了,最终用的 nodejs 最新的 v16 ,还行,最新的方便 API 齐全。
2023 年了,
node-sass 早就一脚踹出依赖了 https://www.npmjs.com/package/node-sass
dart-sass 直接平替 https://www.npmjs.com/package/sass
在决定是否升级 Node.js 版本时,有几种情况可能会促使开发者选择保持当前版本不变。以下是一些常见的场景,以及简要的代码或解释来说明这些决策:
-
项目稳定性需求: 如果当前项目在生产环境中稳定运行,且没有遇到明显的性能瓶颈或安全问题,那么升级 Node.js 版本可能会引入未知风险。例如,某些依赖库可能还未完全兼容新版本。
// 示例:旧版本Node.js上的稳定代码 const http = require('http'); http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(3000, '127.0.0.1'); console.log('Server running at http://127.0.0.1:3000/');
-
依赖库兼容性: 项目依赖的第三方库可能尚未发布与新版本 Node.js 兼容的版本。升级 Node.js 可能导致这些库无法正常工作。
# 示例:检查依赖库兼容性 npm outdated npm ls <package-name>
-
资源限制: 在某些情况下,升级 Node.js 版本可能需要更多的系统资源(如内存、CPU),而现有硬件可能无法满足这些要求。
-
团队熟悉度: 团队成员对当前版本的 Node.js 更熟悉,升级可能需要进行额外的培训和学习,增加开发成本。
综上所述,在评估升级 Node.js 版本的利弊时,需综合考虑项目稳定性、依赖库兼容性、资源限制和团队熟悉度等因素。