1、Node.js v20 介绍与初体验

Node.js是什么

1、JavaScript运行时环境

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它是几乎任何类型项目的流行工具!Node.js 具有独特的优势,因为数百万为浏览器编写 JavaScript 的前端开发者现在除了客户端代码之外,还能够编写服务器端代码,而无需学习完全不同的语言。这里需要说明的是,JavaScript优先,但也支持C/C++/Rust,通过N-Api(之前叫Nan node addon)扩展即可。 Node.js主要场景是服务器端代码,却在前端工程领域无心插柳柳成荫,变成了大前端领域必备的组成部分。下面讲Node.js应用场景的时候会细讲。

2、基于v8,所以快

Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使得 Node.js 执行速度非常高效。

很多c代码写的算法,都不一定比v8写的js代码执行速度快。参考github.com/felixge/fas...

3、单进程单线程,简单

Node.js 应用在单个进程中运行,无需为每个请求创建新线程。 Node.js 在其标准库中提供了一组异步 I/O ,以防止 JavaScript 代码阻塞,并且通常Node.js 中的库是使用非阻塞范例编写的,这使得阻塞行为成为异常而不是常态。

缺点:部署服务端代码的时候,一般你需要根据多少个cpu核数n来决定起n-1个实例,这时候就需要pm2这样的进程管理工具,很多人吐槽pm2,其根本原因是Node.js自身机制问题。

4、基于libuv实现的事件循环

当 Node.js 执行 I/O 操作时,如从网络读取、访问数据库或文件系统,Node.js 不会阻塞线程和浪费 CPU 周期等待,而是会在事件循环完成恢复操作。

当Node.js进程启动时,Node会创建一个类似于while(true){...}的EventLoop,每执行一次循环体的过程 我们称为Tick。每个Tick的过程就是查看是否有事件待处理,如果有,就取事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下一个循环,如果不再有事件要处理,就退出进程。以后学的深入的时候,需要setImmediate 和 process.nextTick,就是围绕EventLoop操作的相关API。

这使得 Node.js 可以使用单个服务器处理数千个并发连接,而不会引入管理线程并发的负担(这可能是灾难的来源)。

基于EventLoop,任务是异步的,所以要采用Error-first Callback写法,所以导致后面异步流程极其复杂,且编写代码时,需要时刻注意EventLoop里加入的代码是否为异步,不然就可能出现性能问题。

Node.js的优点是让你不需要关注多线程就能实现高性能,但你需要关注事件循环是否为异步。

5、跟进web标准

在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准(部分),因为你不必等待所有用户更新他们的浏览器(但要等v8更新) - 你负责通过更改 Node.js 版本来决定使用哪个 ECMAScript 版本(这其实不是特性,而是不完善), 你还可以通过运行带有标志的 Node.js 来启用特定的实验性特性(这种一般就是玩玩)。

node.js 应用场景

1、最重要的场景是Server服务端场景

Node.js 可以快速构建 RESTful 或 GraphQL API,支持 JSON 数据格式,与前端 JavaScript 生态无缝衔接。

Node.js 的轻量和高性能特性使其非常适合开发微服务,尤其是结合 Docker 和 Kubernetes 等容器技术。

Node.js 的流(Stream)机制允许分块处理数据,节省内存并提高效率。

Node.js 的异步 I/O 非常适合处理多个设备发送的频繁小数据包,结合 MQTT 等协议尤为高效。

2、最通用的是Cli工具开发场景

Node.js 提供了丰富的 npm 生态,开发者可以轻松创建跨平台的命令行工具。例如npm本身,webpack以及vite。

3、占比较大的前端相关场景

Node.js可以构建高性能的服务器端应用程序,如动态网站、单页应用(SPA)、RESTful API、聊天应用、在线游戏、实时协作工具。因为Node.js 的异步特性使其能够高效处理大量并发请求,特别适合需要实时响应的场景。例如,使用 Express.js 或 Koa 框架可以快速搭建轻量级 Web 服务。

同时Node.js 与 WebSocket 配合使用,可以轻松实现双向通信,处理实时数据推送。事件驱动模型非常适合这种低延迟需求。

Node.js v20运行原理和新特性

Node.js v20 引入了许多新功能和改进,以下是主要亮点:

1. 实验性权限模型(Permission Model)

  • 功能: 通过 --experimental-permission 标志启用,允许开发者在运行时限制对特定资源(文件系统、子进程、worker 线程等)的访问。
  • 运行原理: 默认情况下,所有权限被禁用,开发者需要显式授予权限(如 --allow-fs-read 或 --allow-fs-write)。process.permission.has() API 可用于检查权限状态。
  • 意义: 增强安全性,防止恶意代码访问敏感资源,类似 Deno 的权限模型。
  • 示例
js 复制代码
if (process.permission.has('fs.read')) {
  // 可以读取文件
}

2. 稳定的测试运行器(Test Runner)

  • 功能: 原先在 v18 中实验性引入的 node:test 模块在 v20 中标记为稳定,无需第三方测试框架即可运行测试。
  • 运行原理: 使用内置的 node:test 和 node:assert 模块,支持基本的测试用例编写、断言和报告生成。
  • 意义: 简化测试流程,减少对 Jest、Mocha 等外部依赖。
  • 示例:
