前後端分離還是大一統?Laravel + Vue / React 整合全攻略,資深工程師帶你選對路

2025/11/27 | Laravel技術分享, 技術教學資源

前後端分離還是大一統?Laravel + Vue / React 整合全攻略,資深工程師帶你選對路

哈囉,我是浪花科技的 Eric。身為一個每天都在跟程式碼打交道的工程師,我最常被問到的問題之一,就是:「Eric,我們公司想做一個互動性很高的網站,聽說 Laravel 很穩,前端用 Vue 或 React 很潮,那這兩個到底該怎麼兜起來?是該走純 API 的前後端分離,還是有其他更酷的做法?」

問得好!這問題簡直是現代 Web 開發的「天問」。選對了架構,開發起來像在高速公路上開跑車;選錯了,那可能就像在尖峰時刻的市區裡開著卡車,動彈不得。今天,我就來跟大家聊聊 Laravel + Vue / React 整合 的各種門派與心法,從概念到實戰,一次幫你理清思路。

為什麼要自找麻煩?Laravel + 現代前端框架的黃金組合

在我們深入探討「如何整合」之前,得先搞清楚「為何要整合」。畢竟,單純用 Laravel 的 Blade 模板引擎也能做出很棒的網站啊!

沒錯,但當你的應用程式需要極高的互動性、流暢的使用者體驗,像是即時更新的儀表板、無刷新載入的商品頁面,或是一個複雜的單頁應用程式(Single Page Application, SPA)時,傳統的後端渲染模式就會開始顯得力不從心。每一次小小的操作都可能需要重新整理整個頁面,這對使用者來說體驗並不好。

這就是 Vue.jsReact 這些 JavaScript 框架大展身手的時候了。它們的核心思想是「組件化開發」與「狀態管理」,能讓我們打造出如 App般流暢的網頁介面。

  • Laravel 的強項: 作為一個成熟的 PHP 框架,Laravel 提供了強大的後端功能,包括優雅的路由、ORM (Eloquent)、身份驗證、排程任務等,讓開發者可以專注於業務邏輯,而不是重複造輪子。
  • Vue / React 的強項: 它們專注於 UI 層,提供響應式的資料綁定和可重複使用的組件,讓前端的開發與維護變得前所未有的高效。

當你把 Laravel 強大的後端能力,與 Vue / React 靈活的前端互動性結合起來,就能創造出兼具穩定性、安全性與絕佳使用者體驗的現代化應用程式。這不是自找麻煩,而是為了追求卓越的必然選擇。

整合的十字路口:API 模式 vs. Inertia.js 模式

好,既然我們確定了這是一條正確的道路,那問題來了,路有兩條,該走哪一條?目前主流的 Laravel + Vue / React 整合 方式主要有兩種:傳統的 API 模式,以及近年來越來越受歡迎的 Inertia.js 模式。

h3>模式一:純前後端分離(API 模式)

這是最經典的作法。在這個模式下,Laravel 的角色變成了一個純粹的「API 供應商」。

  • 運作方式: 前端(Vue / React)是一個完全獨立的專案,它透過 HTTP 請求(GET, POST, PUT, DELETE)與後端 Laravel API 進行溝通,取得 JSON 格式的資料,然後在瀏覽器端將資料渲染成畫面。
  • Laravel 的責任: 提供 RESTful API、處理商業邏輯、資料庫操作、以及使用者身份驗證(通常使用 Laravel Sanctum 或 JWT)。
  • 前端的責任: 處理所有的話面渲染、路由(使用 Vue Router 或 React Router)、狀態管理(使用 Pinia/Vuex 或 Redux/Zustand),以及呼叫後端 API。

優點:

  • 關注點分離: 前後端徹底解耦,團隊可以並行開發,互不干擾。後端工程師專心寫 API,前端工程師專心刻畫面。
  • 多平台支援: 同一套 API 可以同時供給 Web 前端、手機 App (iOS/Android) 或其他第三方服務使用,擴充性極佳。

缺點(工程師的小囉嗦):

  • 開發複雜度高: 你等於在維護兩個獨立的專案。身份驗證、CORS 設定、前端狀態管理… 這些都需要額外處理,尤其是身份驗證,第一次踩坑通常會花不少時間。
  • SEO 挑戰: 標準的 SPA 內容是靠 JavaScript 在瀏覽器端生成的,對搜尋引擎爬蟲不友善。雖然可以透過伺服器端渲染(SSR)或預渲染(Prerendering)來解決,但這又會增加一層複雜度。

模式二:現代單體應用(Inertia.js 模式)

Inertia.js 的出現,可以說是為了解決純 API 模式的痛點而生。它自己稱作「現代的 Monolith (單體應用)」。

