Skip to main content
Server-side rendering render trước các trang JavaScript trên máy chủ, nhờ đó người truy cập nhận được HTML đã được render đầy đủ khi truy cập ứng dụng. Vì ứng dụng phục vụ HTML hoàn chỉnh, các công cụ tìm kiếm cũng dễ index website hơn. Server-side rendering dùng Node.js để render page trong background process; do đó server phải có Node để SSR hoạt động đúng. SSR server của Inertia yêu cầu Node.js 22 trở lên.

Laravel Starter Kit

Nếu đang dùng Laravel Starter Kits, Inertia SSR được hỗ trợ thông qua một build command:

Thiết lập Vite Plugin

Cách được khuyến nghị để cấu hình SSR là dùng @inertiajs/vite plugin. Cách này tự động xử lý cấu hình SSR, bao gồm SSR ở development mode mà không cần Node.js server riêng.
1

Install the Vite plugin

2

Configure Vite

Thêm Inertia plugin vào file vite.config.js. Plugin tự động phát hiện SSR entry point.
vite.config.js
Bạn cũng có thể cấu hình SSR option rõ ràng.
vite.config.js
Bạn có thể truyền false để tắt xử lý SSR tự động của plugin, ví dụ khi muốn cấu hình SSR thủ công hoặc tắt hoàn toàn SSR.
vite.config.js
3

Update your build script

Cập nhật script build trong package.json để build cả hai bundle.
package.json

Development mode

Vite plugin tự động xử lý SSR trong development. Không cần build SSR bundle hay chạy Node.js server riêng. Chỉ cần chạy Vite dev server như bình thường:
Vite plugin expose server endpoint để Laravel dùng cho rendering, có đầy đủ hỗ trợ HMR.

Production

Trong production, build cả hai bundle rồi khởi động SSR server.

Clustering

Mặc định SSR server chạy một thread. Bạn có thể bật clustering để chạy nhiều Node server trên cùng port, request được xử lý bởi từng thread theo round-robin.
vite.config.js

Host

Mặc định SSR server bind 0.0.0.0, nên truy cập được từ mọi network interface. Bạn có thể giới hạn vào interface cụ thể bằng tùy chọn host.
vite.config.js

Thiết lập thủ công

Vite plugin mặc định tái sử dụng entry point app.js cho SSR nên không cần file riêng. Hầu hết tùy chỉnh có thể xử lý bằng withApp callback. Để kiểm soát nhiều hơn, chẳng hạn cung cấp callback setup thủ công, bạn có thể tạo entry point resources/js/ssr.js riêng và cập nhật app.js để dùng client-side hydration.

SSR Entry Point

Hãy thêm vào app.js bất kỳ phần nào còn thiếu nhưng hợp lý khi chạy SSR, chẳng hạn plugin hoặc custom mixin.

Client-side hydration

Không dùng xử lý tự động của Vite Plugin

Bạn có thể truyền ssr: false cho Inertia plugin để tắt xử lý SSR tự động và tự quản lý SSR build. Bạn cũng nên thêm thuộc tính ssr vào cấu hình Laravel Vite plugin để nó biết entry point.

Clustering

Bạn có thể truyền tùy chọn cluster vào createServer để chạy nhiều Node server trên cùng port, request được phân phối round-robin.

Host

Mặc định SSR server bind 0.0.0.0, truy cập được từ mọi interface. Bạn có thể truyền tùy chọn host vào createServer để giới hạn vào interface cụ thể.

Chạy SSR server

SSR server chỉ bắt buộc trong production. Trong development, Vite plugin tự động xử lý SSR.
Sau khi build cả client-side và server-side bundle, bạn có thể khởi động SSR server bằng Artisan command sau.
Mặc định SSR server dùng node làm runtime. Bạn có thể đổi bằng tùy chọn runtime trong config/inertia.php. Path tuyệt đối tới runtime binary cũng được hỗ trợ.
Flag --runtime trên Artisan command override giá trị cấu hình cho một lần gọi.
Bạn cũng có thể bật ensure_runtime_exists để kiểm tra runtime binary tồn tại trước khi khởi động SSR server. Command sẽ thoát với lỗi nếu không tìm thấy binary.
Khi server đang chạy, bạn có thể truy cập app trong trình duyệt với SSR đã bật. Thậm chí có thể tắt hoàn toàn JavaScript mà vẫn điều hướng được trong ứng dụng.

