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 asset của website (CSS, JavaScript) cùng root<div> trong body của trang. Root <div> đóng vai trò là điểm mount cho ứng dụng phía client và chứa thuộc tính data-page với page object được mã hóa JSON cho trang ban đầu. Inertia dùng thông tin này để khởi động framework phía client và hiển thị page component đầu tiên.
Response 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 đặt thành true. Header này cho biết request được thực hiện bởi Inertia và không phải 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ì trả tài liệu HTML đầy đủ, nó trả response JSON chứa page object đã được mã hóa.
Sơ đồ lifecycle của request
Sơ đồ bên dưới minh họa lifecycle của request trong một ứng dụng Inertia. Lần truy cập đầu tiên tạo một request tiêu chuẩn đến máy chủ, máy chủ trả về bộ khung ứng dụng HTML chứa root element với dữ liệu đã hydrate. Với các tương tác và điều hướng tiếp theo của người dùng, Inertia gửi request XHR nhận dữ liệu JSON. Inertia dùng response này để hydrate và thay đổi page component một cách động mà không cần tải lại toàn bộ trang.Request header
Các header sau được Inertia tự động gửi khi thực hiện request. Bạn không cần tự đặt chúng vì adapter phía client của Inertia đã xử lý.boolean
Đặt thành
true để chỉ ra đây là request Inertia.string
Được đặt thành
XMLHttpRequest trong mọi request Inertia.string
Được đặt thành
text/html, application/xhtml+xml để chỉ ra các loại response được chấp nhận.string
Phiên bản asset hiện tại dùng để kiểm tra asset mismatch.
string
Tên component dành cho partial reload.
string
Danh sách props cần đưa vào partial reload, phân tách bằng dấu phẩy.
string
Danh sách props cần loại khỏi partial reload, phân tách bằng dấu phẩy.
string
Danh sách props cần reset khi điều hướng, phân tách bằng dấu phẩy.
string
Đặt thành
no-cache cho request reload để tránh phục vụ nội dung đã cũ.string
Chỉ định error bag dùng cho lỗi validation.
string
Cho biết dữ liệu được yêu cầu cần được nối vào cuối hay thêm vào đầu khi sử dụng Infinite scroll.
string
Danh sách key once prop chưa hết hạn đã được tải ở client, phân tách bằng dấu phẩy. Máy chủ sẽ bỏ qua việc resolve các prop này trừ khi chúng được yêu cầu rõ ràng qua partial reload hoặc bị force refresh ở phía máy chủ.
boolean
Đặt thành
true để cho biết đây là request validation Precognition.string
Danh sách tên field cần validation, phân tách bằng dấu phẩy.
Response header
Các header sau cần được adapter phía máy chủ gửi trong response Inertia. Nếu dùng adapter chính thức, chúng được xử lý tự động.boolean
Đặt thành
true để cho biết đây là response Inertia.string
Được dùng cho redirect bên ngoài khi response
409 Conflict được trả về do asset version không khớp.string
Đặt thành
X-Inertia để giúp trình duyệt phân biệt chính xác response HTML và JSON.string
Đặt thành
true để cho biết đây là response validation Precognition.string
Đặt thành
true khi validation thành công và không có lỗi, kết hợp với status code 204 No Content.string
Đặt thành
Precognition trong mọi response khi middleware Precognition được áp dụng.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 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 asset version của website. Page object có thể bao gồm các property sau:string
Tên của page component JavaScript.
object
Props của trang. Chứa toàn bộ dữ liệu trang cùng object
errors (mặc định là {} nếu không có lỗi).string
URL của trang.
string|number
Asset version hiện tại.
boolean
Có mã hóa history state của trang hiện tại hay không.
boolean
Có xóa history state đã mã hóa hay không.
array
Mảng key prop cần được thêm vào đầu trong quá trình điều hướng.
array
Mảng key prop cần được deep merge trong quá trình điều hướng.
array
Mảng key prop dùng để đối sánh khi merge props.
object
Cấu hình hành vi merge prop cho infinite scroll.
object
Cấu hình lazy loading props phía client.
object
Cấu hình cho once props, là các prop chỉ cần resolve một lần rồi tái sử dụng trên các trang tiếp theo. Mỗi entry ánh xạ một key đến object chứa tên
prop và timestamp expiresAt tùy chọn (đơn vị mili giây).data-page của root <div>. Trong Inertia visit (được nhận biết bởi header X-Inertia), page object được trả về dưới dạng payload JSON.
Page object cơ bản
Một page object tối thiểu chứa các property cốt lõi.Page object với deferred props
Khi dùng deferred props, page object chứa cấu hìnhdeferredProps. Lưu ý deferred props không có trong props ban đầu vì chúng được tải bằng request tiếp theo.
Page object với merge props
Khi dùng merge props, cấu hình bổ sung sẽ được đưa vào.Page object với scroll props
Khi dùng Infinite scroll, page object chứa cấu hìnhscrollProps.
Page object với once props
Khi dùng once props, page object chứa cấu hìnhonceProps. Mỗi entry ánh xạ một key đến tên prop và timestamp hết hạn tùy chọn.
X-Inertia-Except-Once-Props. Máy chủ bỏ qua việc resolve các prop này và không đưa chúng vào response. Client tái sử dụng các giá trị đã tải trước đó.
plans có trong onceProps nhưng không có trong props vì nó đã được tải ở client. Key onceProps dùng để nhận diện once prop xuyên suốt các trang, còn prop chỉ định tên prop thực tế. Hai giá trị có thể khác nhau khi dùng custom key.
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 asset của website khi chúng thay đổi. Inertia giúp việc này dễ dàng bằng cách tùy chọn theo dõi phiên bản hiện tại của asset. Khi asset thay đổi, Inertia sẽ tự động thực hiện một lần tải toàn bộ trang thay vì visit XHR. Page object của Inertia chứa định danhversion. Định danh này được thiết lập ở phía máy chủ và có thể là số, chuỗi, file hash hoặc bất kỳ giá trị nào đại diện cho “phiên bản” hiện tại của asset, miễn là giá trị thay đổi khi asset được cập nhật.
Mỗi khi request Inertia được thực hiện, Inertia gửi asset version hiện tại trong header X-Inertia-Version. Khi máy chủ nhận request, nó so sánh asset version được cung cấp trong header này với asset version hiện tại. Việc này thường được xử lý ở tầng middleware của framework phía máy chủ.
Nếu hai asset version giống nhau, request tiếp tục như bình thường. Nếu khác nhau, máy chủ lập tức trả response 409 Conflict và đưa URL vào header X-Inertia-Location. Header này cần thiết vì có thể đã xảy ra redirect phía máy chủ. Nó cho Inertia biết URL đích cuối cùng dự kiến.
Khi client Inertia nhận response 409 Conflict, nó kiểm tra header X-Inertia-Location. Nếu header tồn tại, Inertia thực hiện một lần tải toàn bộ trang đến URL được chỉ định. Điều này đảm bảo người dùng luôn tải asset mới nhất.
Nếu tồn tại dữ liệu session dạng “flash” khi response 409 Conflict xảy ra, adapter framework phía máy chủ của Inertia sẽ tự động reflash dữ liệu này.
Tải lại một phần
Khi thực hiện request Inertia, tùy chọn partial reload cho phép 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 page component. Đây có thể là cách tối ưu hiệu năng hữu ích nếu chấp nhận một phần dữ liệu trang trở nên cũ. Xem tài liệu partial reload để biết chi tiết. Khi request partial reload được thực hiện, Inertia gửi headerX-Inertia-Partial-Component và có thể gửi thêm X-Inertia-Partial-Data và/hoặc X-Inertia-Partial-Except.
Header X-Inertia-Partial-Data là danh sách key props (dữ liệu) mong muốn được trả về, phân tách bằng dấu phẩy.
Header X-Inertia-Partial-Except là danh sách key props (dữ liệu) không được trả về, phân tách bằng dấu phẩy. Khi chỉ có header X-Inertia-Partial-Except, tất cả props trừ các prop được liệt kê sẽ được gửi. Nếu có cả X-Inertia-Partial-Data và X-Inertia-Partial-Except, header X-Inertia-Partial-Except được ưu tiên.
Header X-Inertia-Partial-Component chứa tên component đang được partial reload. Điều này cần thiết vì partial reload chỉ hoạt động với request đến cùng page component. Nếu đích cuối khác đi vì lý do nào đó (ví dụ người dùng đã đăng xuất và hiện ở trang đăng nhập), partial reload sẽ không diễn ra.
HTTP status code
Inertia sử dụng các HTTP status code cụ thể để xử lý những tình huống khác nhau.
Các status code sau được dùng cho request validation Precognition.