Node.js 12的改变

Posted by csy on 2019-08-10

前言

Node.js 12 2019年10月开始就要进入长期支持版本了,前几天看了Node12的改变,这里做个简单的记录。

更方便地排查问题

堆内存dump

之前一篇博客提到的排查内存泄漏很麻烦的步骤,比如要在生产环境安装额外的模块heapdump。现在,在Node12都做了优化,直接集成了这个功能:smile:

堆转储功能

Node 12提供了生成堆转储的功能,从而可以更轻松地调查内存问题。

提供诊断报告

是一项实验功能,根据用户需求提供诊断报告,包括崩溃、性能下降、内存泄露、CPU 使用高等等。

V8 引擎升级

  • 异步堆栈跟踪 详情
  • 参数调用不匹配时的调用速度优化,即便参数传递多了或少了,现在都几乎不会影响 Node 的执行速度。详情
  • 更快的 JavaScript 解析速度 详情
  • 更快的 await 详情

支持 ES6 module

Node12 对 ES6 module 的支持依然处于实验阶段,需要通过 –experimental-modules 开启。

简单来说,就是支持了 Import Export 语法,不需要再转成 require 了!如果在 package.json 增加 “type”: “module” 的配置,Node 将按照 ES6 module 方式处理。

启动速度优化

通过在构建时提前为内置库生成代码缓存并将其嵌入为二进制文件,最终使启动时间加快 30%。

TLS和安全

TLS 从 1.2 升级到了 1.3,Node 程序可以减少 Https 握手所需时间来提升请求性能。增强安全功能

默认堆被正确配置了

以前默认堆大小需要通过 -max-old-space-size 设置,而且默认值是一个固定值,现在这个默认值可以根据可用内存动态分配,这样当内存较小时,Node 不会让内存移除而报错,而是主动终止自己的进程。

Worker 被正式启用了

–experimental-worker 实验开关已取消,默认支持 worker_threads。

要注意的是,执行 CPU 密集型任务时适合用 worker(大量计算),而执行 I/O 密集型任务时,Worker 反而没有 Node 内置的 I/O 操作性能好(读写文件)。

其他更新

  • 更好的原生模块支持
  • 默认的 http 解析器变为 llhttp
  • assert 验证所需的参数并调整松散的断言
  • buffer 改进使其更稳定和安全