js 复制代码
import { test } from 'node:test'; 
import assert from 'node:assert'; 
test('加法测试', () => {
  assert.strictEqual(1 + 1, 2); 
});
  • 运行: node --test test_file.js

3. 单执行应用程序(Single Executable Application, SEA)

  • 功能: 实验性特性,允许将 Node.js 应用打包为单个可执行文件,无需单独安装 Node.js 运行时。
  • 运行原理: 通过 --experimental-sea-config 生成包含脚本和运行时的二进制 blob,然后注入到 Node.js 可执行文件中。
  • 限制: 目前仅支持 CommonJS 模块,且只能针对开发时的操作系统。
  • 意义: 简化应用分发,适合桌面应用或独立工具开发。

4. V8 引擎升级到 11.3

  • 新特性: 支持新的 JavaScript 特性,如 String.prototype.isWellFormed() 和 String.prototype.toWellFormed(),用于处理字符串编码问题。
  • 性能: V8 11.3 提升了启动速度和内存管理效率,例如 EventTarget 初始化成本减半。
  • 意义: 更快的代码执行速度和更好的内存利用率。

5. Ada 2.0 URL 解析器

  • 功能: 替换了旧版 Ada 1.0.4,全面集成到 Node.js 中,用于解析 URL。
  • 运行原理: Ada 是一个用 C++ 编写的快速、符合规范的 URL 解析器,优化了 url.parse() 和 url.domainToUnicode 等功能。
  • 改进: 性能显著提升,且不再依赖 ICU(国际化组件)进行主机名解析。
  • 意义: 提升 URL 处理效率,尤其在 Web 应用中。

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

  • 功能: 在 ESM 中,import.meta.resolve() 现在同步返回模块路径,与浏览器行为一致。
  • 运行原理: 解析过程在主线程中完成,加载器钩子仍可异步运行。
  • 意义: 提高 ESM 的可用性和跨平台一致性。

7. 性能优化

  • EventTarget: 初始化成本减少 50%,加速相关子系统(如 fetch)。
  • V8 Fast API: 用于优化 URL.canParse() 和定时器等 API 的性能。
  • 流(Streams) : 移除冗余检查,使用位图优化调度,提升读写效率。

8. Web Crypto API 改进

  • 功能: 参数按 WebIDL 定义进行强制转换和验证。
  • 意义: 增强与其他 JavaScript 环境的互操作性,例如浏览器。

9. ARM64 Windows 支持

  • 功能: 官方支持 Windows ARM64 平台的原生执行。
  • 意义: 扩展硬件兼容性,适应更多设备。

10. 其他改进

  • HTTP/1.1 默认 Keep-Alive: 提高连接复用效率。
  • 文件监视(--watch) : 实验性支持文件变更自动重启。
  • 环境变量加载: 通过 --env-file 支持加载 .env 文件(后续版本稳定)。

Node.js和大前端的关系

Node.js在大前端中发挥了重要作用,主要包括以下方面:

1. 服务器端开发:Node.js可以作为服务器端语言来处理HTTP请求,实现服务器端的逻辑处理和数据存储等功能。

2. 前端构建工具:Node.js提供了npm包管理工具,开发者可以通过npm下载和管理各种前端框架、库和插件等。

3. 前端自动化构建:Node.js可以结合gulp、grunt、webpack、vite等自动化构建工具来进行前端代码的自动化打包、压缩、合并等操作,提高开发效率。

4. 实时通信:Node.js可以通过socket.io等技术实现实时通信,例如聊天室、在线游戏等,比如hmr等。

5. 数据库操作:Node.js可以通过mongoose等库来进行数据库的操作,例如数据的增删改查等。

6. 人工智能:Node.js可以结合TensorFlow等机器学习框架来进行人工智能的开发和应用。

7. 云计算:Node.js可以结合AWS Lambda等云计算平台来进行云计算相关的开发和应用。

总之,Node.js在大前端中的应用非常广泛,可以帮助开发者快速搭建服务器、构建前端、实现自动化构建、进行实时通信、操作数据库、开发人工智能等。下一章写写它的安装和使用。

相关推荐
顾林海几秒前
JavaScript 变量与常量全面解析
前端·javascript
程序员小续几秒前
React 组件库:跨版本兼容的解决方案!
前端·react.js·面试
乐坏小陈2 分钟前
2025 年你希望用到的现代 JavaScript 模式 【转载】
前端·javascript
生在地上要上天2 分钟前
从600行"状态地狱"到可维护策略模式:一次列表操作限制重构实践
前端
oil欧哟4 分钟前
🥳 做了三个月的学习卡盒小程序,开源了!
前端·vue.js·微信小程序
奶球不是球8 分钟前
el-table(elementui)表格合计行使用以及滚动条默认样式修改
前端·vue.js·elementui
liuyang___10 分钟前
vue管理布局左侧菜单栏NavMenu
前端·javascript·vue.js
@业精于勤荒于嬉19 分钟前
将图片存储至阿里云 OSS
前端·阿里云·云计算·oss
打野赵怀真44 分钟前
render函数中return如果没有使用()会有什么问题?
前端·javascript
Riesenzahn1 小时前
写一个左中右的满屏布局,左右固定220px,中间自适应并且要优先加载
前端·javascript