精读《Nodejs V12》

1. 引言

Node12 发布有几个月了,让我们跟随 Nodejs 12 一起看看 Node12 带来了哪些改变。

2. 概述

Node12 与以往的版本不同,带来了许多重大升级,包括更多 V8 特性,Http 解析速度的提升,启动速度的提升,更好的诊断报告、内置堆分析工具,ESM 模块的更新等。

V8 引擎升级

V8 升级带来了如下几个特性:

  • zero-cost async 堆栈信息 原生支持了 async 堆栈信息,不会添加额外运行时内容。
  • 参数数量不匹配时性能优化 即便参数传递多了或少了,现在都几乎不会影响 Node 的执行速度。
  • 更快的 async async /await 已经比 promises 快了两个 microticks。
  • 更快的 Js 解析速度 网页中的 V8 引擎一般花费 9.5% 时间在 JS 解析上,经过解析加速后,现在花费在 JS 解析上的时间降低到平均 7.5%。

可见 V8 引擎的升级不仅给 Node12 带来了福音,也会一定程度上提升网页的运行效率。

TLS 1.3 更好的安全性

随着 Node12 的发布,TLS 从 1.2 升级到了 1.3,更安全且更易配置。通过使用 TLS 1.3,Node 程序可以减少 Https 握手所需时间来提升请求性能。

默认堆被正确配置了

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

默认的 http 解析器变为 llhttp

nodejs 的 http-parser 已经非常难以维护和优化了,因此 llhttp 这个库,比 http-parser 快 156%,更重要的是,在 Node12 中,将默认解析器切换到了 llhttp。

提供诊断报告

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

堆内存 dump

在以前,如果要将堆内存生成 dump 文件,需要在生产环境安装额外的模块,而 Node12 集成了这个功能。

更好的原生模块支持

C++ 拓展 N-API 升级到版本 4,同时一个原生模块可以被 C++ 编写并发布到 npm,就像一个普通 JS 模块一样被引用。不过要注意一些区别:

JS 模块原生拓展
1.… 需要编译如果预编译了则不用
2.… 是否可以运行在所有平台如果预编译了则可以
3.… 是否兼容所有 Node 版本
4.… 会被加载多次
5.… 如果没有明确使用多线程,则线程安全
6.… 可以被销毁

Worker 被正式启用了

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

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

启动速度优化

通过在构建时提前为内置库生成代码缓存,最终使启动时间加快 30%。

支持 ES6 module

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

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

新的编译器和平台要求

由于升级到新的 V8 引擎以及内部改造,因此 Node12 在 Mac 与 Windows 之外的平台上,需要至少 GCC6 和 glibc 2.17。

3. 精读

对于 V8 引擎升级、TLS 升级、堆配置自动化、http-parser 升级到 llhttp、启动速度优化都属于被动优化,代码无需改动,只要升级 Node 版本就可以享受。

支持 ES6 module 这个特性其实比较鸡肋,毕竟源码用 Ts 写的话,这些升级并不会对源码产生影响。

worker_threads 可以被默认启用,就像以前支持 async/await 一样,会带来 Nodejs 多线程更广泛的使用。

Node12 更新了 V8 引擎,随着 V8 的更新,很多 ES 新规范也落地了,比如 Class 成员函数、私有成员变量等等。

4. 总结

Nodejs 仅有 10 年历史,但现在越来越被开发者欢迎,因为它可以让 JS 运行在服务端,是扩大 JS 生态的重要一环。从 Node 更新历史中可以看到,性能和语法能力稳步提升,一些服务端环境需要的诊断报告、堆栈分析能力都在逐渐完善,社区上也有 Alinode 与 egg、express、koa 等好用的服务框架,相对于前端翻天覆地的变化,对 Node 的评价只有一个字:稳。

讨论地址是:精读《Nodejs V12》 · Issue #184 · dt-fe/weekly

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 项目集成camunda流程引擎

使用camunda开源工作流引擎有:通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 其中,通过源代码编译运行的方式最为复杂,具体参考:https://lowcode.blog.csdn.net/article/details/1362…

Redis高并发分布锁实战

Redis高并发分布锁实战 问题场景 场景一: 没有捕获异常 // 仅仅加锁 // 读取 stock15 Boolean ret stringRedisTemplate.opsForValue().setIfAbsent("lock_key", "1"); // jedis.setnx(k,v) // TODO 业务代码 stock-- stringRedisTemplate.delete(&quo…

信息安全管理与评估赛题解析-应急响应(含环境)

服务器应急响应 文章目录 服务器应急响应题目:答案:192.168.1.7答案:Linux x86_64答案:shodan答案:DIRSEARCH答案:24/Apr/2022:15:26:42答案:2022答案:/var/www/html/footer.php答案:./prism答案:/root/.mal/prism答案:后门行为相关资源

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例:基于 Flask 的微服务6.1.3 拓展案例 1:容器间的直接通信6.1.4 拓展案例 2:跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例:配置 Flask 应用的…

