前言:欢迎来到 Node.js 20

Node.js 20 已经发布,带来了创新和激动人心的新时代。这个开创性的版本于2023年4月18日首次亮相,并将在2023年10月发布长期支持(LTS)版本,并且将持续支持至2026年4月,下面小编就为大家介绍一下Node.js20的几个新特性:

1.Node.js 权限访问

Node.js 20 正式推出了权限模型,这是 Rafael Gonzaga 提供的一项实验性功能,可以在程序运行时限制对特定资源的访问。

要使用这个强大的功能,只需启用 --experimental-permission 标志,例如:

node --experimental-permissions myApp.js

这将限制所有可用权限的访问,这样就可以确保应用程序远离任何不受欢迎的入侵者。

文件读写系统

要允许访问文件系统,请使用--allow-fs-read和 --allow-fs-write标志:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
(node:19836) ExperimentalWarning: Permission is an experimental feature
(Use `node --trace-warnings ...` to show where the warning was created)

下面是具体指令的含义:

  • --allow-fs-read=*- 它将允许所有FileSystemRead操作。
  • --allow-fs-write=*- 它将允许所有FileSystemWrite操作。
  • --allow-fs-write=/tmp/- 它将允许FileSystemWrite访问该/tmp/ 文件夹。
  • --allow-fs-read=/tmp/,/home/.gitignore- 它允许FileSystemRead访问/tmp/文件夹路径/home/.gitignore。

2.自定义 ESM 加载器钩子

Node.js 20通过加载器提供的自定义钩子

(--experimental-loader=./mr.mjs)在专用线程上运行,确保一切都保持井然有序。

以下是如何使用自定义加载器的快速示例:

loading.mjs

export async function resolve(specifier, parentModuleURL, defaultResolve) {
console.log("Resolving:", specifier);
return defaultResolve(specifier, parentModuleURL);
}
export async function load(url, defaultLoad) {
console.log("Loading:", url);
return defaultLoad(url);
}

index.js

console.log("Hello, Node.js 20!");

cmd

node --experimental-loader=./loader.mjs main.js

这个自定义加载器将记录每个模块的解析和加载过程。

3.同步的 import.meta.resolve()

为了跟上浏览器行为,现在 import.meta.resolve 函数返回同步。但仍可以根据需要自定定义加载器解析钩子为异步或同步函数。

以下是一个快速示例,展示它是如何工作的:

module.mjs

(async () => {
const resolvedURL = import.meta.resolve('./otherModule.mjs');
console.log("Resolved URL:", resolvedURL);
const asyncResolvedURL = await import.meta.resolve('./otherModule.mjs');
console.log("Async resolved URL:", asyncResolvedURL);
})();

这个示例演示了 import.meta.resolve 函数的同步和异步用法。

4.V8 引擎升级:释放野兽!

以下是一些V8 引擎新功能的快速概述:

  • 发挥正则表达式的无限潜力:使用设置符号+字符串属性的 RegExp v 标志,开启更灵活、更富表现力的语法!
  • 动态调整内存大小,优化性能尽在掌握:可调整大小的 ArrayBuffer 和可增长的 SharedArrayBuffer,让内存管理达到前所未有的境界!
  • 安全而可预测的数组操作方法:复制更改 Array 和 TypedArray 的方式,让代码既安全又可控,不修改原始数据!
  • 打造格式良好的 Unicode 字符串:通过 String.prototype.isWellFormed 和 toWellFormed,验证并转换字符串为完美的Unicode格式!
  • 告别堆栈溢出,迎接高效递归:WebAssembly 尾调带来无限递归的可能性,让堆栈溢出成为历史!

5.稳定的测试运行器

Node.js 20 中的 test_runner 模块已经升级并标记为稳定版本,这意味着它已经准备好投入实际应用了。

下面是一个简单的示例:

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
// This test passes because it does not throw an exception.
assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

6.性能增强:为应用程序提速!

Node.js 20 注重性能,提供了一些出色的增强功能,将使应用程序运行更加流畅和快速。以下是一些亮点:

  • 事件目标初始化成本降低:初始化现在只需要一半的时间,使应用程序更加迅捷。
  • V8 快速 API 调用:在诸如 URL.canParse() 和定时器等 API 中享受改进的性能。

7.Ada 2.0:新一代 URL 解析器巨星

Ada 2.0是用 C++ 编写的最新和最棒的 URL 解析器版本。这个工具为 URL 解析性能带来了显著的改进,使的应用程序比以往更加高效。

以下是 Ada 2.0 如何使用的一个简单示例:

import { domainToASCII, domainToUnicode } from 'node:url';
const asciiDomain = domainToASCII('example.com');
console.log("ASCII Domain:", asciiDomain);
const unicodeDomain = domainToUnicode('xn--exmple-cua.com');
console.log("Unicode Domain:", unicodeDomain);

以上代码演示了如何使用 Ada 2.0 将域名转换为其 ASCII 和 Unicode 表示形式。

