Nodejs 迎来了有史以来的最大的 9 个更新!
前言
Nodejs23 来啦!迎来了九个重大更新!!!
网络通信
原生 WebSocket 客户端支持
import WebSocket from 'node:ws';
const ws = new WebSocket('wss://api.realtime.io');
// 事件驱动架构
ws.on('open', () => ws.send('SYNC_REQUEST'));
ws.on('message', ({ data }) => {
console.log('实时数据:', data);
handleRealtimeUpdate(JSON.parse(data));
});
Web Streams API深度整合
import { TransformStream } from'node:stream/web';
// 创建转换流处理流水线
const markdownParser = new TransformStream({
transform(chunk, controller) {
controller.enqueue(`
<pre><code>${chunk}</code></pre>
`);
}
});
fetch('/log.stream')
.then(res => res.body)
.pipeThrough(markdownParser)
.pipeTo(new WritableStream({
write: chunk =>document.body.innerHTML += chunk
}));
开发效率
零配置文件监视
node --watch --env-file=.env ./src/main.ts
环境变量原生支持
.env文件自动加载机制:
# 支持多环境配置
DATABASE_URL=postgres://prod:password@db.prod.com
JWT_SECRET=sup3r_s3cr3t_k3y
// 直接访问注入的环境变量
const pool = new Pool({
connectionString: process.env.DATABASE_URL
});
现代化语言
ESM模块化新范式
// 模块注册表
import { createRegistry } from 'node:module';
const registry = new createRegistry();
// 支持import maps
registry.register('@lib/*', './src/libs/*.mjs');
// 动态导入
const { GraphQLServer } = await import('@lib/server');
TypeScript实验性支持
通过--experimental-strip-types标志实现编译优化
// 直接运行TS文件
interface User {
id: string;
name: string;
}
export function createUser(user: User) {
// 类型安全操作
db.insert(user);
}
跨进程通信
BroadcastChannel API
// 主进程
const adminChannel = new BroadcastChannel('cluster_ctl');
adminChannel.postMessage({ type: 'HEALTH_CHECK' });
// 工作进程
const workerChannel = new BroadcastChannel('cluster_ctl');
workerChannel.onmessage = ({ data }) => {
if(data.type === 'HEALTH_CHECK') {
reportStatus();
}
};
Blob全局化
// 大文件分片上传
asyncfunction uploadFile(blob) {
const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB
for(let i=0; i<blob.size; i+=CHUNK_SIZE){
const chunk = blob.slice(i, i+CHUNK_SIZE);
await fetch('/upload', {
method: 'POST',
body: chunk
});
}
}
测试
内置测试运行器
import { test, mock } from'node:test';
import assert from'node:assert';
test('用户认证流程', async (t) => {
const authMock = mock.fn(() =>Promise.resolve(true));
await t.test('正常登录', async () => {
const result = await login('admin', '123456', authMock);
assert.ok(result);
});
await t.test('错误密码', async () => {
await assert.rejects(
login('admin', 'wrong', authMock)
);
});
});