QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Node.js 12:服务端 JavaScript 的未来

  • 2019-08-02
  • 本文字数:4017 字

    阅读完需:约 13 分钟

Node.js 12:服务端JavaScript的未来

自 2009 年首次发布以来,Node.js 一直是一项改变游戏规则的技术。概括来说,它允许开发人员使用 JavaScript 在服务端运行脚本,在页面发送到用户的 Web 浏览器之前生成动态 Web 内容。Node.js 是“JavaScript 无处不在”的潮流代表;在这种潮流推动下,服务端和客户端脚本不再需要使用不同的语言编写,开发 Web 应用只用一种编程语言就够了。


如果你像我一样也是 JavaScript 和 Node.js 的粉丝,你会很高兴看到它们正在迎来全方位的改进。

Node 12 新特性与改进

“全方位改进”是什么意思呢?其实就在几个月前,Node.js 12 版刚刚发布了。


2019 年 4 月 23 日Node.js 12正式发布,全球各地的 JavaScript 爱好者都欢欣鼓舞。需要明确的是,这不只是一个普通的旧版本更新,而是一个有诸多重要内容更新的关键版本升级。具体升级内容如下。

V8 JavaScript 引擎升级

每次的新版本 JavaScript V8 引擎都会带来一些性能调整和改进,此外这次还有一些非常值得注意的升级。具体有:


  • 零成本异步堆栈跟踪——通过异步调用框架丰富 error.stack 属性,而无需为 V8 引擎添加额外的运行时。

  • 参数不匹配的调用更快——以前 V8 必须用统一的方式处理参数过多或过少的函数调用,造成性能损失。现在引擎变得更聪明了,知道什么时候可以跳过这一步,从而将调用开销减少了 60%。

  • 更快的异步函数和Promise——实际上现在使用异步要比 Promise 快两个微拍(microtick),因为对 Promise 不熟悉的开发者可以使用语法风格更加同步的 async/await。

  • 更快的JavaScript解析——在网页启动时,解析 JS 的耗时只有引擎总耗时的 10%不到。最新发布的 JavaScript 解析器在桌面端的解析速度提高了 30%。

使用 TLS 1.3 提高安全性

TLS(传输层安全),是 Node 处理加密流通信的方法。


随着 Node.js 12 的发布,TLS 也升级到了1.3版;虽然版本号只多了一点,但这次实际上是重大更新,加入了很多性能和安全性增强功能。听起来有些不可思议,但 TLS 1.3 实际上是比 TLS 1.2 更简单的协议,比后者更安全、更易配置,并且可以更快地在应用程序之间协商会话。


Node 应用可以在 TLS 1.3 的帮助下更好地保护终端用户隐私,同时减少 HTTPS 握手所需的时间来提高请求性能。


小结:为所有用户提供更好的安全性并减少服务之间的通信延迟,我认为这是一大进步。

合理配置的默认堆大小

下面来谈一些底层改进。以前,JavaScript 堆大小默认等于浏览器 V8 引擎设置的堆大小上限,前者可以手动调整。Node.js 12 发布开始,JS 堆大小将根据可用内存来自动配置,这样 Node 就不会尝试使用比可用内存更多的内存空间了,避免了耗尽内存导致进程被迫终止的问题。


新版在处理大量数据时不会再出现内存不足错误——以前经常会出现这种问题。需要的话,开发者还可以使用旧的–max-old-space-size 标志手动设置上限,但新功能出现后手动设置大小的需求应该就没那么多了。

默认的 http 解析器变为 llhttp

很多人(包括我自己)都不知道,Node 中之前使用的 http_parser 库非常难以维护和改进,这就是llhttp诞生的原因。该项目是一个 http_parser 到 TypeScript 的端口,然后通过 llparse 运行以生成 C 或 bitcode 输出。


测试表明llhttp比http_parser快156%;前者的代码量更少,并且所有性能优化都是自动生成的——相比之下 http_parser 需要手动优化代码。


从 Node.js 12 开始,官方决定将默认解析器切换到 llhttp,开始对其进行全面测试。我们希望它在用途各异的众多应用中都能维持出色的性能表现。

按需生成诊断报告

谈到调试的话题,Node.js 12 引入了一个新的实验性功能,允许用户根据需要或在发生某些触发事件时生成报告。


这种实时报告可以帮助开发者诊断生产中的问题,包括崩溃、性能下降、内存泄漏、高 CPU 使用率、意外错误等等——这些都是通常需要数小时甚至数天才能调试、诊断和修复的东西。

集成堆转储

这个版本中关于堆的另一项特性是 Node.js 12 内置的集成堆转储,它可以加速调试过程。


现在开发者无需安装新模块来调查内存问题——只需通过命令行或 API 调用告诉 Node 你需要哪种 JSON 格式的诊断摘要,然后解析你能处理的所有信息即可。

Node.js 中的原生模块更易使用