《Docker 简易速速上手小册》第7章 高级容器管理(2024 最新版)

文章目录 7.1 容器监控与日志7.1.1 重点基础知识7.1.2 重点案例:监控 Flask 应用7.1.3 拓展案例 1:使用 ELK Stack 收集和分析日志7.1.4 拓展案例 2:使用集成监控工具 7.2 性能调优与资源限制7.2.1 重点基础知识7.2.2 重点案例:Fl…

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

基于插件实现RabbitMQ“延时队列“

1.官网下载 在添加链接描述下载rabbitmq_delayed_message_exchange 插件,本文以v3.10.0为例 1.1.上传安装包 scp /Users/hong/资料/rabbitmq_delayed_message_exchange-3.10.0.ez root10.211.55.4:/usr/local/software1.2.将文件移入RabbitMQ的安装目录下的plugins目录 m…

Docker安装MS SQL Server并使用Navicat远程连接

MS SQL Server简介 Microsoft SQL Server(简称SQL Server)是由微软公司开发的关系数据库管理系统,它是一个功能强大、性能卓越的企业级数据库平台,用于存储和处理大型数据集、支持高效查询和分析等操作。SQL Server 支持广泛的应…

【PostgreSQL】Windows安装PostgreSQL数据库图文详细教程

Windows安装PostgreSQL数据库图文详细教程 一、前言二、PostgreSQL简介三、软件下载四、安装步骤4.1 安装向导4.2 选择安装目录4.3 选择组件4.4 选择数据存放目录4.5 选择密码4.6 选择端口号4.7 等待安装完成4.8 取消勾选,安装完成 五、启动教程5.1 搜索pgAdmin4&am…

常见的音频与视频格式

本专栏是汇集了一些HTML常常被遗忘的知识,这里算是温故而知新,往往这些零碎的知识点,在你开发中能起到炸惊效果。我们每个人都没有过目不忘,过久不忘的本事,就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

云原生应用测试:挑战与方法

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

我们为什么要做施耐德的代理商?做施耐德代理商有哪些好处?

品牌知名度与市场影响力:施耐德是一家全球知名的电气和数字化解决方案提供商,其产品和服务广泛应用于住宅、楼宇、数据中心、工业等领域。选择成为施耐德的代理商,可以利用其强大的品牌知名度和市场影响力,更容易获得消费者的信任…

光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测

光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测 目录 光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测预测效果基本描述模型简介程序设计参考资料 预测效果 基本描述 Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测 运行环境: Matla…

【Java程序员面试专栏 算法思维】三 高频面试算法题:搜索算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊搜索算法,以岛屿问题为切入点练习,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间岛屿数量网格搜索分别向上下左右四个方向探索,遇到海…

在Vue3 + Vite项目中使用less

在Vue3 Vite项目中使用less,需要安装less和less-loader两个依赖。 首先,在项目根目录下执行以下命令安装less和less-loader: npm install less less-loader --save-dev安装完成后,在vite.config.js配置文件中添加以下代码&…

【linux】【docker】docker的安装 + 拿到docker开发环境压缩包如何使用

一、Linux上安装docker 1.1 配置仓库 安装 config-manager 命令,配置仓库的工具所在工具包 sudo yum install -y yum-utils配置 repo sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo把 /etc/yum.repos.d/docker-c…

【PHP设计模式06】适配器模式(变压器模式)

【适配器模式】 适配器模式,也叫做变压器模式 或者 包装器模式,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,也可以理解为某种协议,使两个不同的类之间可以通过协议合作来达到某种目的。适配器模式既可以作为类结构型模式,也可以作为对象结构…

【JavaEE】 spring boot的配置文件详解

spring boot的配置文件详解 文章目录 spring boot的配置文件详解常用配置spring boot的配置文件1. properties 文件2. YAML 文件3. 多环境配置4. 配置文件优先级5. 配置属性注入特殊说明 properties配置文件基本语法 例子peoperties文件的缺点 YML配置文件YML使用yml 配置不同数…

Android学习笔记 service启动方式

在Android系统中,Service的启动方式主要有两种: ## 1. startService 这种方式用于启动一个服务执行后台任务,不进行通信。当你调用startService()方法启动服务后,服务会一直无限期运行下去,只有在外部调用了stopServi…

关于Sora的基本情况

Sora 是一种由 OpenAI 开发的 AI 模型,它能够根据文本指令创建逼真的、富有想象力的视频场景。它使用一种称为“扩散模型”的技术来生成视频,该技术从随机噪声开始,并逐渐将其转化为具有所需特征的图像或视频帧。 功能 Sora 的主要功能包括…