前言
时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本。
该版本带来了诸如:
- V8 更新带来好多不错的特性。
- HTTP 解析速度提升。
- 启动速度大幅提升。
- 更好的诊断报告和堆分析工具。
- ESM 模块更新。
原文地址:https://medium.com/@nodejs/introducing-node-js-12-76c41a1b3f3f 语雀地址:https://www.yuque.com/egg/nodejs/nodejs-12
LTS vs Current
如果你不了解 Node.js 的 Long Term Support 发布策略的话,一定要看看 https://github.com/nodejs/Release 。
就目前而言,Node.js 6.x 和 8.x 将在 2019 年末结束 LTS 的支持,大家尽快升级到 10.x 吧。
快速体验
$ nvs add node/12
$ nvs use 12
$ node -v
v12.0.0
具体参考这篇文章:科普文:使用 nvs 管理本地 Node.js 版本
V8 更新到 7.4
大部分情况下,我们不用去考虑性能问题,坐等 V8 版本更新就好了。(大雾)
本次版本更新,也带来了好几个不错的特性:
同时,跑了下我们 Egg 的一些内部测试,发现序列化有 10~20% 的性能提升,恐怖如斯!
另,奇丑无比的 Private Class Fields 也能用了:
class IncreasingCounter {
#count = 0;
get value() {
console.log('Getting the current value!');
return this.#count;
}
increment() {
this.#count++;
}
}
HTTP 解析速度提升
默认的 HTTP 解析器切换为 llhttp ,性能提升恐怖如斯:
点评:恐怖如斯。
启动速度提升
通过 v8 code cache 的支持,在构建时提前为内置库生成代码缓存,从而提升 30% 的启动耗时。 同时,通过重用主进程缓存,Workers Threads 的启动速度提升了 60% 。
点评:恐怖如斯。
Workers Threads
在 10.x 已经引入的 Workers Threads 特性,在 12.x 里面默认启用,无需使用 --experimental-worker
开启。同时基于上一条的介绍,启动的速度也得到大幅提升。
相关介绍:https://medium.com/@Trott/using-worker-threads-in-node-js-80494136dbb6
诊断报告
提供了新的实验性功能『诊断报告』,一个非常有用的特性。 可用于帮助分析诸如:崩溃,性能问题,内存泄漏,高 CPU 占用等等问题。详见 这篇文章。
点评:这也是 AliNode 之前的一个卖点之一。
Heap Dump
以前我们分析问题的时候,需要手动安装对应的类库或者使用 AliNode。
在 12.x 里面内置了该功能,详见:
点评:又一个 AliNode 的功能被内置了。但其实影响不大,AliNode 的核心在于分析平台,这块的采集能力,本来他们就打算开源回馈出去的。
同时,由于上述提到的 V8 升级,现在可以按照可用内存动态调整堆大小了。
ESM 模块方案更新
ES6 模块仍然还在实验阶段,不过有了新的方式,具体参见这篇文章。
点评:让子弹再飞一会,该特性真的不是痛点,不急。
其他更新
- 更好的原生模块支持,N-API 升级为版本 4,并 backport 到 Node.js 8.x 和 10.x。详细参见这篇文章。
- TLS 升级为 1.3, 增强安全功能。
- 随着 C++ 编译器的更新,现在要求
GCC 6
和glibc 2.17
,对应的操作系统 Win7 和 macOS 10,详细参见这篇文章。
不过目前 node-gyp 的一些原生模块会编译失败:
[email protected] › [email protected] › fsevents@^1.2.7 optional error: Error: Run "sh -c node install" error, exit code 1
at ChildProcess.<anonymous> (/Users/tz/.npm-global/lib/node_modules/tnpm/node_modules/[email protected]@runscript/index.js:74:21)
at ChildProcess.emit (events.js:196:13)
at maybeClose (internal/child_process.js:1000:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:267:5)
node-gyp一直都是尴尬的存在,N-API 也是换汤不换药。不过总体还在进步,这就够了。
白嫖的性能提升,真好。 私有域有了,啥时候有装饰器啊
@AnzerWall 是啊,原生的装饰器确实比私有域需求更迫切啊
恐怖如斯
@v5sollee 我还以为看到了辰东的小说,恐怖如斯
@AnzerWall typescript 一时爽, 一直 typescript 一直爽。
llhttp代码更新的还是挺有意思的,给猪哥点赞
有生之年一定能看到node v100
@zengming00 那你要努力活久点,少点 996 . 按当前 Node 的节奏 https://github.com/nodejs/Release ,一年是 2 个版本,到 100 的话,差不多是 2106 年。
奇丑无比的 Private Class Fields
+10086
@atian25 从未996,最惨的时候是17年在兔展大小周,我基本上都是准时上下班的。18年更是从未加过班,我的原则就是加班时间效率约等于0
非常不错,觉得Node12是继引入async await后又一个重要的更新
@zengming00 就最终目标(活到 2106 年)而言,感觉 9 不 9 都没啥区别,哈哈
期待LTS
恐怖如斯
@atian25 一年两个版本 100 个版本,需要到 2106年,欺负我小学数学没学好吗?
@vellengs 终于有人发现了~
@atian25 站在巨人的肩膀上
@atian25 感觉小学数学收到了挑战
node-v100.0.0,想想就 emmm
@zengming00 只有虵才能看到吧
@JacksonTian node12 都出了,深入浅出2 什么时候出啊
@justjavac 很明显要等 node 20 啊
@zuohuadong 目前配合ts还是有bug,不过官方在修了(本来打算业余新工程直接上node12的。。。
@wujohns 后端一直在用 nest.js ,也推荐 midway 之类的框架,默认就是 ts ~
ES6 模块仍然还在实验阶段,不过有了新的方式,具体参见这篇文章。 链接打不开 404We couldn’t find this page.
@atian25 我改改这个这则试试
@AnzerWall 等装饰器有了,离spring boot.js 不远了。
以关注
node 更新速度有些快哦 难道是用的人多了吗
@xuemeifenglin 正常速度,看下 https://github.com/nodejs/Release 就知道了,正常的迭代速度而已,类似 Chromium
@atian25 修了
站在巨人的肩膀上 加油
期待
恐怖如斯, 恐怖如斯
@AnzerWall 1111
@zy445566 kdfkgdfg
111
1111
@kwoktung 2222
编译c++ 模块就傻眼了 ~.~
@spitWind node-gyp v4.0 已经支持 nodejs v12
@waitingsong 模块编译不出来, 底层的库不支持 ~
@zuohuadong 自从掌握TS后,真香!
node 真好。爱生活,爱拉芳。
11
11
@lhpyfc 111
恐怖如斯 必须更新
@zy445566 666
@zy445566 ddd
用node 的express 框架写的服务端,现扫描出Slow HTTP Denial of Service Attack漏洞,要怎么弄??
@wushanchao 现在 nest.js 就有这些 js 原生支持 估计得有些日子了~