8.准备 SEAs:出色的 Blob 单一可执行应用程序。

Node.js 20 引入了一种新的构建单一可执行应用程序(SEAs)的方式,通过将由 Node.js 从 JSON 配置中准备的 Blob 注入其中。这允许将多个共存的资源嵌入到 SEAs 中。

它的工作原理如下:

{
"main": "hello.js",
"output": "prep.blob"
}
node --experimental-sea-config sea-config.json

这将创建一个 prep.blob文件,其中包含了 SEA 所需的资源。

9.网络加密 API

在Node.js 20 中 Web Crypto API 函数参数的强制转换和验证遵循 WebIDL 定义,就像 Web Crypto API 的其他实现一样。

这提高了与其他 JavaScript 环境的互操作性,在每个环境都可以友好运行!

10.其他变化的地方

除了我们介绍的所有出色功能之外,Node.js 20 还包括一些其他不错的更新,以增强开发体验:

  • 更好的 TypeScript 支持:使用 TypeScript 编写更干净、更高效的代码。
  • 改进的 TLS 1.3 支持:享受更强大的加密来保障安全通信。
  • 更快的启动时间:应用程序启动速度更快。
  • 有效的错误处理:优雅地处理错误,确保应用程序平稳运行。
  • 改进的调试体验:轻松解决那些讨厌的错误。

总结

这就是 Node.js 20 带来的令人大开眼界的创新点的介绍,如果各位想获取更多的详细信息,请访问 Node.js 20官网

扩展链接:

如何在前端系统中使用甘特图

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

探秘移动端BI:发展历程与应用前景解析

Node.js 20 —— 几个令人大开眼界的特性的更多相关文章

  1. 使用Node.js版本管理器

    使用Node.js版本管理器 完全卸载Node.js 清除Package缓存:npm cache clean --force 卸载Node.js:wmic product where caption= ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. Node.js 框架

    Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序.  Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...

  4. Node.js的线程和进程

    http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够 ...

  5. Node.js的高性能封装 Express.js

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用.Express 不对 node.js 已有的特性进行二次抽象,我们只是在它之上扩展了W ...

  6. node.js Web应用框架Express.js(一)

    什么是Express.js Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随 ...

  7. 手把手教你学node.js之使用 superagent 与 cheerio 完成简单爬虫

    使用 superagent 与 cheerio 完成简单爬虫 目标 建立一个 lesson 3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNo ...

  8. 一、认识Node.js

    1.什么是Note.js? 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个 Javascript 运行环境(runtime).它让 JavaScript 可 ...

  9. [转] Node.js的线程和进程

    [From] http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本 ...

  10. Node.js 环境搭建及简单应用

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型.如果你想创建自己的服务,那么Node.js是一个非 ...

随机推荐

  1. Prism进入视图时导航的三种方式

    Prism导航 新建视图UserControl及其ViewModel,被跳转的视图的VM需要实现INavigationAware 在App.xaml.cs中注册视图及其ViewModel // App ...

  2. 前端Vue自定义简单好用商品分类列表组件 侧边栏商品分类组件

    前端Vue自定义简单好用商品分类列表组件 侧边栏商品分类组件 , 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13148 效果 ...

  3. 利用生成式预训练Transformer实现文本分类和命名实体识别

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例 ...

  4. 使用Kettle定时从数据库A刷新数据到数据库B

    一.需求背景 由于项目场景原因,需要将A库(MySQL)中的表a.表b.表c中的数据定时T+1 增量的同步到B库(MySQL).这里说明一下,不是数据库的主从备份,就是普通的数据同步.经过技术调研,发 ...

  5. 【Java】并行执行任务

    在实际的应用上,我们平时需要调用第三方的接口,可能会调用多个接口,串行执行的话, 就需要等待所有的接口调用完成之后才获取到结果,那我们有没有并行的方法的呢? 串行执行 以下是三个接口,假设他们额的执行 ...

  6. 论文日记四:Transformer(论文解读+NLP、CV项目实战)

    导读 重磅模型transformer,在2017年发布,但就今天来说产生的影响在各个领域包括NLP.CV这些都是巨大的! Paper<Attention Is All You Need>, ...

  7. 2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个集合。 返回每个集合内部的平均值都累加起来最小的值。 平均值向下取整。 1

    2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个集合. 返回每个集合内部的平均值都累加起来最小的值. 平均值向下取整. 1 ...

  8. Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1.nload(推荐)因为个人看着舒服点 2.iftop 以上两种任选其一即可,在此对两种都有介绍和安装教程,我写了,大家随意哈 nload安装 ...

  9. Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

    Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用 1. 什么是PhysicsRaycaster组件? PhysicsRaycaster是Unity UGUI中的 ...

  10. React: React-Router嵌套路由 exact问题

    说明 当使用嵌套路由时,不能在父路由中添加exact,因为要先匹配父路由才能匹配子路由 父路由 子路由 效果如下所示 参考链接 https://www.jianshu.com/p/8bc3251079 ...