Node.js 27 alpha: V8 15.6, heap mặc định mới và loạt breaking change
Node.js 27.0.0-alpha.0.0.0 mang V8 15.6, giới hạn heap mặc định mới, glob native trong fs và nhiều thay đổi hành vi ảnh hưởng trực tiếp tới ứng dụng đang chạy production.

Node.js vừa phát hành bản alpha đầu tiên của dòng 27, đánh dấu một chu kỳ major với khá nhiều thay đổi có thể làm hỏng code cũ. Bản 27.0.0-alpha.0.0.0 ra mắt ngày 29/10/2026, do Rafael Gonzaga đứng tên phát hành, và như thường lệ với các bản alpha, đây là dịp để cộng đồng thử nghiệm sớm trước khi các thay đổi này chốt ở bản stable. Điều đáng chú ý không nằm ở một tính năng đơn lẻ nào, mà ở việc Node.js đang siết lại nhiều hành vi ngầm định đã tồn tại rất lâu trong runtime.
Có gì mới trong bản alpha này
V8 15.6 và các tính năng JavaScript mới
Phần lõi engine được nâng từ V8 14.6 lên 15.6.75.13. Theo mô tả trong release, một số tính năng giờ bật mặc định: Math.sumPrecise(), Intl.Locale.prototype.variants, cùng nhóm Iterator.prototype.join(), includes(), zip() và zipKeyed(). Đây là những bổ sung ở tầng ngôn ngữ, nghĩa là code chạy trên Node.js 27 sẽ có thêm API mà các bản trước không có — hữu ích nhưng cũng là lý do để kiểm tra lại các polyfill hay shim đang tự định nghĩa những hàm này.
Ba tính năng còn nằm sau flag thử nghiệm: import defer với --js-defer-import-eval, Immutable ArrayBuffer với --js-immutable-arraybuffer, và RegExp buffer boundaries với --js-regexp-buffer-boundaries. Nguồn chưa nêu chi tiết ngữ nghĩa từng flag, nên nếu muốn dùng thì cần đọc thêm tài liệu V8 tương ứng.
Giới hạn heap mặc định thay đổi
Đây có lẽ là thay đổi dễ gây bất ngờ nhất khi vận hành. Khi không set --max-old-space-size, heap mặc định giờ bằng một nửa RAM vật lý, kẹp trong khoảng 256 MB đến 4 GB. Quan trọng hơn: Buffer và ArrayBuffer giờ được tính vào giới hạn heap. Trước đây các cấu trúc này thường nằm ngoài phép đo của V8 heap, nên những service đọc file lớn, xử lý ảnh, hay giữ nhiều buffer trong bộ nhớ có thể thấy hành vi OOM khác hẳn so với Node.js 26.
Định dạng serialize mới, không tương thích ngược
v8.serialize(), structuredClone() và postMessage() chuyển sang một định dạng mới mà các bản Node.js cũ không đọc được. Nếu hệ thống của bạn có nhiều phiên bản Node.js chạy song song — ví dụ worker trên cluster cũ và mới, hay service ghi cache bằng v8.serialize() rồi service khác đọc lại — thì đây là điểm cần rà soát trước khi nâng cấp. v8.cachedDataVersionTag() và compile cache cũng đổi theo từng bản patch của V8, nghĩa là cache biên dịch sẽ bị vô hiệu hoá sau mỗi lần cập nhật.
Thay đổi hành vi ở tầng ngôn ngữ
Một loạt điều chỉnh nhỏ nhưng có thể ảnh hưởng tới test snapshot hoặc logic phụ thuộc vào kết quả chính xác:
Mathdùng libm của LLVM, nên một số phép tính có thể khác ở bit cuối.Math.random()đổi chuỗi kết quả khi chạy với--random-seed.error.stackkhông còn tra prototype chain.awaitdùng ít microtask hơn.sort()chuyển sang PowerSort cho mảng lớn.
Heap snapshot và WebAssembly
Heap snapshot giờ bao gồm internal objects, numeric values và full script sources. Đổi lại, thời gian chụp và kích thước file tăng khoảng gấp đôi — cần lưu ý nếu bạn có quy trình tự động chụp snapshot trên môi trường staging có giới hạn dung lượng.
Về WebAssembly, asm.js không còn được biên dịch sang Wasm, và các flag --experimental-wasm-<name> đổi tên thành --wasm-<name>. Ai đang dùng asm.js trong pipeline cũ nên kiểm tra lại.
Build, crypto và dependency
Node.js 27 bỏ bundled FIPS provider và yêu cầu OpenSSL 3 trở lên. Intel macOS bị hạ xuống mức experimental — bản binary cho macOS Intel được ghi là "Coming soon" trên trang release. OpenSSL được nâng lên 4.1.0, npm lên 12.1.0.
Về crypto, nhiều deprecation chuyển sang trạng thái End-of-Life (DEP0093, DEP0198, DEP0203, DEP0204), legacy OpenSSL code paths bị loại bỏ, và việc validate encoding cho digest/update được siết lại. Nếu codebase còn gọi những API đã bị đánh dấu deprecated từ vài năm trước, đây là lúc chúng ngừng hoạt động.
fs, http, net và các module khác
fs: glob được triển khai native;mkdtemptrả về Buffer khi prefix là Buffer.http:keepAliveTimeoutmặc định tăng lên 65 giây;req.headerscó null prototype; response vượt header limit bị từ chối.http2: tăng default window sizes; phát hiện stream bị nghttp2 bỏ rơi; gửi RST_STREAM trước khi emit'aborted'; giảm số callback được schedule mỗi request.net: có thêmnet/promisesAPI ở mức thử nghiệm; ném lỗi khi gọilistennhiều lần; runtime-deprecateServer.prototype._listen2.domain: module bị runtime-deprecate và chuyển sang dùngAsyncLocalStorage.src:NODE_MODULE_VERSIONlên 153, vànode::ObjectWrapchính thức bị deprecate — tác động trực tiếp tới các native addon.- Permission model: thêm
--allow-env. sqlite: retry các bước backup bị busy hoặc locked; dùng shared-shape objects cho result rows.stream: một loạt thay đổi hiệu năng từ James M Snell, gồm tránh cấp phát mỗi lần ghi trong stream/iter writers.tls: thêmtlsSocket.socketđể truy cập raw stream bên dưới TLS.zlib: thêmcrc32c; thêm phương thức đọc raw content choZipEntry.vfs: bỏ flag thử nghiệm.test_runner: thêm tuỳ chọn cấm các test exclusive.
Vì sao đáng quan tâm với độc giả Việt Nam
Với các team backend đang chạy Node.js trong production, bản alpha này là danh sách những gì sẽ tới trong vài tháng tới. Hai điểm đáng lo nhất là giới hạn heap mặc định mới và định dạng serialize không tương thích ngược. Cả hai đều thuộc dạng "không báo lỗi rõ ràng" — service vẫn chạy, nhưng hành vi bộ nhớ hoặc cache thay đổi âm thầm. Những team có hệ thống nhiều service giao tiếp qua postMessage hoặc ghi cache bằng v8.serialize() nên thử trên staging trước.
Với những ai viết native addon bằng C++ hoặc N-API, việc NODE_MODULE_VERSION nhảy lên 153 và node::ObjectWrap bị deprecate đồng nghĩa phải rebuild và có thể phải sửa code. Đây là công việc không thể bỏ qua nếu addon là phần cốt lõi của sản phẩm.
Nhóm làm HTTP server cũng nên để ý: keepAliveTimeout mặc định 65 giây có thể ảnh hưởng tới hành vi của load balancer hoặc reverse proxy phía trước. Nếu hạ tầng của bạn đặt timeout ngắn hơn, việc Node.js giữ kết nối lâu hơn có thể tạo ra các kết nối "treo" mà proxy không mong đợi.
Cuối cùng, việc fs.glob được triển khai native là tin tốt cho các CLI tool và script build — bớt được một dependency, và tốc độ có thể tốt hơn. Tuy nhiên cần kiểm tra lại hành vi so với các thư viện glob phổ biến, vì cú pháp có thể không giống hoàn toàn.
Ai nên dùng và cách thử nhanh
Bản alpha này phù hợp với:
- Team đang chuẩn bị lộ trình nâng cấp lên Node.js 27 và muốn phát hiện breaking change sớm.
- Người viết native addon cần kiểm tra tương thích với
NODE_MODULE_VERSION153. - Kỹ sư vận hành muốn đo lại mức tiêu thụ bộ nhớ với giới hạn heap mới.
Không nên dùng cho production. Đây là bản alpha, API có thể thay đổi trước khi stable.
Cách thử nhanh với nvm:
nvm install 27.0.0-alpha.0.0.0
nvm use 27.0.0-alpha.0.0.0
node -v
node -e "console.log(process.versions.v8)"
Hoặc tải trực tiếp binary từ trang release. Bản phát hành có sẵn cho Windows x64/arm64, macOS pkg và Apple Silicon, Linux x64/ppc64le/s390x/arm64, AIX ppc64. Bản cho macOS Intel đang ở trạng thái "Coming soon". Trang release có kèm SHA-256 checksum cho toàn bộ artifact — nên đối chiếu trước khi cài.
Một vài lệnh kiểm tra nhanh sau khi cài:
# Kiểm tra giới hạn heap mặc định
node -e "console.log(require('v8').getHeapStatistics().heap_size_limit / 1024 / 1024, 'MB')"
# Kiểm tra glob native
node -e "console.log([...require('fs').globSync('*.js')])"
# Kiểm tra permission model
node --permission --allow-env -e "console.log(process.env.HOME)"
Lưu ý và hạn chế
Đây là bản alpha đầu tiên của dòng 27, chưa phải bản stable. Một số tính năng được liệt kê trong release có thể bị revert hoặc đổi tên trước khi chốt — thực tế trong chính bản này đã có vài PR được revert rồi re-apply (ví dụ thay đổi inspector và sea/vfsArchive).
Việc bỏ bundled FIPS provider và yêu cầu OpenSSL 3 là thay đổi lớn với các môi trường có yêu cầu tuân thủ. Nếu tổ chức của bạn cần FIPS, cần có kế hoạch thay thế trước khi nâng cấp.
Cuối cùng, các con số về thời gian chụp heap snapshot tăng gấp đôi và kích thước file tăng gấp đôi là ước lượng được nêu trong mô tả release, không phải kết quả benchmark độc lập — nên đo lại trên workload thực tế của bạn.
Kết
Node.js 27 alpha cho thấy runtime đang dọn dẹp những hành vi ngầm định tích tụ qua nhiều năm: giới hạn heap rõ ràng hơn, định dạng serialize mới, các API deprecated bị loại bỏ, và glob được đưa vào lõi. Đây là bản phát hành đáng để các team backend đưa vào lịch thử nghiệm sớm, đặc biệt nếu hệ thống có nhiều service chạy nhiều phiên bản Node.js khác nhau hoặc có native addon.
Nguồn: Node.js Blog
Nguồn tham khảo: Node.js Blog
Bài viết liên quan

Web & Frontend18 phút đọc
Làm game thể thao 2D trên trình duyệt: input, physics và "juice"
Bài chia sẻ từ Viblo phân tích cách một game bóng bầu dục arcade 2D trên trình duyệt tạo cảm giác chơi mượt: xử lý bàn phím, fixed timestep, hitbox và các hiệu ứng phản hồi.

Backend & ngôn ngữ lập trình8 phút đọc
Java và dữ liệu bất biến: value class, withers, lazy constants
Tập podcast Ask the Architects số 73 bàn về cách các tính năng Java mới và sắp có giúp mô hình hoá dữ liệu bất biến gọn gàng hơn.
Bình luận
Đang tải bình luận…