• 分享15个Node.js 新功能替代流行NPM包
  • 发布于 3天前
  • 22 热度
    0 评论
近年来,Node.js开发人员依赖无数的npm包来填补平台的空白。从HTTP工具到文件系统助手,生态系统一直是Node.js最大的优势之一。但随着Node.js的不断发展,许多曾经需要第三方包的功能现在已直接集成在运行时中。这种转变减少了依赖项的臃肿,提高了安全性,并使应用程序更容易维护。如果您想要一个工具来跟踪Node.js中第三方包的安全风险,请查看N|Solid。

在这篇文章中,我们将探讨一些最显著的Node.js功能,这些功能可以替代流行的npm包。

1. node-fetch → 全局 fetch()
以前: 开发人员安装 node-fetch 来在Node.js中使用熟悉的浏览器 fetch() API。
现在: 从Node.js 18开始,fetch() 成为全局函数,与浏览器实现相同。
const res = await fetch('https://api.github.com/repos/nodejs/node');
const data = await res.json();
console.log(data.full_name); // "nodejs/node"
引入时间: 在 Node.js v17.5.0 中引入(实验性)
稳定时间: 在 Node.js v18.0.0 中成为稳定版本(不再实验性)
何时仍应使用 node-fetch: 仅当需要旧版Node.js兼容性(低于18)时。

2. ws(客户端)→ 全局 WebSocket
以前:ws 包是WebSocket客户端和服务器的首选。
现在: Node.js 包含一个全局 WebSocket 类用于客户端连接:
const ws = new WebSocket('wss://echo.websocket.org');
ws.onopen = () => ws.send('Hello!');
ws.onmessage = (event) => console.log('Received:', event.data);
引入时间: 在 Node.js v21.0.0 中添加了实验性的全局WebSocket客户端支持
稳定时间: 截至目前,仍处于实验阶段(尚未声明稳定版本)
何时仍应使用 ws: 对于服务器端WebSocket实现,ws 或基于它的库仍然是标准。

