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.
- Instant visits chuyển sang target component trước khi server phản hồi
- Generic cho Form component để có error và slot prop type-safe
- Tắt SSR theo route qua middleware hoặc facade
- Thông báo lỗi SSR tốt hơn với component name, URL và hint có thể hành động
- Hỗ trợ Enum trong response
Inertia::render() - Page object trong resolve callback để component resolution nhận biết context
- HTTP interceptor tích hợp không cần Axios
- Tùy chọn default layout trong
createInertiaApp - Tùy chọn
preserveErrorsđể giữ validation error trong partial reload - Blade component thay thế cho directive
@inertiavà@inertiaHead, có hỗ trợ SSR head fallback
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:pages cho component resolution:
inertiajs/inertia-laravel:
@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:
onHttpException và onNetworkError mới:
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.
Đã loại Future Options
Namespace cấu hìnhfuture đã 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.preserveEqualPropsfuture.useDataInertiaHeadAttributefuture.useDialogForErrorModalfuture.useScriptElementForInitialPage
<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ínhinertia 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 exporthideProgress() và 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
HelperuseForm giờ chỉ reset state processing và progress 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ứcInertia::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ướipages, còn section testing được đơn giản hóa:
Đã loại các Testing Concerns
Các trait deprecatedInertia\Testing\Concerns\Has, Inertia\Testing\Concerns\Matching và Inertia\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 đề:
Các thay đổi khác
Blade Components
Inertia giờ cung cấp Blade component<x-inertia::head> và <x-inertia::app> thay cho directive @inertiaHead và @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
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() và 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.
only và except, cũng như component Deferred và WhenVisible, đều hỗ trợ dot notation để target nested prop.
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ằngrequire() 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 propertyclearHistory và encryptHistory 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 và "encryptHistory": false kể cả khi history không bị xóa hay mã hóa.