【Node.js v19发布】新特性速览“试玩”

简介: 【Node.js v19发布】新特性速览“试玩”

Node.js 19版本于2022年10月18号发布,Node.js 19将是发布当日到未来6个月的“Current”版本,直到2023年4月,Node.js 18在10月晚些时候进入长期支持期(LTS),你可以在Node v19.0.0 (Current) Notable Changes查看完整更新说明。

Node.js 19主要更新了以下特性,可以在官方下载体验Node.js 19,本文也将轻度体验此版本:

  • node --watch (实验特性)
  • HTTP KeepAlive默认开启
  • 稳定的Web Crypto API
  • V8引擎更新

此文使用nvm下载和管理Node.js版本。
查看可用版本:

$ nvm list available

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    19.1.0    |   18.12.1    |   0.12.18    |   0.11.16    |
|    19.0.1    |   18.12.0    |   0.12.17    |   0.11.15    |
|    19.0.0    |   16.18.1    |   0.12.16    |   0.11.14    |
|   18.11.0    |   16.18.0    |   0.12.15    |   0.11.13    |
|   18.10.0    |   16.17.1    |   0.12.14    |   0.11.12    |
|    18.9.1    |   16.17.0    |   0.12.13    |   0.11.11    |
|    18.9.0    |   16.16.0    |   0.12.12    |   0.11.10    |
|    18.8.0    |   16.15.1    |   0.12.11    |    0.11.9    |
|    18.7.0    |   16.15.0    |   0.12.10    |    0.11.8    |
|    18.6.0    |   16.14.2    |    0.12.9    |    0.11.7    |
|    18.5.0    |   16.14.1    |    0.12.8    |    0.11.6    |
|    18.4.0    |   16.14.0    |    0.12.7    |    0.11.5    |
|    18.3.0    |   16.13.2    |    0.12.6    |    0.11.4    |
|    18.2.0    |   16.13.1    |    0.12.5    |    0.11.3    |
|    18.1.0    |   16.13.0    |    0.12.4    |    0.11.2    |
|    18.0.0    |   14.21.1    |    0.12.3    |    0.11.1    |
|    17.9.1    |   14.21.0    |    0.12.2    |    0.11.0    |
|    17.9.0    |   14.20.1    |    0.12.1    |    0.9.12    |
|    17.8.0    |   14.20.0    |    0.12.0    |    0.9.11    |
|    17.7.2    |   14.19.3    |   0.10.48    |    0.9.10    |

安装Node 19:

$ nvm install 19.1.0
Downloading node.js version 19.1.0 (64-bit)...
Extracting node and npm...
Complete
npm v8.19.3 installed successfully.

切换到node 19:

$ nvm use 19
Now using node v19.1.0 (64-bit)

$ node -v
v19.1.0

安装就绪,我们试试它的新特性。

node --watch (实验特性)

这是一个很实用,也是很多人盼望了许久的比较实用的特性,但目前仍处于实验阶段。用过webpack的同学对这个--watch参数应该很眼熟,用于监听到文件变化执行编译。Node 19引入此特性也是为了在主文件和引入的文件发生改变时,重启进程。

为了验证它,我准备了如下目录结构:

image.png

// index.js

require('./deep1')
console.log('主文件运行...')
// deep1/index.js

require('./deep2')
console.log('第一层级文件运行...')
// deep1/deep2/index.js

console.log('第二层级文件运行...')

在不带--watch的情况下运行时这样

$ node index
第二层级文件运行...
第一层级文件运行...
主文件运行...

--watch下运行会有一个警告(告诉你注意下这是一个实验中的特性,可能随时会变):

$ node --watch index
(node:44952) ExperimentalWarning: Watch mode is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
第二层级文件运行...
第一层级文件运行...
主文件运行...
Completed running 'index'

我们将三个文件改了文件内容如下并分别保存:

require('./deep1')

console.log('主文件更新更新更新运行...')

会分别发生三次重启,最后一次的结果:

Restarting 'index'
第二层级更新更新更新文件运行...
第一层级文件更新更新更新运行...
主文件更新更新更新运行...
Completed running 'index

检验结果是ok的,watch模式将可以让开发者更专注地关注代码,而不是运行终端。

HTTP KeepAlive默认开启

KeepAlive是HTTP1.1为了复用连接,提供更好的吞吐量而生的。HTTP1.1标准早已将KeepAlive设置为默认开启,Node 19对其进行了支持,默认情况下保持连接的时间为5秒,即Keep-Alive: timeout=5,另外,Node.js HTTP服务器会在调用close()时自动断开空闲的启用HTTP Keep-Alive的客户端连接。

我们来建一个Node HTTP服务来验证它:

// index.js
const http = require("http");
 
const listener = function (req, res) {
  res.writeHead(200);
  res.end("Hello, Node.js 19!");
};
 
const server = http.createServer(listener);
server.listen(9527);

运行这个文件:

node index.js

接着我们访问刚建立的HTTP服务器localhost:9527:

image.png

可以看到响应头返回了KeepAlive相关的两个字段:

  • Connection: keep-alive
  • Keep-Alive: timeout=5

稳定的Web Crypto API

Node从16版本开始对W3C的提出的Web Cryptography API进行支持,到Node.js 19开始你可以安心的使用相关的Node API(除Ed25519、Ed448、X25519和X448算法外是稳定的), 也就是Web Crypto API

这意味着你可能不再需要一些第三方库来进行加密(针对部分算法来说),SubtleCrypto类可用于生成对称(秘密)密钥或非对称密钥对(公钥和私钥),SubtleCrypto将在下面的示例中演示,我们写一个例子来验证它的加解密过程。

