Response HTML
Request đầu tiên đến một ứng dụng Inertia chỉ là request trình duyệt tải toàn bộ trang thông thường, không có header hoặc dữ liệu đặc biệt nào của Inertia. Với các request này, máy chủ trả về một tài liệu HTML đầy đủ. Response HTML này bao gồm các tài nguyên của website (CSS, JavaScript) cùng với một thẻ<div> gốc trong
phần body của trang. Thẻ <div> gốc đóng vai trò là điểm mount cho ứng dụng phía client và chứa một
thuộc tính data-page với page object được mã hóa JSON dành cho
trang ban đầu. Inertia sử dụng thông tin này để khởi động framework phía client và hiển thị page component đầu tiên.
Mặc dù response ban đầu là HTML, Inertia không render các page component JavaScript ở phía máy chủ.
Response của Inertia
Sau khi ứng dụng Inertia đã được khởi động, mọi request tiếp theo đến website đều được thực hiện qua XHR với headerX-Inertia được đặt thành true. Header này cho biết request được thực hiện bởi
Inertia và không phải là một lần tải toàn bộ trang thông thường.
Khi máy chủ phát hiện header X-Inertia, thay vì phản hồi bằng một tài liệu HTML đầy đủ, nó
trả về response JSON chứa page object đã được mã hóa.
Page object
Inertia chia sẻ dữ liệu giữa máy chủ và client thông qua page object. Object này chứa các thông tin cần thiết để render page component, cập nhật history state của trình duyệt và theo dõi phiên bản asset của website. Page object bao gồm bốn thuộc tính sau:- component: Tên của page component JavaScript.
- props: Props (dữ liệu) của trang.
- url: URL của trang.
- version: Phiên bản asset hiện tại.
data-page của
thẻ <div> gốc. Trong các lần truy cập Inertia, page object được trả về dưới dạng payload JSON.
Quản lý phiên bản asset
Một thách thức phổ biến của ứng dụng một trang là làm mới các asset của website khi chúng thay đổi. Inertia giúp việc này trở nên đơn giản bằng cách cho phép theo dõi phiên bản hiện tại của asset trên website. Khi một asset thay đổi, Inertia sẽ tự động thực hiện một lần tải toàn bộ trang thay vì truy cập bằng XHR. Page object của Inertia chứa một định danhversion. Phiên bản
này được thiết lập ở phía máy chủ và có thể là số, chuỗi, hash của file hoặc bất kỳ giá trị nào đại diện cho
“phiên bản” hiện tại của asset trên website, miễn là giá trị đó thay đổi khi asset của website được cập nhật.
Mỗi khi một request Inertia được thực hiện, Inertia sẽ gửi kèm phiên bản asset hiện tại trong
header X-Inertia-Version. Khi máy chủ nhận request, nó so sánh phiên bản asset
được cung cấp trong header X-Inertia-Version với phiên bản asset hiện tại. Thông thường việc này được xử lý
ở tầng middleware của framework phía máy chủ.
Nếu hai phiên bản asset giống nhau, request tiếp tục được xử lý như bình thường. Tuy nhiên, nếu các phiên bản asset
khác nhau, máy chủ ngay lập tức trả về response 409 Conflict và đặt URL trong
header X-Inertia-Location. Header này là cần thiết vì có thể đã xảy ra redirect ở phía máy chủ.
Thông tin này cho Inertia biết URL đích cuối cùng dự kiến là gì.
Lưu ý, response 409 Conflict chỉ được gửi cho request GET, không áp dụng cho
request POST/PUT/PATCH/DELETE. Tuy vậy, response này vẫn được gửi nếu sau một trong các request trên
xảy ra redirect đến một request GET.
Nếu tồn tại dữ liệu session dạng “flash” khi response 409 Conflict xảy ra, các adapter framework phía máy chủ của Inertia
sẽ tự động flash lại dữ liệu này.
Tải lại một phần
Khi thực hiện request Inertia, tùy chọn tải lại một phần cho phép bạn chỉ yêu cầu một tập con props (dữ liệu) từ máy chủ trong các lần truy cập tiếp theo đến cùng một page component. Đây có thể là một cách tối ưu hiệu năng hữu ích nếu việc một phần dữ liệu của trang trở nên cũ là chấp nhận được. Khi một request tải lại một phần được thực hiện, Inertia gửi thêm hai header trong request:X-Inertia-Partial-Data và X-Inertia-Partial-Component.
Header X-Inertia-Partial-Data là danh sách các key props (dữ liệu) mong muốn, phân tách bằng dấu phẩy,
mà máy chủ cần trả về.
Header X-Inertia-Partial-Component chứa tên component đang được
tải lại một phần. Điều này là cần thiết vì tải lại một phần chỉ hoạt động với request đến cùng một page component. Nếu
đích cuối cùng khác đi vì một lý do nào đó (ví dụ người dùng đã đăng xuất và hiện đang ở trang đăng nhập),
thì việc tải lại một phần sẽ không diễn ra.