巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 41|回复: 0

Node.js 20 正式发布

[复制链接]

2

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-4-21 12:31:33 | 显示全部楼层 |阅读模式
大家好,我是Echa。
好消息,2023年4月18号Node.js 官方宣布正式发布 v20 版本,同时可以在官方直接下载使用。小编从2010年开始接触Node.js,也属于第一批接触Node.js的开发者。一转眼时间过得好快,这么算下来,Nodejs 面世大众都快13年余载。
相比之下,JavaScript已有23年的历史,而我们一直使用的web,也有27年历史了。
13年不是一段很长的时间,但是Node.js让人感觉已经存在了很久。
在Node.js发布第二年的时候,我已经开始使用它了。虽然当时资料信息有限,但是仍然感受到了它的不凡潜力和应用前景。
记得那时用Node.js开发一个Web简单网站是非常方便。只要会一点javascript 基础语法es和数据库操作,可以使用mongoose操作mongoDB数据库、读取使用书写修改本地文件,静态资源可通过serve-static来实现访问、懂得书写api就可以开发项目了。
Node.js 原理
今天小编跟大家一起细聊三个Node.js方面知识点,希望对大家有所帮助。
全文大纲

  • Node.js 发展历程
  • Node.js 介绍
  • Node.js 14 即将停止维护
  • Node.js 支持原生 URL 验证方法
  • Node.js v20 正式发布更新内容
Node.js 发展历程Node.js 是一个非常新兴的开发工具,它诞生自 2009 年,年龄远不如 Python、Ruby、PHP 等老大哥,但是它确实有史以来发展最快的开发工具,没有之一。在这短短的几年间,我们看到了 Node.js 从当初的一无所有到如今的飞速发展,这是没有任何其他开发工具能够媲美的。

  • 2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库。
  • 2009年5月,Ryan Dahl在Github上发布了最初版本的部分Node包,随后几个月里,有人开始使用Node开发应用。
  • 2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。
  • 2010年年底,Node获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node的发展。
  • 2011年7月,Node在微软的支持下发布Windows版本。
  • 2016年,leftpad事件,Yarn诞生
  • 2017 npm更注重安全性 、Node.js 8、HTTP / 2、V8在其测试套件中引入了Node.js,除了Chrome之外,正式使Node.js成为V8引擎的目标平台每周下载30亿npm
  • 2018 Node.js 10和ES模块.mjs实验支持
  • 2019 Node.js 12和13以及V8 更新带来好多不错的特性、HTTP 解析速度提升、启动速度大幅提升。更好的诊断报告和堆分析工具。ES模块更新。
  • 2020 Node.js 14和15
  • 2021 Node.js 16和17
  • 2022 Node.js 18和19
Node.js 介绍
官网:https://nodejs.org/en
Github:https://github.com/nodejs/node
JavaScript 诞生于 1995 年,几乎是和互联网同时出现;Node.js 诞生于 2009 年,比 JavaScript 晚了 15 年左右。
在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程语言一样直接在计算机上使用,想干什么就干什么,再也不受浏览器的限制了。
Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时(Runtime)。
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
先了解下 Node.js 应用是由哪几部分组成的:

  • 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
  • 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
  • 接收请求与响应请求: 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
Node.js 特点:

  • 它是一个Javascript运行环境
  • 依赖于Chrome V8引擎进行代码解释
  • 事件驱动
  • 非阻塞I/O
  • 轻量、可伸缩,适于实时数据交互应用
  • 单进程,单线程
node. js 解决的问题:

  • 并发连接


  • 异步、事件驱动模型
  • 异步机制、事件驱动整个过程没有阻塞新用户的连接,也不需要维护已有用户的连接。
  • 基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量.虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心。
  • NodeJS解决并发连接问题:更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。

  • I/O阻塞


  • Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然。
Node.js 的优缺点
优点:

  • 高并发(最重要的优点)
  • 适合I/O密集型应用
缺点:

  • 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

  • 只支持单核CPU,不能充分利用CPU
  • 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
  • 原因:单进程,单线程
