大数跨境
0
0

15 个 Node.js 新功能替代流行 NPM 包

15 个 Node.js 新功能替代流行 NPM 包 前端技术编程
2025-10-28
0

作者: Lizz Parody
原文链接: https://nodesource.com/blog/nodejs-features-replacing-npm-packages

编译: Nodejs技术栈

近年来,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

以前: 测试需要像 mochajest 或 tap 这样的库。

现在: Node.js 包含 node:test,一个内置的测试运行器:

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

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 → Bufferatobbtoa

以前: 编码/解码通常需要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的发展表明了一个明确的趋势:曾经需要外部依赖的功能现在已成为核心功能。这种转变帮助开发者:

  • 减少依赖项开销。
  • 最小化供应链和安全风险。
  • 编写跨浏览器和服务器更具可移植性的代码。

  
---END---

推荐阅读:

【收藏必备】8 张脑图快速了解 Vue 组件
新搭建一个 Vue 项目后,我有了这 15 点思考
从 0 到 1 搭建一个企业级前端开发规范

   
     
最近面试BAT,整理一份面试资料前端面试BAT通关手册,覆盖了前端技术、CSS、JavaScript、框架、 数据库、数据结构等等。
获取方式:关注公众号并回复 前端 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

【声明】内容源于网络
0
0
前端技术编程
专注于分享前端技术:JS,HTML5,CSS3,Vue.js,React,Angular 等前端框架和前端开源项目推荐!
内容 1148
粉丝 0
前端技术编程 专注于分享前端技术:JS,HTML5,CSS3,Vue.js,React,Angular 等前端框架和前端开源项目推荐!
总阅读13
粉丝0
内容1.1k