底层改进说完了。此外,对于 Node 生态系统中的开发人员和模块开发者来说也有一些改进值得一提。


新版进一步完善了为 Node 创建和构建原生模块的流程,包括更好地支持原生模块与 worker 线程的结合,N-API 也升级到了第 4 版,让开发者可以更容易为原生异步函数配置自己的线程。


总的来说,这意味着 Node 专属模块的创建者和维护者可以像纯 JavaScript 模块的创建者一样轻松地维护这些模块。之前维护人员需要为模块支持的所有 Node.js 版本各做一份二进制文件,而新版 N-API 大大简化了这部分工作。

Worker 线程即将到来——实验标志已被删除

虽然 Node 10 开始就引入了 Worker 线程,但到了 12 版中,启用 Worker 线程不再需要标志——实验阶段快要结束了。在 Node.js 11.7.0 之前,开发者需要在命令行中使用–experimental-worker 标志启动 node 才能访问 Worker 线程模块。


$ node -e "require('worker_threads'); console.log('success');"internal/modules/cjs/loader.js:605    throw err;    ^Error: Cannot find module 'worker_threads'    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)    at Function.Module._load (internal/modules/cjs/loader.js:529:25)    at Module.require (internal/modules/cjs/loader.js:657:17)    at require (internal/modules/cjs/helpers.js:22:18)    at [eval]:1:1    at Script.runInThisContext (vm.js:123:20)    at Object.runInThisContext (vm.js:312:38)    at Object. ([eval]-wrapper:6:22)    at Module._compile (internal/modules/cjs/loader.js:721:30)    at evalScript (internal/bootstrap/node.js:720:27)$$ node --experimental-worker -e "require('worker_threads'); console.log('success');"success$
复制代码


在执行 CPU 密集型 JavaScript 操作时 Worker 的表现非常出色;但它对 I/O 密集型任务没什么帮助,这种时候 Node 内置的异步 I/O 操作比 Worker 更高效。

启动时间的改进

Node.js 11 引入了内置的代码缓存支持,将 Worker 线程的启动时间减少了近60%


Node 12 在此基础上更进一步,在构建时提前为内置库生成代码缓存,允许主线程使用代码缓存来处理用 JavaScript 编写的内置库的初始加载过程。


结果主线程的启动速度又提升了30%,你的应用为用户加载的速度也能变得更快了。

ES6 模块支持,马上就要完成了

重头戏留到最后介绍。对我来说最令人兴奋的功能之一是ES6模块支持——这也是我们很多人一直在等待的东西。这个功能仍然是实验性的,Node 团队正在收集测试反馈。这个功能意味着开发者只要动动手指就能够实现从前端到后端 JavaScript 的无缝过渡。


以下是最新版本的–experimental-modules 的亮点所在:


  • ES2015 import 语句可以将 Javascript 文件引用为相对链接./examples.js、绝对链接 file:///opt.app/examples.js、包名称 example-package 或包中的路径 example-package/lib/examples.js。


// relative urls‘./examples.js’ // absolute URLs‘file:///opt.app/examples.js’ // package names‘example-package’ // paths within packagesexample-package/lib/examples.js
复制代码


  • .js 文件中的导入和导出语法现在也都能用了。自 ES6 发布以来,开发人员终于可以像在传统 JS 中那样指定默认导出 import test from ‘./examples’、命名导出 import {example1, example2} from ‘./examples’ 和命名空间导出 import * as samples from ‘./examples’ 了。


// default imports / exportsimport test from ‘./examples’ // named imports / exportsimport {example1, example2} from ‘./examples’ // namespace exports import * as samples from ‘./examples’
复制代码


  • 将“type”: “module”添加到项目的 package.json 中,且 Node.js 将项目中的所有.js 文件视为 ES 模块。这种方法允许 Node 将 package.json 用于包级元数据和配置,做法类似 Babel 等捆绑和配置工具。

  • 使用.mjs 结尾的文件会被显式视为模块,使用.cjs 结尾的文件会被视为 CommonJS。这些是仍然使用 require 和 module.exports 语法类型的文件。


现在这些功能不再需要标志就能使用,真是太棒了。

Node 12 的新编译器和平台最低标准

最后要谈的是新版 Node 的运行需求变动。


Node.js 12 通过内部改进和 V8 引擎的升级引入了许多新功能,最低运行需求也随之变化。对于 macOS 和 Windows 以外的平台而言,新版代码库现在至少需要 GCC 6 和 glibc 2.17。使用这套新工具链编译的版本会包含编译时性能和安全性增强。


如果你使用的是 Mac 或 Windows 系统应该就没问题了:Windows 系统版本需求没变,Mac 用户至少需要 Xcode 8 和 10.10“Yosemite”系统来运行新版 Node。来自 nodejs.org 的 Linux 兼容版本将支持 Enterprise Linux 7、Debian 8 和 Ubuntu 14.04,但可能需要在原生不支持 GCC 6 的系统上使用自定义工具链。我相信你会很快找出所需要的东西。