Node.js整个异步I / O过程
具体如下图:
Node.js 14 即将停止维护
什么?你可能会觉得 Node.js 14 版本不是刚出没多久么?这么快就要停止维护了?
Node.js 是目前最受欢迎的 JavaScript 服务端运行环境,它的版本迭代是非常快的。Node.js 的版本分为三种状态:当前状态 (Current)、长期支持状态 (Active LTS) 和维护状态 (Maintenance LTS)。
对于 Node.js 的主要版本,它们会进入当前状态六个月,给一些库作者足够的时间来添加对应的支持。六个月后,奇数版本号 (如 9、11 等等) 将不再得到支持,偶数版本号 (如 10、12 等等) 则进入长期支持状态,并可以用于一般的用途。长期支持状态一般可以保证关键 bug 的修复,共有 30 个月的时间。我们生产环境的应用应该只使用当前状态或长期支持状态的版本。
当前的 Node.js 版本是 19,在 2022 年 10 月 18 日刚刚发布。此外,Node.js 18 是目前处于长期支持状态(Active LTS),名称为 Hydrogen,于 2022 年 4 月 19 日首次发布。
如果你的项目还在使用 Node.js 14,则需要注意:Node.js 14 已进入维护状态 (Maintenance LTS),名称为 Fermium,它将在 2023 年 4 月 30 日停止维护。
停止维护并不是说 Node.js 14 将不再工作,而是意味着它将不再接收新的安全性更新和 Bug 修复。建议大家提前安排升级版本。
Node.js 支持原生 URL 验证方法
最近还有一个值得关注的更新,Node.js v19.9.0 (Current) 引入了一个新的 API -- URL.canParse,可以用来验证 URL 是否符合 WHATWG URL 规范。
在以前的版本中,我们一般会用正则表达式来验证 URL 是否合法,但其实 URL 规范还是比较复杂的,编写正确的正则表达也不容易 :
const url_regex = /^https?:\/\/(www\.)?\w+\.\w{2,3}(\/\S*)?$/; console.log(url_regex.test('https://www.toutiao.com')); // true console.log(url_regex.test('https://www.toutiao.com/item/7221550220541428259/')); // true console.log(url_regex.test('www.17.com')); // false
另外还可能会用到 url.parse 方法:Node.js 内置了一个 url 模块,它提供了很多与 URL 相关的处理函数,包括 url.parse。它可以将 URL 字符串解析为一个 URL 对象,并进行各种操作(如查询参数、路径等)。在解析完成后,我们可以检查 URL 对象中的属性是不是合法的:
const url = require('url'); const myUrl = 'https://www.toutiao.com'; const parsedUrl = url.parse(myUrl); if (parsedUrl.protocol !== 'https:' || !parsedUrl.host) { console.log('Invalid URL'); } else { console.log('Valid URL'); }
为了简化这种操作,我们还可能会引入比如 valid-url 这样的三方工具库来做 URL 验证。
后面使用原生的 URL.canParse 就简单多了:
const { URL } = require('url'); const isValid = URL.canParse('https://www.toutiao.com/item/7221550220541428259/'); console.log(isValid); // trueNode.js v20 正式发布更新内容4 月 18 日,Node.js 正式发布了 20 版本,新版中的亮点包括全新的 Node.js 权限模型、同步的 import.meta.resolve、稳定的测试运行器、更新 V8 JavaScript 引擎到 11.3,Ada 到 2.0 等!
注意,Node.js 20 将在 10 月份进入长期支持(LTS)期,在那之前,它将在接下来的六个月内成为“Current”版本。鼓励探索这个最新版本提供的新功能和好处,并评估它对应用的潜在影响。
权限模型
Node.js 权限模型是一种实验性机制,用于在执行期间限制对特定资源的访问。在这个第一个包含权限模型的发布版本中,这些功能带有以下能力:

  • 限制对文件系统的访问(读和写),使用 --allow-fs-read 和 --allow-fs-write 命令;
  • 限制对 child_process 的访问,使用 --allow-child-process 命令;
  • 限制对 worker_threads 的访问,使用 --allow-worker 命令
  • 限制对原生插件的访问(与 --no-addons 标志相同)
可用权限由 --experimental-permission 标志记录。
使用 --experimental-permission 启动 Node.js 时,将限制访问文件系统、生成进程和使用 node:worker_threads 的能力。
使用 Node.js 的开发人员现在可以更好地控制文件系统访问,因为引入了 --allow-fs-read 和 --allow-fs-write 标志。这些实验性功能允许更细粒度地控制 Node.js 进程可以访问文件系统的哪些部分。
要启用这些标志,可以使用 --experimental-permission 标志和所需的权限。例如,运行以下命令允许对整个文件系统进行读写访问:
node --experimental-permission --allow-fs-read
还可以通过将逗号分隔的值传递到标志中来指定文件系统访问的特定路径。例如,以下命令允许对 /tmp/ 文件夹进行写访问:
node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
通配符模式也可以用于一次性允许访问多个文件或文件夹。例如,以下命令允许读取 /home/ 目录中以 test 开头的所有文件和文件夹:
node --experimental-permission --allow-fs-read=/home/test* index.js
当启用权限模型时,process 对象的新 permission 属性可以用于在运行时检查是否已授予某个权限。
process.permission.has('fs.write'); // true process.permission.has('fs.write', '/home/nodejs/protected-folder'); // true
需要注意,这些功能仍处于实验阶段,可能会在 Node.js 的未来版本中发生更改。
自定义 ESM loader hooks 接近稳定版
通过 loader 提供自定义 ES module 生命周期 hook(--experimental-loader=./foo.mjs)现在在专用线程中运行,与主线程隔离开来。这为 loader 提供了单独的作用域,并确保 loader 和应用代码之间没有交叉污染。
为了与浏览器行为一致,import.meta.resolve 现在返回同步操作;注意,用户 loader 中的resolve hook 仍然可以是异步操作,如果 loader 作者希望的话,在应用代码中import.meta.resolve仍将返回同步操作。
这些改变是标记 ESM loader 为稳定版前的最后几个未解决问题。一旦社区中没有重大错误报告一段时间,Node.js 团队就打算将 loader 标志、import.meta.resolve和resolve和load hook 标记为稳定版。这使 ESM 的更广泛采用成为可能,因为重要的利益相关者将拥有一个稳定的 API 来构建分析和报告库。
V8 11.3
与往常一样,Node.js 中包含了V8引擎的新版本(更新到版本11.3,是 Chromium 113 的一部分),带来了改进的性能和新的语言特性,包括:

  • String.prototype.isWellFormed和toWellFormed;
  • 通过复制修改 Array 和 TypedArray 的方法;
  • 可调整大小的ArrayBuffer和可增长的SharedArrayBuffer;
  • 具有设置符号和字符串属性的 RegExp v 标志;
  • WebAssembly 尾调用。
