Back

使用 Laravel 与 Vue 构建全栈应用

使用 Laravel 与 Vue 构建全栈应用

构建现代 Web 应用通常意味着在两条路径之间做出选择:完全解耦的前后端,或紧密集成的单体架构。Laravel Vue 全栈组合提供了一个务实的中间方案——它能够提供类似 SPA 的体验,而无需维护独立 API 契约的开销。

本文探讨了 LaravelVue 3 在当前生态系统中的协作方式,重点关注架构决策、工具选择,以及这个技术栈何时适合你的项目。

核心要点

  • Laravel 与 Vue 3 和 Inertia.js 提供类似 SPA 的行为,无需单独的 API 层,路由、中间件和验证都保留在 Laravel 中。
  • 从 Laravel 9 开始,Vite 取代 Laravel Mix 成为默认构建工具,提供更快的热模块替换和原生 ES 模块支持。
  • Vue 3 中的 Composition API 与 Inertia 的属性传递模式自然契合,无需在生命周期钩子中手动获取数据。
  • 当单个团队同时负责前后端,且应用不需要为外部 API 消费者提供服务时,这个技术栈效果最佳。

现代 Laravel 前端技术栈

Laravel 在处理前端资源方面已经有了显著的演进。从 Laravel 9 开始,Vite 取代 Laravel Mix 成为默认构建工具,带来了更快的热模块替换和原生 ES 模块支持。Laravel Vite 设置与 Vue 3 无缝集成,只需最少的配置即可开始使用。

典型的现代技术栈如下:

  • Vite 用于资源打包和开发服务器
  • Vue 3 配合 Composition API 构建响应式 UI 组件
  • Inertia.js 作为 Laravel 和 Vue 之间的粘合剂
  • Pinia 在需要时用于客户端状态管理

这种组合创建了一个统一的开发工作流,其中 Laravel 处理路由、身份验证和数据,而 Vue 驱动响应式界面。

Inertia.js Laravel Vue 集成的工作原理

Inertia.js 解决了一个特定问题:构建 SPA 而无需创建单独的 API 层。你的 Laravel 控制器不返回 JSON,而是返回包含 Vue 组件名称及其属性的 Inertia 响应。

请求流程如下:

  1. 用户点击包裹在 Inertia 的 <Link> 组件中的链接
  2. Inertia 拦截点击并发起 XHR 请求
  3. Laravel 返回包含组件名称和数据的 JSON
  4. Inertia 交换 Vue 组件而不进行完整页面重载

这种方法意味着你可以像在传统应用中一样使用 Laravel 的路由、中间件和验证。前端只是成为了一个不同的渲染层。

何时适合使用 Inertia

Inertia.js Laravel Vue 集成在以下情况下效果最佳:

  • 单个团队同时负责前后端
  • 你想要 SPA 行为但不想构建 REST 或 GraphQL API
  • SEO 需求可以通过 Inertia 的 SSR 支持满足
  • 应用不需要为移动应用或第三方消费者提供服务

如果你需要为移动应用或外部集成提供公共 API,采用专用 API 的解耦架构仍然是更好的选择。

Vue 3 Composition API 与 Laravel

Vue 3 的 Composition API 与 Laravel 的数据传递模式自然契合。使用 Inertia 时,属性直接从控制器流向 Vue 组件:

// In your Vue component
const props = defineProps({
  users: Array,
  filters: Object,
})

这消除了在 onMounted 钩子中获取数据的繁琐过程。数据在到达前端之前已经由 Laravel 验证,可以直接使用。

对于不需要服务器持久化的客户端状态——UI 切换、表单草稿、临时选择——Pinia 提供了轻量级的状态管理,没有旧方案的样板代码。

开发体验与工具

Laravel 12+ 发布了新的官方脚手架工具(Vue、React、Livewire)。Vue 脚手架是一个 Inertia + Vue 3(Composition API)设置,包含 TypeScript 和 Tailwind;Jetstream 仍然是一个替代脚手架工具,为需要其功能集的团队提供 Inertia(Vue)技术栈。支持 Inertia SSR,但它是一个可选的附加功能,需要单独启用/配置。

对于表单处理,Laravel Precognition 通过在用户输入时运行服务器端验证规则来实现实时验证。这创建了紧密的反馈循环,无需在 JavaScript 中重复验证逻辑。

开发体验受益于:

  • Vite 的亚秒级热重载
  • Laravel 的错误处理直接显示在 Vue 组件中
  • 从 Laravel 模型生成的共享 TypeScript 类型
  • 包含前后端的单一部署产物

性能与可维护性权衡

Inertia 方法用一些灵活性换取了降低的复杂性。你不需要维护 OpenAPI 规范或担心 API 版本控制。但你也无法轻松更换前端框架或从同一后端为多个客户端提供服务。

性能特征与传统 SPA 不同。初始页面加载包含服务器渲染的 HTML(启用 SSR 时),而后续导航由于部分页面更新而感觉即时。打包大小保持可控,因为你不需要提供路由库或数据获取层。

对于已经熟悉 Laravel 的团队,学习曲线很小。不熟悉 PHP 的前端开发者需要了解 Laravel 的约定,但集成点有良好的文档且可预测。

结论

Laravel Vue 全栈方法适合开发速度和团队凝聚力比架构灵活性更重要的项目。它在管理面板、内部工具、SaaS 应用和需要响应式界面的内容密集型网站中表现出色。

如果你正在构建具有多个前端客户端的平台、需要最大程度的前端团队自主权,或预计除自己的应用外还会有大量 API 消费者,请考虑采用解耦架构。

现代 Laravel 前端技术栈并非适合每个项目的正确选择。但对于合适的用例,它在提供用户期望的响应式体验的同时,消除了大量复杂性。

常见问题

可以。你可以将 Vue 用作独立的 SPA,通过 REST 或 GraphQL API 与 Laravel 通信。Inertia.js 是一种集成方法,而非必需品。没有它,你需要构建和维护单独的 API 层,但你获得了从同一后端为多个客户端(如移动应用或第三方消费者)提供服务的灵活性。

支持。Inertia.js 提供内置的 SSR 支持,使用 Node.js 在服务器上运行 Vue 组件。这在初始页面加载时生成 HTML,使内容可被搜索引擎抓取。Laravel Breeze 和 Jetstream 脚手架工具包含 SSR 配置选项,因此对于大多数项目来说设置很简单。

Inertia 包含一个表单助手,它将数据提交到 Laravel,并自动将服务器端验证错误映射回 Vue 组件。Laravel Precognition 更进一步,在用户输入时实时运行现有的验证规则,提供即时反馈,无需在客户端重复任何验证逻辑。

当你的后端需要为多个前端提供服务时(如 Web 应用、移动应用和第三方集成),应选择解耦架构。当独立的前后端团队需要独立工作,或者你需要为外部消费者提供带版本控制的正式 API 契约时,也应考虑这种方式。

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay