Node.js v17 版本已发布,取代了 v16 做为当前版本,新的 v17 版本提供了一些新功能:基于 Promise 的其它核心模块 API、错误堆栈尾部增加 Node.js 版本信息、OpenSSL 3.0 支持、v8 JavaScript 引擎更新至 9.5。

基于 Promise 的 API

Node.js 项目的一项持续性战略计划是为 Node.js 核心模块提供基于 Promise 的 API 支持,近年来已为 timerstream 模块提供了 Promise API 支持。

Node.js v17 版本为 readline 模块提供了基于 Promise 的 API 支持。该模块提供了一个接口用于从一个可读流对象逐行读取数据。

结合 process.stdin 可读取用户在终端输入的数据。如下例所示:

// test.mjs
import * as readline from "node:readline/promises";
import { stdin as input, stdout as output } from 'process';
const rl = readline.createInterface({ input, output });
const answer = await rl.question('“Nodejs技术栈” 的域名是什么:');
console.log(`答案: ${answer}`);
rl.close();

运行之后,效果如下所示:

readline 模块的更多信息参考 readline_readline。

错误堆栈增加 Node.js 版本

堆栈跟踪是诊断应用程序错误信息的重要组成部分,在 Node.js v17 版本中,如果因为一些致命的错误导致进程退出,在错误堆栈的尾部将包含 Node.js 的版本信息。

如果想忽略该信息,运行时在命令行指定 --no-extra-info-on-fatal-exception 标志。

OpenSSL 3.0 支持

Node.js v17 版本包含了近期发布的 OpenSSL 3.0,根据 OpenSSL 的发布策略,OpenSSL 1.1.1 将在 2023-09-11 结束支持,这个日期也在 Node.js v18 LTS 结束日期之前。

因为 OpenSSL 3.0 对允许的算法和密钥大小增加了严格的限制,预计会对生态系统造成一些影响,在 Node.js v17 版本包含 OpenSSL 3.0 以便在下一个 LTS 版本之前为用户的测试和反馈留出时间。

例如,md4 这是 OpenSSL 3.0 默认不再允许的一个算法,如果是在 Node.js 17 之前的 Node 版本中,应用程序是可以正常运行的,但在 Node.js v17 中将抛出一个 error code 为 ERR_OSSL_EVP_UNSUPPORTED 的错误信息。

import crypto from 'crypto';
console.log(crypto.createHash('md4').update('123', 'utf8').digest('hex'))

Node.js v17 版本下运行之后得到如下错误信息。

image.png

一个临时的解决方法是运行时增加 --openssl-legacy-provider 标志,应用程序不在报错。

$ node --openssl-legacy-provider test.mjs
c58cda49f00748a3bc0fcfa511d516cb

V8 更新至 9.5

v8 在 8.1 版本开启了 Intl.DisplayNames API,支持语言、区域、货币、脚本四种类型,现在添加了两种新的类型:calendar、dateTimeField,分别返回不同的日历类型和日期时间字段的显示名称。对于国际化应用很有帮助。

const esCalendarNames = new Intl.DisplayNames(['zh'], { type: 'calendar' });
console.log(esCalendarNames.of('roc'));  // 民国纪年
const enCalendarNames = new Intl.DisplayNames(['en'], { type: 'calendar' });
console.log(enCalendarNames.of('roc'));  // Minguo Calendar

日期时间字段国际化名称展示。

function printDate(dateTimeField) {console.log(`${dateTimeField.of('year')} ${dateTimeField.of('month')} ${dateTimeField.of('day')}`);
}
printDate(new Intl.DisplayNames(['zh'], { type: 'dateTimeField' })) // 年 月 日
printDate(new Intl.DisplayNames(['en'], { type: 'dateTimeField' })) // year month day
printDate(new Intl.DisplayNames(['KOR'], { type: 'dateTimeField' })) // 년 월 일
printDate(new Intl.DisplayNames(['THA'], { type: 'dateTimeField' })) // ปี เดือน วัน

Intl.DateTimeFormat API 在 v8 9.5 版本中为 timeZoneName 选项新增加了四个值:shortGeneric、longGeneric、shortOffset、longOffset。

通过以下代码示例可看到之间的区别。

console.log(new Intl.DateTimeFormat('zh').format(new Date())); // 2021/01/01
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'shortGeneric' }).format(new Date())); // 2021/01/01 中国时间
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'longGeneric' }).format(new Date())); // 2021/01/01 中国标准时间
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'shortOffset' }).format(new Date())); // 2021/01/01 GMT+8
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'longOffset' }).format(new Date())); // 2021/01/01 GMT+08:00

参见 v8 9.5 release 文档 信息。

其它信息

按照 Node.js 发布时间表,Node.js v12 将于 2022 年 4 月结束生命周期。Node.js v16 在 2021 年 10 月 26 升级为 LTS,即长期支持版本。

Node.js 的奇数版本不是稳定的版本(例如,当前的 Node.js v17 ),它的生命周期很短,不要用于生产环境