总结

Node.js 的历史只有 10 年,现在还是单线程的,也没有像其他一些编程语言那样广泛应用,但 Node 拥有一些其他编程语言难以企及的优势:它是用 JavaScript 构建的 ,并且既可以在客户端也能在服务端运行。


致力于支持和改进 Node 的团队和企业是业界最优秀的。Node 正在持续从核心 JavaScript 和其他语言中学习,挑选合适的部分并吸纳到自身当中,为开发人员和应用程序打造一个不断进步的平台。


Node.js 12 带来了一些非常令人兴奋的改进,例如 ES6 模块支持、更好的应用程序安全性和更快的启动速度等。虽然直到2019年10月它才会进入LTS(长期支持)模式,但我还是要深入研究这些新功能,看看团队还能想到哪些内容来继续改进这个平台,使其成为更加出色的服务端解决方案。


英文原文:https://blog.logrocket.com/node-js-12/


2019-08-02 10:163351

评论

发布
暂无评论
发现更多内容

OpenYurt v1.2 亮点速览丨云边流量峰值相比原生 K8s 降低 90%

阿里巴巴云原生

阿里云 开源 容器 云原生 openyurt

打造自主可控云网算力,天翼云为湖南数字经济发展注入新动能

天翼云开发者社区

LED显示屏怎么翻新?

Dylan

LED LED显示屏 led显示屏厂家

C#/VB.NET 如何在不同工作簿之间复制单元格范围

在下毛毛雨

C# .net Excel 文档操作

瓴羊Quick BI可视化功能,满足企业的数据分析需求

对不起该用户已成仙‖

关系型数据库的架构演变

石臻臻的杂货铺

数据库 架构

墨天轮【第二届数据库掌门人论坛】圆满收官 | 含嘉宾精彩观点回顾

墨天轮

数据库 Serverless TiDB oceanbase 国产数据库

百分点科技宣布接入百度文心一言能力 数据科学基础平台获领先AI技术加持

百分点科技技术团队

git使用ssh

刘旭东

git SSH

Teradata的离开,是国内ToB服务转变的信号

ToB行业头条

火山引擎数智平台的这款产品,正在帮助APP提升用户活跃度

字节跳动数据平台

大数据 客户数据平台 客户 客户数据 企业号 2 月 PK 榜

腾讯内网“Redis 深度(全彩版小册)”限时开源!面面俱到太全了

架构师之道

Java 面试 架构师

用Docker在本地搭建nginx静态服务器&反向代理

致知Fighting

Java Docker 后端

直播 | StarRocks 实战系列第二期--导入优化&问题排查

StarRocks

数据库 开源

天翼云联合国际咨询机构IDC发布《中国医疗云建设与应用白皮书》

天翼云开发者社区

eKuiper 1.8.0发布:零代码实现图像/视频流的实时AI推理

EMQ映云科技

物联网 IoT 视频流 流式计算 企业号 2 月 PK 榜

关于DataLeap中的Notebook,你想知道的都在这

字节跳动数据平台

数据库 大数据 数据治理 数据研发 企业号 2 月 PK 榜

人工智能 LLM 革命前夜:一文读懂ChatGPT缘起的自然语言处理模型Transformer

阿里技术

人工智能 自然语言处理

如何在Excel中查找并高亮数据

Geek_249eec

C# .net Excel VB.NET

英特尔研究院探索负责任的生成式AI,让AI应用真正惠及大众

科技之家

使用 Ingest Pipeline 在 Elasticsearch 中对数据进行预处理

Se7en

了解医疗上云门道,尽在“共铸国云 红云行业思想汇”!

天翼云开发者社区

serverless与容器优缺点

天翼云开发者社区

serverles

90%企业在探索的敏捷开发怎么做?极狐GitLab总结了这些逻辑与流程

极狐GitLab

DevOps 敏捷开发 持续集成 CI/CD 持续交付

安全可信| 首批!天翼云智算平台率先通过可信算力服务评估

天翼云开发者社区

聚焦现代化应用安全,F5的安全扩增,稳了!

F5 Inc

架构 安全 API 应用

快速开发光伏电站数字孪生运维系统——实践类

阿里云AIoT

阿里云 物联网 IoT

创建MQTT连接时如何设置参数?

EMQ映云科技

物联网 IoT mqtt 企业号 2 月 PK 榜 连接参数

程序员超级干货书单:技术人必看

引迈信息

程序员 敏捷开发 书单

大模型为什么是深度学习的未来?

GPU算力

人工智能 深度学习 大模型

PostgreSQL:内存结构

天翼云开发者社区

Node.js 12:服务端JavaScript的未来_语言 & 开发_Paige Niedringhaus_InfoQ精选文章