Bỏ qua điều hướng

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.

Administrator8 phút đọc
Node.js 27 alpha: V8 15.6, heap mặc định mới và loạt breaking change

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:

  • Math dù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.stack không còn tra prototype chain.
  • await dù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; mkdtemp trả về Buffer khi prefix là Buffer.
  • http: keepAliveTimeout mặc định tăng lên 65 giây; req.headers có 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êm net/promises API ở mức thử nghiệm; ném lỗi khi gọi listen nhiều lần; runtime-deprecate Server.prototype._listen2.
  • domain: module bị runtime-deprecate và chuyển sang dùng AsyncLocalStorage.
  • src: NODE_MODULE_VERSION lên 153, và node::ObjectWrap chí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êm tlsSocket.socket để truy cập raw stream bên dưới TLS.
  • zlib: thêm crc32c; thêm phương thức đọc raw content cho ZipEntry.
  • 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_VERSION 153.
  • 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

Chia sẻ:FacebookXTelegram

Bài viết liên quan

Bình luận

Đang tải bình luận…