对 Node.js 版本信息不了的、不知道如何安装 Node.js 的参考文章 “Node.js 版本知多少?又该如何选择?”

Reference

  • https://medium.com/the-node-js-collection/node-js-17-is-here-8dba1e14e382

  • https://nodejs.org/en/blog/release/v17.0.0/

- END -

敬请关注「Nodejs技术栈」微信公众号,期望与志同道合的你一起打造优质 “Nodejs技术栈” 交流群,一起互相学习进步!可长按下方二维码添加【五月君】个人微信备注 “Node” 邀请入群。

Node.js v17 来了,看看都有哪些新功能?相关推荐

  1. Node.js v17版本npm run dev 报错opensslErrorStack

    Node.js 17版本opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ] ...

  2. node静态服务器优缺点_使用 Node.js 的优势和劣势都有哪些?

    很多回答已经写的很全,补充(强调)一点--Node.js 中的容错性实在是很弱.当异步回调中出现异常,而相应的 error 的事件有没有被订阅(有时候根本不可能去订阅),那么整个进程都会挂掉.但尴尬的 ...

  3. nvm,node.js,npm,cnpm都是什么意思,怎么使用。

    第一次接触前端的时候是2013年,那时候还是最基本的HTML.JS.CSS等,学完这些基本上能够找一个前端的工作,那个时候HTML5还没有怎么流行,更别提更为高级的node,vue,react等等.我 ...

  4. Node.js 的微任务处理(基于Node.js V17)

    前言:Node.js 的事件循环已经老生常谈,但是在 Node.js 的执行流程中,事件循环并不是全部,在事件循环之外,微任务的处理也是核心节点,比如 nextTick 和 Promise 任务的处理 ...

  5. npm WARN npm npm does not support Node.js v17.3.1解决方法

    每次执行npm命令都会出现下面的警告,很恼火 在网上找了一些解决方法,都没有得到解决. 原因: 本质上就是npm和node不配套,需要升级npm 或者node. 查询npm和node匹配关系:以往的版 ...

  6. Node.js v8.0.0 带来了哪些主要新特性

    Node.js于5月30号在其官方博客上发布了Node.js v8.0.0.这一版本将成为当前的长期维护版本,从2017年10月开始到2019年12月31号.而Node.js v6.0.0将会在201 ...

  7. 【微信小程序云开发】使用云函数(node.js)实现多张图片转成pdf的功能,且pdf带水印

    最近在做项目的时候,碰到一个功能需要多张图片转成pdf的功能,首先,在网上找了很多资料,都没有一个合适的. 后来,就自己动手使用云函数写了一个处理图片转成pdf的云函数,而且需带水印. 直奔主题,使用 ...

  8. 百度语音合成 js html,Node.js结合百度TTS接口实现文字转语音功能

    今天工作的时候偶然发现了百度的TTS Restful接口(TTS是TextToSpeech,说白了就是文本转语音的功能).该接口如下,浏览器中可以直接访问: http://tts.baidu.com/ ...

  9. Node.js博客系统--1.学前要求、项目功能介绍、需求分析

    本系列教程<Node.JS之"个人博客开发实战教程">你可以学会:深度了解 Nodejs+express+mongodb+mongoose,打造个人博客,娴熟掌握前台的 ...

最新文章

  1. Flink从Kafka 0.8中读取多个Topic时的问题
  2. oracle绑定变量赋值,Oracle教程之绑定变量
  3. 数学(莫比乌斯反演):HAOI 2011 问题B
  4. 【luogu P3384 树链剖分】 模板
  5. 判断是否为微信环境下打开的网页
  6. 分布式架构的NoSQL
  7. Windows驱动—Windows应用程序和Windows驱动通信编程
  8. java字符流输出流_JAVA语言之IO流字符串输入输出流
  9. LM2596、LM2576
  10. “死神”百草枯:每年超万人中毒 没有解药
  11. 如何进行航拍全景摄影(上)
  12. fastLane 初试
  13. golang并发模式work
  14. 星之轨迹 服务器维护,英雄传说星之轨迹结束运营公告是什么_内容介绍_3DM页游...
  15. 使用father打包发布前端工具库
  16. 多股电线与单股电线怎么选
  17. 互联网正在消灭中产阶级
  18. opencv blur函数——均值滤波
  19. 百度AI-EdgeBoard的简单使用
  20. App竞品技术分析 (3)减小安装包的体积(转)

热门文章

  1. 生成excel文档即便没有安装微软Excel
  2. 半导体尺寸将停止缩小(来自麻省理工科技评论)
  3. matlab 解方程 无穷解,成都火灾
  4. 微软的中国MVP名录
  5. 遭遇骚扰、殴打,GrapheneOS 得力干将宣布离职+退网!
  6. 基于FME和ARCGIS的福州市辖区城镇土地调查建库技术研究
  7. GIS应用水平考试2013年度第一次全国统一考试
  8. 2021年4月13日 星期二 三月初二 晴
  9. 长安逸动 售价或与宝骏630持平
  10. 高考结束出游旺季,VR全景在这些行业正是用武之地!