Đây là một câu hỏi lớn và cần một câu trả lời dài để hoàn thành, vì vậy tôi sẽ chỉ giải quyết một tập hợp con của những khác biệt quan trọng nhất. Xin lỗi rằng đó vẫn là một câu trả lời dài dòng.
Chúng giống nhau như thế nào?
Bạn hoàn toàn đúng khi bạn nói:
Đối với các ví dụ cơ bản, chúng có vẻ giống nhau
Cả hai khung đều giải quyết cùng một vấn đề cơ bản: Cung cấp API thuận tiện để xây dựng các máy chủ HTTP trong nút. Điều đó có nghĩa là, thuận tiện hơn so với chỉ sử dụng http
mô đun gốc cấp thấp hơn . Các http
mô-đun có thể làm tất cả mọi thứ chúng tôi muốn nhưng nó tẻ nhạt với các ứng dụng ghi với.
Để đạt được điều này, cả hai đều sử dụng các khái niệm đã có trong các khung web cao cấp trong một thời gian dài: định tuyến, xử lý, bổ trợ, mô-đun xác thực. Họ có thể không phải lúc nào cũng có cùng tên nhưng chúng gần tương đương nhau.
Hầu hết các ví dụ cơ bản trông giống như thế này:
- Tạo một tuyến đường
- Chạy một chức năng khi tuyến đường được yêu cầu, chuẩn bị phản hồi
- Đáp ứng yêu cầu
Bày tỏ:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
hapi:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
Sự khác biệt không chính xác là đột phá ở đây phải không? Vậy tại sao chọn cái này hơn cái kia?
Họ khác nhau như thế nào?
Câu trả lời đơn giản là hapi còn nhiều hơn thế và nó còn vượt trội hơn rất nhiều. Điều đó có thể không rõ ràng khi bạn chỉ nhìn vào ví dụ đơn giản từ phía trên. Trong thực tế, đây là cố ý. Các trường hợp đơn giản được giữ đơn giản. Vì vậy, hãy xem xét một số khác biệt lớn:
Triết học
Express được dự định là rất tối thiểu. Bằng cách cung cấp cho bạn một API nhỏ chỉ với một lớp bụi mỏng trên đầu http
, bạn vẫn tự mình làm rất nhiều về việc thêm chức năng bổ sung. Nếu bạn muốn đọc phần thân của một yêu cầu đến (một nhiệm vụ khá phổ biến), bạn cần cài đặt một mô-đun riêng . Nếu bạn đang mong đợi các loại nội dung khác nhau được gửi đến tuyến đường đó, bạn cũng cần kiểm traContent-type
tiêu đề để kiểm tra xem đó là gì và phân tích nó phù hợp (ví dụ: dữ liệu biểu mẫu so với JSON so với đa phần), thường sử dụng các mô-đun riêng biệt .
hapi có một bộ tính năng phong phú, thường được hiển thị thông qua các tùy chọn cấu hình, thay vì yêu cầu viết mã. Ví dụ: nếu chúng tôi muốn đảm bảo phần thân yêu cầu (tải trọng) được đọc đầy đủ vào bộ nhớ và được phân tích cú pháp thích hợp (tự động dựa trên loại nội dung) trước khi trình xử lý được chạy, đó chỉ là một tùy chọn đơn giản :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Đặc trưng
Bạn chỉ cần so sánh tài liệu API trên cả hai dự án để thấy rằng hapi cung cấp một bộ tính năng lớn hơn.
hapi bao gồm một số tính năng được tích hợp sẵn mà Express không có (theo như tôi biết):
Khả năng mở rộng & mô đun
hapi và Express đi về khả năng mở rộng theo một cách hoàn toàn khác. Với Express, bạn có các chức năng trung gian . Các hàm Middleware là loại bộ lọc giống như bạn xếp chồng lên nhau và tất cả các yêu cầu chạy qua chúng trước khi nhấn vào trình xử lý của bạn.
hapi có vòng đời yêu cầu và cung cấp các điểm mở rộng , có thể so sánh với các hàm phần mềm trung gian nhưng tồn tại một số điểm được xác định trong vòng đời yêu cầu.
Một trong những lý do khiến Walmart xây dựng hapi và ngừng sử dụng Express là sự thất vọng với việc khó chia ứng dụng Express thành các phần riêng biệt và khiến các thành viên khác trong nhóm làm việc an toàn trên phần của họ. Vì lý do này, họ đã tạo ra hệ thống plugin trong hapi.
Một plugin giống như một ứng dụng phụ, bạn có thể làm mọi thứ có thể trong ứng dụng hapi, thêm tuyến đường, điểm mở rộng, v.v ... Trong một plugin bạn có thể chắc chắn rằng bạn không phá vỡ một phần khác của ứng dụng, bởi vì thứ tự của đăng ký cho các tuyến không quan trọng và bạn không thể tạo các tuyến xung đột. Sau đó, bạn có thể kết hợp các plugin này vào một máy chủ và triển khai nó.
Hệ sinh thái
Bởi vì Express cung cấp cho bạn rất ít ra khỏi hộp, bạn cần phải nhìn ra bên ngoài khi bạn cần thêm bất cứ điều gì vào dự án của bạn. Rất nhiều lần khi làm việc với hapi, tính năng mà bạn cần là tích hợp sẵn hoặc có một mô-đun được tạo bởi nhóm nòng cốt.
Âm thanh tối thiểu tuyệt vời. Nhưng nếu bạn đang xây dựng một ứng dụng sản xuất nghiêm túc, rất có thể cuối cùng bạn sẽ cần tất cả những thứ này.
Bảo vệ
hapi được nhóm của Walmart thiết kế để điều hành giao thông Thứ Sáu Đen, vì vậy an ninh và ổn định luôn là mối quan tâm hàng đầu. Vì lý do này, khung làm thêm rất nhiều thứ như hạn chế kích thước tải trọng đến để tránh làm cạn kiệt bộ nhớ quy trình của bạn. Nó cũng có các tùy chọn cho những thứ như độ trễ vòng lặp sự kiện tối đa, bộ nhớ RSS tối đa được sử dụng và kích thước tối đa của heap v8, ngoài ra máy chủ của bạn sẽ phản hồi với thời gian chờ 503 thay vì chỉ bị sập.
Tóm lược
Đánh giá cả hai chính họ. Hãy suy nghĩ về nhu cầu của bạn và điều nào trong hai điều này giải quyết mối quan tâm lớn nhất của bạn. Hãy ngâm mình trong hai cộng đồng (IRC, Gitter, Github), xem bạn thích cái nào hơn. Đừng hiểu lời tôi. Và hạnh phúc hack!
TUYÊN BỐ TỪ CHỐI: Tôi thiên vị là tác giả của một cuốn sách về hapi và ở trên phần lớn là ý kiến cá nhân của tôi.