Skip to main content
Bạn có thể xem tài liệu cũ của Inertia.js v2.0 tại inertiajs.com/docs/v2.

Có gì mới

Inertia.js v3.0 là major release tập trung vào sự đơn giản và trải nghiệm developer. Axios được thay bằng XHR client tích hợp để bundle nhỏ hơn; SSR hoạt động sẵn trong development mà không cần Node.js server riêng; plugin @inertiajs/vite mới tự động xử lý page resolution và cấu hình SSR. Release này còn giới thiệu HTTP request độc lập qua hook useHttp, optimistic update với rollback tự động, layout props để chia sẻ dữ liệu giữa page/layout và cơ chế xử lý exception tốt hơn.

Plugin Vite

Tự động page resolution, thiết lập SSR và callback setup/resolve tùy chọn.

HTTP request

Gửi HTTP request độc lập bằng hook useHttp mà không kích hoạt page visit.

Cập nhật lạc quan (optimistic updates)

Áp dụng thay đổi dữ liệu ngay trước khi server phản hồi, tự động rollback nếu thất bại.

Props của layout

Chia sẻ dữ liệu động giữa page và persistent layout bằng hook useLayoutProps.

SSR đơn giản hơn

SSR tự động hoạt động trong Vite dev mode. Không cần Node.js server riêng.

Xử lý exception

Render custom Inertia error page trực tiếp từ exception handler, kèm shared data.
Release này cũng bao gồm nhiều cải tiến khác:

Nâng cấp dependency

Để nâng cấp lên Inertia.js v3.0, trước tiên dùng npm để cài client-side adapter bạn muốn:
Bạn cũng có thể cài Vite plugin tùy chọn mới, cung cấp thiết lập SSR đơn giản hơn và shorthand pages cho component resolution:
Tiếp theo, nâng cấp package inertiajs/inertia-laravel:
Sau khi nâng cấp, hãy publish lại file cấu hình Inertia vì cấu trúc đã thay đổi trong v3. Bạn nên review config mới và áp dụng lại các tùy chỉnh:
Bạn cũng nên xóa cached view vì output của Blade directive @inertia đã thay đổi:

Breaking changes


Yêu cầu

PHP 8.2+ và Laravel 11+

Laravel adapter hiện yêu cầu tối thiểu PHP 8.2 và Laravel 11.

React 19+

React adapter giờ yêu cầu React 19. React 18 trở xuống không còn được hỗ trợ.

Svelte 5+

Svelte adapter giờ yêu cầu Svelte 5. Svelte 4 trở xuống không còn được hỗ trợ. Toàn bộ code Svelte nên được cập nhật sang rune syntax của Svelte 5 ($props(), $state(), $effect(), v.v.).

Đã loại bỏ Axios

Inertia không còn đi kèm hay yêu cầu Axios. Với phần lớn ứng dụng, không cần thay đổi. XHR client tích hợp cũng hỗ trợ interceptors, nên Axios interceptor có thể migrate trực tiếp. Bạn vẫn có thể tiếp tục dùng Axios qua Axios adapter, hoặc cung cấp custom HTTP client hoàn toàn riêng.

Đã loại dependency qs

Package qs được thay bằng implementation query string tích hợp và không còn là dependency của @inertiajs/core. Cách Inertia xử lý query string nội bộ vẫn giữ nguyên, nhưng bạn nên cài trực tiếp qs nếu ứng dụng import package này.

Đã loại dependency lodash-es

Package lodash-es được thay bằng es-toolkit và không còn là dependency của @inertiajs/core. Bạn nên cài trực tiếp lodash-es nếu ứng dụng import package này.

Đổi tên Event

Hai global event được đổi tên để rõ nghĩa hơn: Global event listener nên được cập nhật tương ứng:
Bạn cũng có thể xử lý các event này theo từng visit bằng callback onHttpExceptiononNetworkError mới:
Trả false từ callback onHttpException hoặc gọi event.preventDefault() trên global event httpException sẽ ngăn Inertia điều hướng tới error page. Điều này cho phép tự xử lý HTTP exception (response 4xx/5xx) mà không rời page hiện tại.

router.cancel() đã được thay thế

Phương thức router.cancel() được thay bằng router.cancelAll(). Trong v2, cancel() chỉ hủy synchronous request. cancelAll() mới mặc định hủy toàn bộ synchronous, asynchronous và prefetch request. Bạn có thể truyền option để giới hạn request type bị hủy.
Xem tài liệu visit cancellation để biết thêm.

Đã loại Future Options

Namespace cấu hình future đã bị loại. Cả bốn future option từ v2 giờ luôn bật và không còn cấu hình được:
  • future.preserveEqualProps
  • future.useDataInertiaHeadAttribute
  • future.useDialogForErrorModal
  • future.useScriptElementForInitialPage
Initial page data giờ luôn được truyền qua phần tử <script type="application/json">. Cách dùng thuộc tính data-page cũ không còn được hỗ trợ.

Thuộc tính Head Element

