Đây là câu hỏi liên quan đến các ứng dụng web một trang và câu hỏi của tôi được in đậm.Các ứng dụng trang đơn, http hoặc websockets, được kết nối/thực hiện nhanh không?
CẢNH BÁO: Tôi hầu như không phải là chuyên gia về chủ đề này và vui lòng sửa tôi nếu tôi hiểu sai về cách tôi nghĩ HTTP và WebSockets hoạt động như thế nào.
Sự hiểu biết của tôi về cách API hoạt động ổn định của HTTP hoạt động là chúng không có quốc tịch. Chúng tôi sử dụng các công cụ như connect.session() để loại bỏ một số loại trạng thái vào ứng dụng của chúng tôi ở cấp cao hơn. Vì mỗi yêu cầu duy nhất đều mới, chúng tôi cần một cách để xác định lại chính mình với máy chủ, vì vậy chúng tôi tạo một mã thông báo duy nhất được gửi qua lại.
Phần mềm trung gian phiên của kết nối sẽ giải quyết vấn đề này cho chúng tôi theo cách khá thú vị. Thả nó vào ngăn xếp phần mềm trung gian của bạn và bạn có các phiên bản nước sốt tuyệt vời kèm theo mỗi yêu cầu cho toàn bộ ứng dụng của bạn. Rắc một số cái bắt tay và bạn có thể chuyển thông tin phiên đó đến socket.io khá dễ dàng, thậm chí tuyệt vời hơn. Sử dụng RedisStore để giữ thông tin tách riêng khỏi ứng dụng kết nối/express của bạn và thậm chí còn tuyệt vời hơn nữa. Chúng tôi đang nói đôi cầu vồng tuyệt vời ở đây. Vì vậy, ngay bây giờ bạn có thể trong lý thuyết có một ứng dụng trang duy nhất mà không phụ thuộc vào kết nối/phiên vì bạn không cần nhiều hơn 1 phiên (bắt tay ban đầu) khi nói đến xử lý với websockets. socket.io đã cho phép bạn truy cập dễ dàng vào sessionId này, đã giải quyết được vấn đề.
Thay vì luồng công việc thẩm định này:
- Lấy email và mật khẩu từ một bài yêu cầu.
- Truy vấn DB của bạn lựa chọn qua email để lấy mật khẩu băm của họ.
- So sánh các băm.
- Chuyển hướng đến "OK!" hoặc "NOPE!".
- Nếu OK, lưu trữ thông tin phiên và để connect.session() xử lý phần còn lại cho hầu hết các phần.
Nó bây giờ trở thành:
- Nghe cho một sự kiện đăng nhập.
- Nhận email và mật khẩu từ cuộc gọi lại sự kiện.
- Truy vấn DB của bạn lựa chọn qua email và nhận được mật khẩu băm của họ.
- So sánh các băm.
- Phát ra "OK!" hoặc "NOPE!" biến cố.
- Nếu OK, hãy làm một số thứ mà tôi sẽ không nghĩ đến ngay bây giờ nhưng có thể có hiệu ứng tương tự?
Chúng ta có lợi ích gì khác khi sử dụng kết nối?Dưới đây là một danh sách những gì tôi thường sử dụng:
- logger cho chế độ dev
- favicon
- bodyparser
- máy chủ tĩnh
- hộ chiếu (một thư viện xác thực mà phụ thuộc vào kết nối/thể hiện, tương tự như những gì everyauth offers)
Mã tải ứng dụng trang đơn ban đầu sẽ xử lý việc thiết lập máy chủ tĩnh và favicon. Một cái gì đó giống như hộ chiếu có thể khó khăn hơn để thực hiện nhưng chắc chắn không phải là không thể. Mọi thứ khác mà tôi liệt kê không quan trọng, bạn có thể dễ dàng triển khai trình gỡ lỗi gỡ lỗi của riêng bạn cho các websockets.
Ngay bây giờ là có thực sự bất cứ điều gì ngăn cản chúng tôi từ việc có một http index.html tập tin duy nhất đóng gói một kết nối websocket và không phụ thuộc vào kết nối ở tất cả? Liệu socket.io có thực sự có thể làm cho kiểu kiến trúc ứng dụng đó hoạt động mà không cần thiết lập API an toàn HTTP của riêng bạn nếu bạn muốn một ứng dụng trang đơn trong khi cung cấp hỗ trợ ngang qua các nhược điểm tự động của nó?
Nhược điểm thực sự duy nhất tại thời điểm này là lưu vào bộ nhớ cache kết quả trên máy khách phải không? Bạn không thể kết hợp bộ nhớ cục bộ cho điều đó? Tôi nghĩ rằng việc tạo các trang nội dung có thể lập chỉ mục/thu thập thông tin cho các công cụ tìm kiếm sẽ không lớn lắm - bạn về cơ bản sẽ tạo một công cụ tạo các tệp html tĩnh từ cơ sở dữ liệu liên tục của bạn?
Vâng tôi đã theo dõi về socketstream. – AntelopeSalad