Inertia::render() 返回空白页或404的主因是中间件未正确注册、请求未走web组、路径大小写不匹配;Vue 3需显式声明props类型,表单验证须由$request->validate()自动触发错误注入,延迟加载需服务端with()配合客户端主动调用。

Inertia.js 不是“前端框架”,它根本不需要你重写 API 或管理跨域——只要 Laravel 控制器能返回数据,Vue 页面就能直接用。
为什么 Inertia::render() 返回空白页或 404
这不是 Vue 没加载,也不是路由写错了,而是 Inertia 的请求拦截链断在了中间。最常踩的坑就三个:
-
\Inertia\Middleware::class没加进app/Http/Kernel.php的$middlewareGroups['web']里(不是全局中间件组) - 控制器用了
Route::get('/foo', ...)->middleware('api')—— Inertia 只响应web中间件组的请求 -
resources/js/app.js里resolve函数路径和Inertia::render('Dashboard')的字符串不一致,比如组件实际在resources/js/Pages/Dashboard.vue,但写了require(`./Pages/dashboard.vue`)(大小写敏感)
createInertiaApp() 初始化时 props 接收不到数据
Vue 3 组合式 API 下,defineProps 必须显式声明类型,否则 $page.props 看起来存在,但解构后是 undefined:
- 别写
const { user } = defineProps()—— 这会丢失类型推导和运行时校验 - 必须写
defineProps({ user: Object, posts: Array }),且类型要和后端传入结构一致(比如user是 Eloquent 对象,得先toArray()或用toJSON()) - 如果 props 是嵌套对象(如
{ profile: { name: 'a' } }),Vue 不会自动深层响应式,要用reactive()包一层或改用toRefs()
表单提交后页面没刷新,但后端验证失败没显示错误
Inertia 的错误注入是全自动的,但前提是后端不手动 catch ValidationException,也不 return JSON:
立即学习“前端免费学习笔记(深入)”;
- 控制器里直接写
$request->validate([...])即可,Inertia 会捕获异常并把errors注入到$page.props.errors - Vue 3 中用
const errors = usePage().props.value.errors读取,别用$page(那是 Vue 2 写法) - 如果用了
useForm(),它内部已绑定errors响应式对象,直接form.errors.email就行,不用额外处理 - 注意:Laravel 默认只对
web中间件下的请求返回重定向响应;若用了自定义中间件(比如权限校验失败跳转),需确保它也返回redirect()->back()而非response()->json()
延迟加载 props 和预加载链接失效
Inertia v3 的 defer 和 prefetch 不是开箱即用的功能,它们依赖服务端明确标记 + 客户端主动触发:
-
Inertia::render('Post/Show', ['post' => $post->only('id', 'title')])->with(['content' => fn () => $post->content])才启用延迟属性,否则with()不生效 -
<inertialink :href="route('posts.show', post.id)" prefetch></inertialink>要求路由名已注册(用Route::name()),且目标页面组件已存在,否则预加载静默失败 - 延迟属性的回调函数不能访问 request 或 session,因为它是异步执行的——所有依赖必须提前传入闭包,比如
with(['content' => fn () => auth()->user()->can('view', $post) ? $post->content : null])
真正卡住人的从来不是配置步骤,而是中间件作用域、大小写路径匹配、props 类型声明这三处——它们不出错不报错,只默默让数据消失。


