老實說,我第一次看到它的時候也覺得這東西有點奇葩,但用過之後… 真香!

  • 運作方式: 你還是在寫 Laravel 的 Controller 和路由,但你回傳的不是 JSON,也不是 Blade 視圖,而是一個 Inertia 的響應,裡面指定了要載入哪個前端組件(Vue 或 React)以及需要傳遞給它的資料(props)。
  • 無縫銜接: 使用者點擊連結時,Inertia 會在背景發送一個 XHR 請求,後端回傳一個 JSON,其中包含了下一個頁面的組件名稱和資料。前端的 Inertia 核心庫會自動幫你換掉頁面組件,完全不需要刷新頁面,達到了 SPA 的效果。

優點:

  • 開發體驗極佳: 你可以像寫傳統 Laravel 應用一樣寫 Controller 和路由,享受 Laravel 完整的 Middleware、身份驗證、表單驗證等功能,同時又能獲得 SPA 的流暢體驗。
  • 簡化開發: 不用再寫 API、不用煩惱前端路由、不用處理複雜的狀態管理。後端傳什麼資料,前端組件就用什麼,直觀又簡單。
  • 內建 SEO 友善: Inertia 支援 SSR(伺服器端渲染),設定相對簡單,可以有效解決 SPA 的 SEO 問題。

缺點(還是要囉嗦一下):

  • 前後端耦合: 這種模式下,你的前端是為 Laravel 後端量身打造的,無法輕易地抽出來給手機 App 使用。如果一開始就確定需要支援多平台,那 API 模式可能還是比較好的選擇。

實戰演練:用 Vite 快速啟動一個 Laravel + Vue 專案

紙上談兵終覺淺,我們來動手做一次。現在的 Laravel 預設使用 Vite 作為前端建構工具,速度飛快,體驗極佳。

步驟一:建立新的 Laravel 專案

打開你的終端機,輸入以下指令。我們以 Vue 為例,如果你想用 React,只要把 `–vue` 換成 `–react` 即可。

composer create-project laravel/laravel my-app
cd my-app
composer require inertiajs/inertia-laravel
npm install
npm install @inertiajs/vue3 vue

步驟二:設定 Inertia 中介軟體

到 `app/Http/Kernel.php` 檔案,在 `$middlewareGroups` 的 `web` 陣列中加入 Inertia 的中介軟體:

'web' => [
    // ... 其他中介軟體
    \App\Http\Middleware\HandleInertiaRequests::class,
],

步驟三:設定前端進入點

修改 `resources/js/app.js` 檔案,讓它使用 Inertia 來啟動 Vue:

import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true });
    return pages[`./Pages/${name}.vue`];
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el);
  },
});

步驟四:修改 Controller 回傳 Inertia 視圖

假設我們有一個 `PostController`,我們想顯示文章列表。傳統上你會回傳一個 Blade 視圖,現在改成回傳 Inertia:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Inertia\Inertia;

class PostController extends Controller
{
    public function index()
    {
        return Inertia::render('Posts/Index', [
            'posts' => Post::all()->map(fn ($post) => [
                'id' => $post->id,
                'title' => $post->title,
            ]),
        ]);
    }
}

這裡的 `’Posts/Index’` 對應到前端的 `resources/js/Pages/Posts/Index.vue` 組件。`’posts’` 陣列會作為 props 傳遞給這個組件。

步驟五:建立前端 Vue 組件

在 `resources/js/Pages/Posts/` 目錄下建立一個 `Index.vue` 檔案:

<script setup>
defineProps({
  posts: Array,
});
</script>

<template>
  <div>
    <h1>文章列表</h1>
    <ul>
      <li v-for="post in posts" :key="post.id">
        {{ post.title }}
      </li>
    </ul>
  </div>
</template>

最後,同時執行 `php artisan serve` 和 `npm run dev`,你就能在瀏覽器上看到由 Vue 組件渲染出來、但資料是從 Laravel Controller 直接傳過來的頁面了!是不是很神奇?整個過程幾乎沒有 API 的感覺,但你卻得到了一個功能完整的 SPA 頁面。

結論:該如何選擇?

講了這麼多,到底該選哪個?這裡是我 Eric 的真心建議:

  • 如果你正在開發一個 Web 應用,且短期內沒有支援 App 的計畫: 請毫不猶豫地選擇 Inertia.js。它的開發效率和體驗會讓你愛不釋手,並且能避開許多前後端分離的坑。
  • 如果你需要為多個客戶端(Web, iOS, Android)提供服務: 那就選擇傳統的 API 模式。這是最靈活、最具擴充性的架構,雖然前期開發成本較高,但長遠來看是值得的。

無論選擇哪條路,Laravel + Vue / React 整合 都是一個強大的技術組合,能幫助你打造出色的現代化應用。高效的開發不僅能節省成本,更能提升網站的整體效能,這對於使用者體驗和網站速度至關重要。

希望今天的分享對你有幫助。選擇正確的技術架構是專案成功的第一步,也是最關鍵的一步。如果你在專案開發上遇到了瓶頸,或是有更複雜的架構問題需要諮詢,浪花科技的團隊隨時準備好提供專業的協助。

準備好打造下一個偉大的專案了嗎?立即聯繫我們,讓我們的專家團隊助你一臂之力!

 
立即諮詢,索取免費1年網站保固