Phát hành Express v5 - Kỷ nguyên mới của framework Node.js
(expressjs.com)- PR v5 đầu tiên được mở từ 10 năm trước, nay cuối cùng đã được merge và phát hành
- Đây là một bản phát hành được cố ý đơn giản hóa để có thể triển khai những thay đổi có tác động lớn hơn trong các bản phát hành sắp tới
- Đồng thời cũng là cách để báo cho hệ sinh thái Node.js biết rằng Express đã chuyển động trở lại
Những thay đổi chính
-
Thay đổi hỗ trợ phiên bản Node.js
- Ngừng hỗ trợ Node.js 0.10, chuyển sang chỉ hỗ trợ Node 18 trở lên
- Giải quyết vấn đề các thay đổi quan trọng về hiệu năng và bảo trì bị trì hoãn do phải hỗ trợ các phiên bản Node.js cũ
- Giờ đây có thể áp dụng các tính năng ngôn ngữ và runtime mới, đồng thời loại bỏ các dependency không còn cần thiết
- Nhận thức được khó khăn của các doanh nghiệp đang dùng phiên bản Node.js cũ, dự án sẽ hợp tác với HeroDevs để cung cấp "hỗ trợ vô thời hạn", tiếp tục cung cấp các bản vá bảo mật quan trọng sau khi v4 kết thúc hỗ trợ
-
Thay đổi về khớp đường dẫn và biểu thức chính quy
- Thư viện
path-to-regexpđược nâng từ 0.x lên 8.x, tích hợp nhiều thay đổi tích lũy qua nhiều năm - Ngừng hỗ trợ các biểu thức con regex (ví dụ:
/:foo(\\d+))- Bị loại bỏ để ngăn chặn tấn công ReDoS
- Cách migrate: khuyến nghị dùng thư viện kiểm tra tính hợp lệ đầu vào mạnh mẽ
- Bao gồm các pattern đơn giản hóa cho những mẫu đường dẫn phổ biến
:name?được đổi thành{:name}*được đổi thành*name(,),[,],?,+,!được thêm vào danh sách ký tự dành riêng
- Ngừng hỗ trợ tham số số theo thứ tự. Mọi tham số đều phải được đặt tên
- Thư viện
-
Hỗ trợ Promise
- Bổ sung hỗ trợ cho Promise bị reject do lỗi phát sinh trong middleware
- Không bao gồm việc gọi
nexttừ Promise đã resolve - Trong hầu hết trường hợp, giờ có thể viết middleware như sau:
app.use(async (req, res, next) => { req.locals.user = await getUser(req); next(); });
-
Thay đổi ở body parser
- Thêm tùy chọn tùy chỉnh độ sâu của urlencoded body để giảm thiểu CVE-2024-45590 (mặc định là 32)
- Loại bỏ middleware kết hợp
bodyParser()đã bị deprecated req.bodykhông còn luôn được khởi tạo là{}nữa- Giá trị mặc định của
extendedtrong parserurlencodedđược đổi thành false - Thêm hỗ trợ nén dữ liệu không mất mát Brotli
-
Loại bỏ các method signature đã deprecated
res.redirect('back')vàres.location('back'): không còn hỗ trợ chuỗi đặc biệt'back'. Thay vào đó, hãy dùng tường minhreq.get('Referrer') || '/'- Signature
res.send(status, body)vàres.send(body, status): dùngres.status(status).send(body) - Signature
res.send(status): với phản hồi trạng thái đơn giản, dùngres.sendStatus(status); để gửi mã trạng thái kèm phần thân tùy chọn, dùngres.status(status).send() - Các method signature deprecated khác cũng đã bị loại bỏ (xem migration guide để biết chi tiết)
-
Hướng dẫn migrate và bảo mật
- Cung cấp migration guide chi tiết cho các nhà phát triển chuyển từ v4 sang v5
- Cung cấp threat model toàn diện, đưa ra những góc nhìn quan trọng về các lĩnh vực như kiểm tra đầu vào người dùng và thực hành bảo mật, nhằm giúp sử dụng Express an toàn hơn
Ý kiến của GN⁺
- Express v5 là bản phát hành tập trung vào việc cho hệ sinh thái Node.js thấy rằng Express đang chuyển động trở lại. Trọng tâm là ngừng hỗ trợ các phiên bản Node.js cũ, xử lý vấn đề bảo mật và đơn giản hóa việc bảo trì
- Bản phát hành này được giữ đơn giản một cách có chủ đích để loại bỏ các rào cản trong hệ sinh thái và mở đường cho những thay đổi có tác động lớn hơn ở các bản phát hành sau
- Express theo đuổi triết lý là một web framework nhanh, tối giản và không áp đặt cho Node.js. Điều này cũng mang lại những góc nhìn quan trọng ở các lĩnh vực như kiểm tra đầu vào người dùng và thực hành bảo mật
- Có sẵn hướng dẫn chi tiết để migrate lên Express v5 cùng với threat model toàn diện, giúp nhà phát triển sử dụng Express một cách an toàn và ổn định
- Những maintainer mới của dự án Express đặt mục tiêu phát triển hệ sinh thái Express thành bộ công cụ ổn định và đáng tin cậy. Vì vậy, họ sẽ tiếp tục hợp tác với cộng đồng để giải quyết vấn đề và cải thiện dự án
4 bình luận
À, cuối cùng cũng hỗ trợ promise rồi nhỉ. Bên mình vẫn còn dùng express khá nhiều nên haha; đúng là tin vui.
Phần lớn đã chuyển sang
nestjsnên giờ hầu như không còn dịp dùng trực tiếp nữa. Gần như cũng giống như dùng trực tiếp Servlet vậy.Cuối cùng cũng đã có thể xử lý lỗi promise, nhưng đến lúc này thì tôi cũng không rõ có lý do gì để nhất thiết phải dùng nó nữa.
Ý kiến trên Hacker News
Muốn bày tỏ lời cảm ơn tới Wes và cả đội. Phải đọc lại hai lần mới tin rằng PR cho v5 đã được mở từ 10 năm trước. Hẳn đã cần một nỗ lực rất lớn để thay đổi quán tính của dự án này. Chúc mừng chương mới
Xin chúc mừng đội ngũ Express. Có rất nhiều framework máy chủ web Node JS khác, nhưng tôi chưa chuyển sang cái khác vì Express cung cấp mọi thứ tôi cần. Hy vọng điều này sẽ tiếp tục
Có nhắc đến việc Express vẫn chưa phải là
latestCảm ơn Wes và cả đội vì công sức của họ. Express vẫn là lựa chọn được ưa thích nhất trên nodejs, và thật tuyệt khi thấy nó được duy trì tích cực
Tò mò vì sao việc phát hành v5 lại mất tới 10 năm
Nhắc đến perl 6
Ý tưởng đưa phản hồi vào như một phần của đầu vào tuyến đường có vẻ là kiểu của thập niên 2010. Ngày nay, hầu hết mọi thứ đều có các tuyến đường nhận request và trả về response. Cách này phù hợp với HTTP hơn
Chưa từng thấy mô hình "chuyển phiên bản cũ sang một công ty tư nhân để cung cấp hỗ trợ"
Tò mò Express so với koa, fastify, v.v. như thế nào