Thuộc tính inertia dùng trên element trong section <head> của root Blade template đã đổi tên thành data-inertia. Bạn nên cập nhật các head element đang dùng thuộc tính này:

Đã loại Progress Indicator Exports

Các named export hideProgress()revealProgress() đã bị loại. Nếu cần, hãy dùng trực tiếp object progress:

Hành vi Deferred Component (React)

Component <Deferred> của React không còn reset để hiển thị fallback trong partial reload. Trước đây fallback xuất hiện mỗi lần partial reload được kích hoạt. Giờ nội dung hiện có vẫn hiển thị trong khi dữ liệu mới tải, nhất quán với Vue và Svelte. Slot prop reloading mới có trên mọi adapter, cho phép hiển thị loading indicator trong partial reload mà vẫn giữ nội dung hiện có. Xem tài liệu deferred props để biết chi tiết.

Thời điểm reset trạng thái xử lý Form

Helper useForm giờ chỉ reset state processingprogress trong callback onFinish, thay vì ngay khi nhận response. Điều này đảm bảo processing state vẫn là true cho tới khi visit hoàn tất hoàn toàn.

Đã loại LazyProp

Phương thức Inertia::lazy() và class LazyProp, đã deprecated trong v2, đã bị loại bỏ. Hãy dùng Inertia::optional() thay thế; phương thức này cung cấp cùng chức năng:

Tái cấu trúc file Config

File cấu hình Laravel đã được tái cấu trúc. Các setting liên quan page giờ nằm dưới pages, còn section testing được đơn giản hóa:
File config mới lẽ ra đã được publish lại trong bước nâng cấp dependency ở trên.

Đã loại các Testing Concerns

Các trait deprecated Inertia\Testing\Concerns\Has, Inertia\Testing\Concerns\MatchingInertia\Testing\Concerns\Debugging đã bị loại. Các trait này deprecated từ v1 và được thay bằng class AssertableInertia. Không cần hành động trừ khi ứng dụng tham chiếu trực tiếp các trait này.

React Arrow Function Component dùng làm Layout

Implementation layout mới trong v3 không còn hỗ trợ arrow function component gán trực tiếp vào .layout. Inertia không thể phân biệt chúng một cách đáng tin cậy với render function tại runtime. Bọc component trong mảng sẽ giải quyết vấn đề:
Component khai báo bằng function declaration tiếp tục hoạt động mà không cần thay đổi.

Các thay đổi khác


Blade Components

Inertia giờ cung cấp Blade component <x-inertia::head><x-inertia::app> thay cho directive @inertiaHead@inertia. Head component nhận fallback content qua slot và chỉ render khi SSR không hoạt động, giải quyết vấn đề lâu năm về thẻ <title> bị trùng trong ứng dụng SSR.
resources/views/app.blade.php
Các directive hiện có vẫn tiếp tục hoạt động và không cần thay đổi.

SSR trong Development

Khi dùng plugin @inertiajs/vite mới, SSR tự động hoạt động trong development chỉ bằng cách chạy npm run dev. Bạn không còn cần build SSR bundle bằng vite build --ssr hoặc chạy Node.js server riêng bằng php artisan inertia:start-ssr trong development. Các command này giờ chỉ cần cho production deployment.

Middleware Priority

Inertia middleware giờ tự động được đăng ký trong danh sách middleware priority của Laravel, đảm bảo nó chạy trước middleware như ThrottleRequests. Điều này sửa lỗi khiến request PUT/PATCH/DELETE bị rate limit có thể nhận redirect 302 thay vì 303 đúng, làm browser retry HTTP method ban đầu trên redirect target. Không cần hành động bổ sung.

Nested Prop Types

Các prop type như Inertia::optional(), Inertia::defer()Inertia::merge() giờ hoạt động bên trong closure và nested array. Inertia resolve chúng ở mọi depth và dùng dot-notation path trong partial reload metadata.
Ở phía client, các option onlyexcept, cũng như component DeferredWhenVisible, đều hỗ trợ dot notation để target nested prop.
Các class implement interface ProvidesInertiaProperties cũng hoạt động ở mọi mức nesting.

Build Target ES2022

Các package Inertia giờ target ES2022, tăng từ ES2020 trong v2. Bạn có thể dùng Vite plugin @vitejs/plugin-legacy nếu ứng dụng cần hỗ trợ browser cũ.

Package chỉ dùng ESM

Toàn bộ package Inertia giờ chỉ phát hành dạng ES Module. Import CommonJS bằng require() không còn được hỗ trợ. Bạn nên cập nhật mọi lệnh gọi require() sang câu lệnh import.

Thay đổi Page Object

Các property clearHistoryencryptHistory trong page object giờ là tùy chọn và chỉ có trong response khi là true. Trước đây mọi response đều chứa "clearHistory": false"encryptHistory": false kể cả khi history không bị xóa hay mã hóa.

Tài liệu chính thức

Bài dịch này được đối chiếu từ tài liệu Inertia.js v3 chính thức. Nếu có khác biệt do phiên bản hoặc cập nhật mới, hãy ưu tiên tài liệu chính thức làm nguồn tham chiếu.