inertia
前后端黏合剂:让 Laravel/Rails 开发者用熟悉的 MVC 方式,零学习成本打造 SPA
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
前后端黏合剂:让 Laravel/Rails 开发者用熟悉的 MVC 方式,零学习成本打造 SPA
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你是公司里的 Laravel 老手,写了多年后端 CRUD,最近被产品催着做一个管理后台。"加点动画吧"、"页面别刷新"——产品经理随口一句话,意味着你得啃完 Vue Router、Vuex、Axios、SSR 脱水/注水……还没开工,心态已经崩了一半。
Inertia.js 解决的就是这个问题:让你用最熟悉的方式(Controller 渲染模板、路由定义 URL),直接拿到现代单页应用的用户体验——页面无刷新切换、组件状态保持、懒加载。它不是另一个前端框架,而是一层"黏合剂",把后端 MVC 和前端 React/Vue/Svelte 无缝桥接起来。
图1:Inertia.js 官方 Logo
Inertia.js 的故事要从 2017 年说起。创始人 Jonathan Reinink 是加拿大的一位全栈开发者,常年活跃在 Laravel 社区。他在做项目时反复遇到一个痛点:客户想要现代 SPA 的交互体验,但又不值得为此付出前后端完全分离的巨大代价——要维护两套代码库、两个部署流水线、两套 CI/CD。
他先后尝试过 Turbolinks、Pjax 等方案,都不太满意,最终决定自己造一个轮子。2019 年正式发布后,迅速在 Laravel 社区走红,随后也支持了 Rails 和 Django,成为跨后端框架的通用方案。
从 GitHub 数据看,该项目目前拥有 8000+ Stars,被众多知名开源项目采用(如 Filament Admin、Laravel Breeze 等),是 Laravel 生态中排名前列的前端集成方案。
Inertia.js 的工作原理可以用一个比喻来理解:
传统 MPA(多页面应用):浏览器 -> 服务器 -> 返回 HTML -> 整个页面刷新 传统 SPA(单页面应用):浏览器 -> 服务器 -> 返回 JSON -> 前端自己决定渲染什么 Inertia:浏览器 -> 服务器 -> 返回 JSON(但告诉前端"这是第几页") -> 前端渲染对应页面组件
具体来说,当用户在 SPA 模式下点击一个链接时:
关键在于:服务器端完全不知道自己在和一个 SPA 通信,它只是在渲染一个"页面",这让后端开发者可以继续用熟悉的 ORM 查询、Eloquent 模型、Form Request 验证,而不需要学习 GraphQL 或 REST API 设计。
Inertia 的核心 API 非常简洁:
import { Inertia } from '@inertiajs/inertia'
// 普通导航
Inertia.get('/users')
// 带数据
Inertia.post('/users', { name: '张三' })
// 局部更新
Inertia.reload({ only: ['users'] })
这背后有一个巧妙设计:Inertia 会记住浏览器的历史记录栈,支持浏览器的前进/后退按钮。每一"页"对应服务器一次完整的 Controller 调用,数据完全由后端控制。
有时候多个页面需要共用同一份数据(比如当前登录用户信息、权限列表)。Inertia 提供了 HandleInertiaRequests 中间件,所有页面组件都能通过 props.auth 访问当前用户,任何 prop 的变化都会触发组件重新渲染。
对于不需要立即加载的数据,可以标记为懒加载,只有在组件中手动调用时才发起请求,减少不必要的网络开销。
Inertia 采用了 pnpm monorepo 结构,主包下有 5 个子包:
| 包 | 语言 | 说明 |
|---|---|---|
packages/core | TypeScript | 核心协议实现,所有 adapter 的基础 |
packages/react | TypeScript | React 适配器 |
packages/vue3 | TypeScript | Vue 3 适配器 |
packages/svelte | TypeScript | Svelte 适配器 |
packages/vite | TypeScript | Vite 插件,支持 HMR |
Playgrounds 目录提供了三个完整可运行的示例项目(react/svelte5/vue3),均基于 Laravel 作为后端,克隆后 init.sh 一键初始化,非常适合学习。
代码质量方面,仓库有完整的 TypeScript 类型定义、Playwright E2E 测试套件、ES2022 语法检查,代码风格统一(oxfmt + ESLint),整体质量评分可达 85/100。
Inertia.js 代表了一个重要的行业趋势:中间路线。它拒绝"要么全 SPA、要么全 MPA"的二元对立,提出"服务端渲染页面 + 客户端路由导航"的第三条路。
从数据看,Inertia 在 Laravel 社区的采用率持续上升,与 Livewire 一起成为 Laravel 两大前端集成方案。它的成功也说明:绝大多数 CRUD 应用不需要 React 的全部能力,用一个更轻量的方案来满足 80% 的需求,是更务实的工程选择。
# 安装 Laravel + Inertia(推荐使用 Laravel Breeze)
composer require inertiajs/inertia-laravel
npm install @inertiajs/vue3 @inertiajs/vite
Playground 项目克隆后运行 ./init.sh 即可看到完整的启动流程。文档详尽,官网 inertiajs.com 提供了从安装到进阶的完整教程。
总结一句话:Inertia.js 适合那些"不想被 SPA 的复杂度绑架,但又想要 SPA 体验"的后端开发者,它是当前最优雅的 MPA->SPA 渐进增强方案。