稳定版 Test Runner
Node.js 20 中包含了一个对 test_runner 模块的重要变更。该模块在最近的更新后被标记为稳定版。稳定版 Test Runner 包括编写和运行测试所需的基本组件,包括:

  • describe、it/test和 hooks 用于结构化测试文件
  • mocking
  • 观察模式
  • node --test 用于并行运行多个测试文件
以下是使用 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) => { assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });
性能
随着新成立的 Node.js 性能团队的加入,自上一次主要发布以来,性能再次成为了一个重点。Node.js 20对运行时的基础部分(包括URL、fetch和EventTarget)进行了许多改进。
初始化EventTarget的成本减半,可以更快地访问使用它的所有子系统。此外,V8 Fast API 调用已被利用,以改进诸如URL.canParse和定时器等 API 的性能。
Node.js 20包括特定的变化,例如使用 C++ 编写的快速且符合规范的 URL 解析器 Ada 的更新版本2.0。
现在需要注入Blob来准备单个可执行文件
该项目在过去一年中一直致力于支持单个可执行文件(SEA),并最近实现了初步支持。由于该功能仍处于实验性阶段,团队将继续完善这一方法。在 Node.js 20 中,构建单个可执行文件现在需要从 JSON 配置中注入 Node.js 准备的 Blob,而不是注入原始的JS文件。
例如:sea-config.json
{ "main": "hello.js", "output": "sea-prep.blob" }
这会将 blob 写入 sea-prep.blob 文件:
node --experimental-sea-config sea-config.json
这个 Blob 现在可以注入到二进制文件中。这一改变是为了允许将多个共存资源嵌入到单个可执行文件(Single Executable Apps)中,从而开辟了新的用例。
Web Crypto API
Node.js 致力于与其他 JavaScript 环境的互操作性。例如,在 Node.js 20 中,Web Crypto API 函数的参数现在按照它们的 WebIDL 定义进行强制转换和验证,就像其他 Web Crypto API 实现一样。这进一步提高了与其他 Web Crypto API 实现的互操作性。
正式支持 ARM64 Windows
Node.js 具有广泛的平台和架构支持,Node.js 现在包括适用于 ARM64 Windows 的二进制文件,可以在该平台上进行本地执行。MSI、zip/7z包和可执行文件可以从 Node.js 下载站点以及所有其他平台上获得。CI 系统已更新,所有更改现在都在 ARM64 Windows 上进行了全面测试,以防止回归并确保兼容性。
Web Assembly System Interface(WASI)的进展
该项目继续在 Node.js 中实现WASI。值得注意的进展是,虽然它是实验性的,但不再需要命令行选项来启用 WASI,这应该使其更容易使用。WASI 团队期待着 preview2,并为未来做了一些更改。其中包括在调用new WASI时添加版本选项。在20.x版本中,版本是必需的,并且没有默认值。这对于支持新版本的应用非常重要,因为它们不会默认使用可能已过时的版本。然而,这也意味着任何依赖于版本默认值的代码都需要更新以请求特定版本。
注意事项
需要注意,Node.js 14 将在2023年4月停止维护,因此建议您开始计划升级到 Node.js 18(LTS)或Node.js 20(即将成为LTS)。
Node.js 16(LTS)将在2023年9月停止维护,这是为了与OpenSSL 1.1.1的支持结束时间一致,该时间将于2024年4月结束。
最后
一台电脑,一个键盘,尽情挥洒智慧的人生;几行数字,几个字母,认真编写生活的美好;
一 个灵感,一段程序,推动科技进步,促进社会发展。
创作不易,喜欢的老铁们加个关注,点个赞,打个赏,后面会不定期更新干货和技术相关的资讯,速速收藏,谢谢!你们的一个小小举动就是对小编的认可,更是创作的动力。

来源:http://www.yidianzixun.com/article/0nw3McWg
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部