3. 测试框架 → node:test
以前: 测试需要像 mocha、jest 或 tap 这样的库。
现在: Node.js 包含 node:test,一个内置的测试运行器:
import test from 'node:test';
import assert from 'node:assert';
// 堆代码 duidaima.com
test('addition works', () => {
  assert.strictEqual(2 + 2, 4);
});
引入时间: 在 Node.js v18.0.0 中引入(实验性)[https://nodejs.org/download/release/v18.10.0/docs/api/test.html?utm_source=chatgpt.com]
稳定时间: 自 Node.js v20.0.0 起被认为是稳定的

何时仍应使用第三方框架: 如果你需要快照、模拟或丰富的插件生态系统等功能。需要注意的是,对于模块来说 node:test 已经足够,但对于某些较大的框架(例如全栈功能)在应用开发中仍然有用。

4. sqlite3 / better-sqlite3 → node:sqlite [实验性]
以前: 开发者依赖原生绑定如 sqlite3 或更快的 better-sqlite3。这些需要编译,且经常在升级时出错。
现在: Node.js 正在引入一个实验性的 node:sqlite 模块:
import { open } from 'node:sqlite';
const db = await open(':memory:');
await db.exec('CREATE TABLE users (id INTEGER, name TEXT)');
仍为实验性功能
何时仍应使用社区包: 如果你需要高级性能调优或当前实验API中未提供的功能。

5. chalk / kleur → util.styleText()
以前: 如 chalk 和 kleur 这样的库主导了控制台样式。
现在: Node.js 提供了 util.styleText():
import { styleText } from 'node:util';
console.log(styleText('red', 'Error!'));
console.log(styleText(['bold', 'green'], 'Success!'));
引入时间: 在 Node.js v20.12.0 中引入
稳定时间: 自 Node.js v22.17.0 起稳定
何时仍应使用 chalk: 如果你需要丰富的主题、链式语法或向后兼容性。

6. ansi-colors / strip-ansi → util.stripVTControlCharacters()
以前: 开发者使用 strip-ansi 等包来清理日志中的转义码。
现在: Node.js 包含 util.stripVTControlCharacters():
import { stripVTControlCharacters } from 'node:util';
const text = '\u001B[4mUnderlined\u001B[0m';
console.log(stripVTControlCharacters(text)); // "Underlined"
优点:
.原生可靠处理ANSI代码。
.何时仍应使用第三方: 很少——大多数情况现在都可以通过原生方式处理。

7. glob → fs.glob()
以前:glob 包对于文件匹配模式至关重要。
现在: Node.js 22+ 引入了 fs.glob():
import fs from 'node:fs/promises';
const files = await fs.glob('**/*.js');
console.log(files);
引入时间: 在 Node.js v22.0.0 中加入(作为fs API扩展的一部分);v22.0的发布说明包括新的fs glob功能。
稳定时间: 在Node.js 22.17.0 LTS中稳定,属于v22发行线。
何时仍应使用 glob: 如果你需要与旧版Node.js兼容。

8. rimraf → fs.rm({ recursive: true })
以前: 删除目录递归需要 rimraf。
现在: Node.js 支持直接递归删除:
import fs from 'node:fs/promises';
await fs.rm('dist', { recursive: true, force: true });
引入时间:fs.rm() 的 recursive 选项自 Node.js v12.10.0 起可用(对于传统回调用法),并在后续版本的Promise API中也支持;但完整的基于Promise的 fs.rm() 使用 recursive: true, force: true 的确切补丁版本可能有所不同。官方文档显示 fs.rm(path[, options]) 自 Node.js 14+ 起包含 recursive(注意:force 选项也受支持)。

稳定时间: 在所有活跃的LTS版本(v18、v20、v22)中已经稳定,不再实验性。

9. mkdirp → fs.mkdir({ recursive: true })
以前: 开发者使用 mkdirp 递归创建目录。
现在: Node.js 原生支持:
await fs.mkdir('logs/app', { recursive: true });
引入时间:fs.mkdir() 的 recursive 选项在 Node.js v10.12.0 中加入。[https://nodejs.org/api/util.html?utm_source=chatgpt.com]
稳定时间: 自引入以来稳定;它是核心API的一部分并被广泛使用。

10. uuid(v4)→ crypto.randomUUID()
以前: UUID生成意味着添加 uuid 包。
现在: Node.js 包含 crypto.randomUUID():
import { randomUUID } from 'node:crypto';
console.log(randomUUID());
引入时间: 在 Node.js v14.17.0 中引入
稳定时间: 自引入以来稳定;属于crypto核心模块。

11. base64-js / atob polyfills → Buffer, atob, btoa
以前: 编码/解码通常需要polyfill。
现在: Node.js 包含 atob 和 btoa 全局变量,以及 Buffer:
const encoded = btoa('hello');
console.log(encoded); // "aGVsbG8="
console.log(atob(encoded)); // "hello"
引入时间:atob 和 btoa 全局变量在 Node.js v20.0.0 或之后引入
稳定时间: 它们是当前Node.js LTS发行版中稳定API的一部分。

12. url-pattern → URLPattern [实验性]
以前: 开发者依赖 url-pattern 进行路由匹配。
现在: Node.js 包含全局 URLPattern API:
const pattern = new URLPattern({ pathname: '/users/:id' });
const match = pattern.exec('/users/42');
console.log(match.pathname.groups.id); // "42"
引入时间:URLPattern 在 Node.js v20.0.0 中作为实验性功能引入
稳定时间: 目前仍标记为实验性(即尚未稳定)

13. dotenv(基础)→ --env-file 标志 [实验性]
以前: 加载 .env 文件需要 dotenv。
现在: Node.js 可以直接加载环境文件:
node --env-file=.env app.js
引入时间:--env-file 标志在 Node.js v20.10.0 中引入(实验性)
稳定时间: 尚未稳定;仍为实验性
何时仍应使用 dotenv: 如果你需要变量扩展或多环境文件等高级功能。

14. event-target-shim → EventTarget
以前: Node.js 有自己的 EventEmitter,开发者使用 event-target-shim 来获得Web标准的 EventTarget。
现在:EventTarget 可以全局使用:
const target = new EventTarget();
target.addEventListener('ping', () => console.log('pong'));
target.dispatchEvent(new Event('ping'));
引入时间: 在 Node.js v15.0.0 中引入
稳定时间: 在 Node.js v15.4.0 中成为稳定版本,当时它被标记为“不再实验性”。

15. tsc(基本转换)→ Node.js 实验性 TypeScript 支持
以前: 运行 .ts 文件需要完整的TypeScript工具链(tsc 或 ts-node)。
现在: Node.js 包含实验性TypeScript支持:
node --experimental-strip-types app.ts
引入时间: 这个功能非常新;“strip types”实验性标志在 Node.js v21.0.0 或该主要版本附近引入。官方文档显示在21.x发行线中具有实验性支持。(具体的小版本/补丁版本在找到的资料中没有完全记录。)
稳定时间: 尚未稳定 —— 仍为实验性。
何时仍应使用 tsc: 对于完整的类型检查、声明文件和生产级构建。

总结
Node.js的发展表明了一个明确的趋势:曾经需要外部依赖的功能现在已成为核心功能。这种转变帮助开发者:
1.减少依赖项开销。
2.最小化供应链和安全风险。
3.编写跨浏览器和服务器更具可移植性的代码。
用户评论