Với sự ra mắt phiên bản 22, Node.js tiếp tục mở rộng giới hạn và cung cấp cho các nhà phát triển những công cụ và cải tiến mới để tạo ra các ứng dụng mạnh mẽ và hiệu quả. Dưới đây là một số tính năng và cải tiến đáng chú ý trong Node.js 22.
Cập nhật V8 lên phiên bản 12.4
Phiên bản Node.js này bao gồm việc cập nhật quan trọng của V8 lên phiên bản 12.4, mang lại nhiều tính năng và cải tiến mới. Dưới đây là những điểm nổi bật trong bản cập nhật này:
1. Quản lý bộ nhớ cho WebAssembly
Một trong những điểm nhấn của bản phát hành này là việc giới thiệu tính năng Quản lý bộ nhớ cho WebAssembly. Tính năng này cải thiện việc quản lý bộ nhớ cho mã WebAssembly, dẫn đến hiệu suất và hiệu quả cao hơn trong các ứng dụng của bạn.
2. Phương thức Array.fromAsync
Giới thiệu phương thức Array.fromAsync, cho phép bạn tạo mảng một cách bất đồng bộ từ các iterable bất đồng bộ. Dưới đây là một ví dụ nhanh về cách sử dụng:
Trước đây (không có Array.fromAsync):
Xử lý một iterable bất đồng bộ yêu cầu vòng lặp thủ công để xử lý từng phần tử:
async function fetchItems() {
return [1, 2, 3, 4];
}
async function processItems() {
const items = await fetchItems();
const result = [];
for (const item of items) {
result.push(await processItem(item));
}
return result;
}
async function processItem(item) {
return item * 2;
}
processItems().then(console.log); // Output: [2, 4, 6, 8]
Với Array.fromAsync trong Node.js 22:
Array.fromAsync giúp đơn giản hóa việc xử lý iterable hoặc async iterable mà không cần vòng lặp thủ công:
async function* asyncIterable() {
for (let i = 0; i < 5; i++) {
await new Promise((resolve) => setTimeout(resolve, 10 * i));
yield i;
}
}
const array = await Array.fromAsync(asyncIterable());
console.log(array); // [0, 1, 2, 3, 4]
Tiện ích cải tiến:
- Giảm số lượng mã lặp thủ công.
- Tích hợp xử lý bất đồng bộ trực tiếp với một API đơn giản.
3. Các phương thức mới cho Set
Nhiều phương thức mới đã được thêm vào Set
, bao gồm union
, intersection
và difference
. Những phương thức này giúp thao tác với Set
trở nên dễ dàng hơn. Dưới đây là một số ví dụ:
Trước đây (không hỗ trợ intersect và difference):
Khi cần tính giao hoặc hiệu của hai tập hợp, phải sử dụng vòng lặp thủ công:
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
// Tính giao (intersection)
const intersection = new Set([...setA].filter(x => setB.has(x)));
console.log(intersection); // Output: Set { 3, 4 }
// Tính hiệu (difference)
const difference = new Set([...setA].filter(x => !setB.has(x)));
console.log(difference); // Output: Set { 1, 2 }
Với Set.prototype.intersection và Set.prototype.difference:
Node.js 22 cung cấp các phương thức tích hợp, giúp code ngắn gọn và dễ đọc hơn:
const lts = new Set([18, 20, 22]);
const nonLts = new Set([17, 19, 21]);
const all = lts.union(nonLts); // Giá trị mới [18, 20, 22, 17, 19, 21]
all.intersection(nonLts); // Chỉ lấy giá trị đều chưa trong 2 mảng [17, 19, 21]
all.difference(nonLts); // Chỉ lấy giá trị không chứa trong 2 mảng [18, 20, 22]
Tiện ích cải tiến:
- Code ngắn gọn, dễ hiểu hơn.
- Giảm thiểu lỗi khi thao tác với tập hợp lớn.
4. Trợ giúp cho Iterator
Các trợ giúp này bao gồm các phương thức như take, drop và map, giúp việc thao tác và xử lý các giá trị của iterator trở nên dễ dàng hơn. Dưới đây là một số ví dụ:
Trước đây (không có Iterator.prototype.toArray):
Khi làm việc với iterator, việc chuyển đổi sang mảng cần sử dụng vòng lặp thủ công:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
const iterator = numbers();
const array = [];
for (const num of iterator) {
array.push(num);
}
console.log(array); // Output: [1, 2, 3]
Với Iterator.prototype.toArray trong Node.js 22:
Node.js 22 hỗ trợ chuyển đổi iterator sang mảng dễ dàng:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
const iterator = numbers();
const array = iterator.toArray();
console.log(array); // Output: [1, 2, 3]
Tiện ích cải tiến:
- Tích hợp công cụ mạnh mẽ để làm việc với iterator.
- Loại bỏ vòng lặp thủ công.
5. Sử dụng require()
cho các module ESM
Một trong những tính năng được mong đợi nhất trong Node.js 22 là khả năng require
các module ECMAScript (ESM) một cách đồng bộ. Với cờ --experimental-require-module
, các nhà phát triển giờ đây có thể tải các module ESM bằng cách sử dụng require()
. Tính năng này giải quyết một điểm khó khăn chung cho các nhà phát triển khi chuyển từ CommonJS sang ESM.
Xuất một module ESM:
// sum.mjs
export default function sum(a, b) {
return a + b;
}
Sử dụng module ESM trong một module CommonJS:
// index.cjs
const sum = require('./sum.mjs');
console.log(sum(1, 2)); // Kết quả: 3
cmd: node --experimental-require-module index.cjs
6. WebSocketClient
- Trước Node.js 22, WebSocket đã được hỗ trợ, nhưng không có WebSocket client tích hợp trong Node.js core.Để sử dụng WebSocket trong Node.js, bạn phải cài đặt thư viện bên ngoài như ws
hoặc dùng trình duyệt.
Node V20
import {WebSocket} from “node:http”
new WebSocket()
const socket = new WebSocket('ws://localhost:8080');
- Từ Node.js 22: Node.js đã tích hợp sẵn WebSocket client từ thư viện, giúp bạn có thể tạo kết nối WebSocket mà không cần thư viện bên ngoài.
Node V22 upto
//Tạo kết nối WebSocket mới cho URL cụ thể.
const socket = new WebSocket('ws://localhost:8080');
// Thực hiện khi kết nối được thiết lập thành công.
socket.addEventListener('open', event => {
console.log('WebSocket connection established!');
// Sends a message to the WebSocket server.
socket.send('Hello Server!');
});
// Lắng nghe message và thực thi khi nhận được message từ máy chủ.
socket.addEventListener('message', event => {
console.log('Message from server: ', event.data);
});
// Thực hiện khi kết nối được đóng, cung cấp mã đóng và lý do.
socket.addEventListener('close', event => {
console.log('WebSocket connection closed:', event.code, event.reason);
});
// Thực hiện nếu xảy ra lỗi trong quá trình giao tiếp WebSocket.
socket.addEventListener('error', error => {
console.error('WebSocket error:', error);
});
7. Stream default High Water Mark
Tham số highWaterMark, kiểm soát kích thước bộ đệm bên trong cho các luồng, đã được tăng từ 16KiB lên 64KiB trong Node.js 22. Thay đổi này cung cấp khả năng cải thiện hiệu suất trên toàn diện. Tuy nhiên, việc tăng này có thể dẫn đến mức tiêu thụ bộ nhớ cao hơn một chút. Đối với các ứng dụng nhạy cảm với bộ nhớ, nên thiết lập rõ ràng kích thước bộ đệm bằng setDefaultHighWaterMark.
8. Glob and GlobSync
Node V22 tính hợp sẵn các hàm glob và globSync. Developer hiện có thể sử dụng các hàm này để khớp đường dẫn file/tệp dựa trên các mẫu đã chỉ định mà không cần cài đặt thư viện ngoài.
Node V20
install npm i glob
import { glob, globSync } from 'glob'
// Tìm kiếm tất cả các file, nhưng bỏ qua file node_modules
const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
// Nhiều mẫu patterns được hỗ trợ
const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
Node V22 upto
import { globSync } from 'node:fs';
console.log(globSync('**/*.js'));
import { glob } from 'node:fs';
glob('**/*.js', (err, matches) => {
if (err) throw err;
console.log(matches);
});
9. Kết luận
Node.js 22 mang đến nhiều tính năng và cải tiến mới, giúp các nhà phát triển xây dựng các ứng dụng hiệu quả và mạnh mẽ hơn. Việc cập nhật V8 lên V12.4 sẽ hỗ trợ tốt hơn cho ESM, tích hợp WebSocket và các phương thức mới cho cấu hình.
Nếu dự án của bạn đang hoạt động ổn định và không có yêu cầu đặc biệt về việc sử dụng các tính năng mới của Node.js 22, bạn có thể cân nhắc hoãn việc nâng cấp để giảm thiểu rủi ro. Tuy nhiên, nếu bạn muốn tận dụng hiệu năng, bảo mật và các tính năng hiện đại mà Node.js 22 mang lại, việc nâng cấp là một lựa chọn hợp lý. Đừng quên kiểm tra toàn bộ hệ thống để đảm bảo tính tương thích và ổn định sau khi nâng cấp.
Tài liệu tham khảo:
https://nodejs.org/en/learn/getting-started/websocke
https://nodejs.org/en/blog/announcements/v22-release-announce