Xử lý lỗi

Khi SSR render thất bại, Inertia graceful fallback về client-side rendering. Vite plugin ghi thông tin lỗi chi tiết ra console, gồm component name, request URL, source location và hint phù hợp để xử lý. Các lỗi SSR phổ biến được tự động phân loại. Browser API error như tham chiếu window hoặc document trong server-rendered code đi kèm hướng dẫn chuyển code vào lifecycle hook. Component resolution error gợi ý kiểm tra file path và casing. Inertia cũng dispatch event SsrRenderFailed phía server. Bạn có thể lắng nghe event để log lỗi hoặc gửi tới error tracking service.

Ném exception khi lỗi

Vì Inertia graceful fallback về client-side rendering, lỗi SSR có thể không được chú ý. Test vẫn pass vì client-side render thành công nhưng user không bao giờ nhận server-rendered HTML. Điều này đặc biệt phổ biến trong E2E test bằng Laravel Dusk hoặc Pest Browser Testing. Bạn có thể đặt tùy chọn throw_on_error trong config/inertia.php để ném exception thay vì fallback im lặng, giúp phát hiện vấn đề SSR sớm.
Không khuyến nghị tùy chọn này trong production vì lỗi SSR sẽ trả error response thay vì fallback về client-side rendering.
Bạn có thể đặt environment variable trong phpunit.xml để chỉ bật trong testing.

Tắt SSR

SSR có hai lớp: Vite plugin phục vụ SSR trong development và build SSR bundle cho production, còn Laravel adapter dispatch rendering request tới SSR server. Để tắt hoàn toàn SSR, nên tắt cả hai.
vite.config.js
config/inertia.php
Bạn cũng có thể ngăn Laravel adapter dispatch SSR request bằng lập trình qua phương thức Inertia::disableSsr(). Điều này hữu ích khi muốn giữ SSR trong build nhưng tắt khi test hoặc trong môi trường cụ thể.
Có thể truyền boolean hoặc closure để tắt SSR theo điều kiện.

Loại route khỏi SSR

Đôi khi bạn muốn bỏ qua server-side rendering cho một số route trong khi vẫn bật SSR cho phần còn lại của ứng dụng.

Qua Middleware

Bạn có thể dùng property $withoutSsr trên Inertia middleware để tắt SSR cho các route pattern cụ thể.

Qua Facade

Bạn cũng có thể loại các route cụ thể bằng phương thức Inertia::withoutSsr(), thường được gọi từ service provider.

Theo từng request

Bạn có thể tắt SSR cho request hiện tại bằng cách đặt cấu hình inertia.ssr.enabled thành false.

Triển khai

Khi deploy app có SSR lên production, bạn cần build cả client-side bundle (app.js) và server-side bundle (ssr.js), sau đó chạy SSR server như background process, thường bằng process monitor như Supervisor.
Để dừng SSR server, chẳng hạn khi triển khai phiên bản mới của website, bạn có thể dùng Artisan command inertia:stop-ssr. Công cụ giám sát tiến trình (như Supervisor) cần chịu trách nhiệm tự động khởi động lại SSR server sau khi nó dừng.
Bạn có thể dùng Artisan command inertia:check-ssr để xác minh SSR server đang chạy. Điều này hữu ích sau khi deploy và rất phù hợp làm Docker health check để đảm bảo server phản hồi đúng như mong đợi.
Mặc định, hệ thống sẽ kiểm tra server-side bundle tồn tại trước khi gửi request tới SSR server. Trong một số trường hợp, chẳng hạn ứng dụng chạy trên nhiều server hoặc trong container, web server có thể không truy cập được SSR bundle. Để tắt kiểm tra này, đặt giá trị cấu hình inertia.ssr.ensure_bundle_exists thành false.

Laravel Cloud

Để chạy SSR server trên Laravel Cloud, bạn có thể dùng hỗ trợ Inertia SSR nguyên bản của Cloud.

Laravel Forge

Để chạy SSR server trên Forge, bạn có thể bật nó bằng tùy chọn Inertia SSR trong panel ứng dụng của site. Forge sẽ tạo daemon cần thiết và, nếu bạn chọn, cập nhật deploy script để khởi động lại SSR server sau mỗi lần deploy.

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.