当前位置: 首页 > 后端技术 > Node.js

精读《Nodejs V12》

时间:2023-04-03 15:31:18 Node.js

1.简介Node12已经发布几个月了,让我们跟随Nodejs12,看看Node12带来了哪些变化。2.概述Node12与之前的版本不同,带来了很多重大升级,包括更多的V8特性、Http解析速度提升、启动速度提升、更好的诊断报告、内置堆分析工具、ESM模块更新等。V8引擎升级V8升级带来了以下特性:零成本的异步堆栈信息原生支持异步堆栈信息,无需添加额外的运行时内容。参数个数不匹配时的性能优化现在无论传入的参数多了还是少了,都几乎不会影响Node的执行速度。更快的asyncasync/await已经比promises快了两个微滴。更快的Js解析速度网页中的V8引擎一般有9.5%的时间花在JS解析上。解析加速后,JS解析时间平均减少7.5%。由此可见,V8引擎的升级不仅给Node12带来了福音,也在一定程度上提升了网页的运行效率。TLS1.3带来更好的安全性随着Node12的发布,TLS已从1.2升级到1.3,它更安全且更易于配置。通过使用TLS1.3,Node程序可以减少Https握手所需的时间,从而提高请求性能。默认堆配置正确。之前需要通过-max-old-space-size设置默认堆大小,默认值是一个固定值。现在这个默认值可以根据可用内存动态分配,这样当内存少的时候,Node不会让内存被移除而报错,而是主动终止自己的进程。默认的http解析器已经改为llhttpnodejshttp-parser,维护和优化难度很大。因此,库llhttp比http-parser快156%。更重要的是,在Node12中,默认的解析器被切换为llhttp。提供诊断报告Node12有一项实验性功能,可以根据用户需求提供诊断报告,包括崩溃、性能下降、内存泄漏、CPU使用率过高等。堆内存转储以往如果要为堆内存生成转储文件,需要在生产环境安装额外的模块,而Node12集成了这个功能。更好的原生模块支持C++扩展N-API升级到版本4,原生模块可以用C++编写并发布到npm,像普通JS模块一样被引用。但要注意一些区别:JS模块的原生扩展1....预编译是否需要编译2....可以在所有平台上运行是的,如果预编译3....兼容allNode版本是否为4....是否会被多次加载是否5....如果没有显式使用多线程,是否线程安全6....是否可以销毁Worker是否正式启用--experimental-workerexperiment开关已经取消,默认支持worker_threads。需要注意的是,Worker适合执行CPU密集型任务(大量的计算),但是在执行I/O密集型任务时,Worker不如Node内置的I/O操作(读写)文件)。启动速度优化通过在构建时提前为内置库生成代码缓存,将启动时间缩短30%。支持ES6模块Node12对ES6模块的支持还在实验阶段,需要通过--experimental-modules开启。简单来说就是支持ImportExport语法,再也不用转成require了!如果在package.json中添加"type":"module"配置,Node会将其作为ES6模块处理。新的编译器和平台要求由于升级到新的V8引擎和内部改造,Node12在Mac和Windows以外的平台上至少需要GCC6和glibc2.17。3、精读V8引擎升级、TLS升级、堆配置自动化、http-parser升级为llhttp、启动速度优化等都是被动优化,不需要改动代码。只需升级Node版本即可享受。支持ES6模块的特性其实挺鸡肋的。毕竟如果源码是用Ts写的,这些升级是不会影响到源码的。worker_threads可以默认开启,就像之前支持async/await一样,这会带来Nodejs多线程更广泛的使用。Node12更新了V8引擎。随着V8的更新,也实现了很多新的ES规范,比如Class成员函数,私有成员变量等等。4.总结Nodejs只有10年的历史,但现在越来越受到开发者的青睐,因为它让JS运行在服务端,是扩展JS生态的重要一环。从Node的更新历史可以看出,性能和语法能力都在稳步提升,一些服务器环境需要的诊断报告和堆栈分析能力也在逐步完善。社区也有Alinode、egg、express、koa等好用的服务框架。相对于前端的翻天覆地的变化,对Node的评价只有一个字:稳定。讨论地址为:Jingdu《Nodejs V12》·Issue#184·dt-fe/weekly想参与讨论的请点这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号版权声明:免费转载-非商业-非衍生-保留署名(知识共享3.0许可)