// 其中subtle是就是上面说的SubtleCrypto实例
const { subtle, randomBytes } = require("node:crypto");

async function main () {
 // 初始向量
 const iv = randomBytes(16);
 const key = await subtle.generateKey(
   {
     name: "AES-CBC",
     hash: "SHA-256",
     length: 256,
   },
   true,
   ["encrypt", "decrypt"]
 );
  
 const secretMessage = "Hello, Node.js 19!";
 
 // 加密
 const encrypted = await subtle.encrypt(
   {
     name: "AES-CBC",
     iv: iv,
   },
   key,
   secretMessage
 );

 // 解密
 const decrypted = await subtle.decrypt(
   {
     name: "AES-CBC",
     iv: iv,
   },
   key,
   encrypted
 );
 
 const dec = new TextDecoder("utf-8");
 console.log(`解密字符:${dec.decode(decrypted)}`);
}

main()

运行下这个文件:

$ node index.js
解密字符:Hello, Node.js 19!

V8引擎更新

V8引擎更新到10.7版本,这是Chromium 107的一部分。这个版本包含了JavaScript API的一个新特性: Intl.NumberFormat,这个API也很实用,它可以根据语言对数据进行格式化,下面我们来试试。

const number = 31415926.58;
 
const china = new Intl.NumberFormat("zh-CN", {
  style: "currency",
  currency: "CNY",
});
console.log(china.format(number));
 
const us = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
});
console.log(us.format(number));

const eu = new Intl.NumberFormat("de-DE", {
  style: "currency",
  currency: "EUR",
});
console.log(eu.format(number));

运行结果:

¥31,415,926.58
$31,415,926.58
31.415.926,58 €

此外,它还可以本地化数字:

const number = 31415926.58;

// 中文
console.log(new Intl.NumberFormat('zh-Hans-CN-u-nu-hanidec').format(number));

输出:

三一,四一五,九二六.五八

它甚至可以给数字加上单位,其中unit参数所有值参考这里,复合单位用-per-连接:

const number = 31415926.58;

// 部分支持中文单位
console.log(new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'kilobit-per-year'
}).format(50));

console.log(new Intl.NumberFormat('en-US', {
  style: 'unit',
  unit: 'kilobit-per-year'
}).format(50));

console.log(new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'liter',
  unitDisplay: 'short' // "short" | "long" | "narrow"
}).format(50));

输出:

50 kb/年
50 kb/y
50升

Node v19.1.0

在2022-11-14发布了node v19.1.0,这是目前最新的Node版本。此版本主要在测试运行器(Test runner),增加mock.method方法用于在现有对象方法上创建模拟:

import test from 'node:test';
import assert from 'node:assert';

test('spies on an object method', (t) => {
  const number = {
    value: 5,
    add(a) {
      return this.value + a;
    },
  };
  t.mock.method(number, 'add');

  assert.strictEqual(number.add(3), 8);
  assert.strictEqual(number.add.mock.calls.length, 1);
});
$ node index.mjs
TAP version 13
# Subtest: spies on an object method
ok 1 - spies on an object method
  ---
  duration_ms: 2.3918
  ...
1..1
# tests 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 12.0682

另外Node 19.1.0增加了fs.watch方法在Linux平台上的递归支持,即recursive: true参数:

const watcher = fs.watch(testDirectory, { recursive: true }); 
watcher.on('change', function(event, filename) { });

其他

  • Node 19附带了llhttp
  • npm 附带版本更新为8.19.2
  • Node.js 14将在2023年4月结束维护,Node.js 16 (LTS)将在2023年9月结束维护
相关文章
|
3天前
|
前端开发 JavaScript Java
除了变量提升,JavaScript还有哪些特性?
【4月更文挑战第4天】JavaScript 特性包括函数作用域、动态类型、原型继承、异步编程、高阶函数、箭头函数、严格模式、对象字面量、模块系统和垃圾回收。这门语言支持多种编程模式,适合各种应用场景。想深入了解某特性,欢迎提问!😄
26 6
|
5月前
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
47 0
|
3天前
|
存储 JavaScript 前端开发
【JavaScript技术专栏】ECMAScript 6+新特性详解
【4月更文挑战第30天】ES6(ES2015)标志着JavaScript的重大更新,引入了类和模块、箭头函数、模板字符串、解构赋值、Promise、新数据类型Symbol、Set和Map集合等特性,提高了语言表达力和开发效率。后续版本继续添加新特性,如ES2016的`Array.prototype.includes`,ES2017的`async/await`,以及ES2018的`Object/rest`。学习和掌握这些特性对于提升开发质量和效率至关重要。
|
3天前
|
JavaScript 前端开发 Linux
JavaScript 的跨平台特性
【4月更文挑战第22天】JavaScript 的跨平台特性
25 8
|
3天前
|
JavaScript 前端开发
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
【4月更文挑战第15天】使用Modernizr库检测浏览器特性:添加 `<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>` 到HTML,然后通过 `Modernizr.localstorage` 进行检测,如支持localStorage则执行相应代码,否则执行备用逻辑。
18 0
|
3天前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性
|
3天前
|
JSON 前端开发 JavaScript
掌握现代JavaScript:ES7到ES12的新特性全解析!
ES2016(ES7)中新增了如下特性👇 Array.prototype.includes Exponentiation Operator
|
3天前
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
71 0
|
3天前
|
JavaScript 前端开发 API
Vue.js 3.0新特性解读:开启前端开发新纪元
Vue.js作为前端开发中备受欢迎的框架,近期推出了全新的3.0版本,本文将对Vue.js 3.0的新特性进行深入解读,带领读者探索前端开发的新纪元。
|
3天前
|
JavaScript 前端开发
前端:Vue.js特性
前端:Vue.js特性
23 0