從伺服器要資料的那一刻:前端與伺服器的對話

更新日期: 2025 年 4 月 2 日

當你打開一個網站、點擊一個按鈕或搜尋某個關鍵字時,畫面背後其實正在發生一連串「前端與伺服器的對話」。

這些對話看不見,但卻是讓網站能正常運作的關鍵。

這篇文章將帶你了解這個對話流程,也就是我們常說的「request / response」(請求與回應)。

我們會從基本概念出發,談談 CSR(Client-Side Rendering)與 SSR(Server-Side Rendering)是什麼、它們有什麼差別,並且實際動手做一個小小的資料請求範例,幫助你更深入理解。


瀏覽器與伺服器的互動流程:Request / Response

每當你打開一個網站、點擊一個連結或按下送出按鈕時,其實就是在觸發一段「前端(瀏覽器)和後端(伺服器)之間的溝通過程」。

這個溝通的基礎架構就是 Request(請求)Response(回應)

什麼是 Request?

Request 是由瀏覽器發出的「請求訊號」,告訴伺服器:「我需要某些資料或服務,請幫我準備。」

這個請求可能包含:

  • 我要的網址(例如:https://example.com/products
  • 請求的方法(像是 GET 或 POST)
  • 額外的資料(例如:表單輸入的內容、登入憑證)
  • 標頭資訊(Headers,像是告訴伺服器我能讀什麼格式)

什麼是 Response?

Response 是伺服器對請求的回應

伺服器在收到 Request 後,會根據你提出的需求準備對應的資料,例如 HTML 頁面、JSON 格式的資料、圖片、影音檔案等,然後回傳給瀏覽器。

當 Response 回來後,瀏覽器就能將這些資料顯示在畫面上,或做後續處理。

🍔 用生活例子來理解:像是點餐服務

  • 你(瀏覽器)打電話給餐廳(伺服器),跟他說:「我要一份牛肉麵外帶。」👉 這就是 Request
  • 餐廳(伺服器)收到請求後,廚房開始準備你的餐點,然後請外送員把牛肉麵送到你家。👉 這就是 Response

而整個流程的關鍵是:你清楚地表達需求,對方準備好東西,並且成功送回來給你。

常見的 HTTP Request 方法介紹:

在前端開發中,我們經常透過 HTTP 的四大主要方法來和伺服器互動,每一種方法都對應不同的操作。

方法用途舉例說明
GET拿資料我要「取得」某個產品清單、某篇文章內容,例如:顯示商品列表、顯示使用者資料。
POST送資料我要「送出」一筆資料給伺服器,例如:註冊帳號、送出表單、登入。
PUT / PATCH更新資料當我想要修改某個已存在的資料,例如:編輯個人資料、更新文章內容。(PUT 通常是「整筆改」,PATCH 是「部分改」)
DELETE刪除資料我要刪除某筆資料,例如:移除購物車的項目、刪除使用者帳號。

Request / Response 的基本流程圖

sequenceDiagram
    participant 瀏覽器
    participant 伺服器
    
    Note over 瀏覽器: 使用者操作瀏覽器
    瀏覽器->>伺服器: 發送 Request
    Note over 伺服器: 收到後處理請求
    伺服器->>瀏覽器: 回傳 Response
    Note over 瀏覽器: 收到資料並顯示在畫面上

這整個流程會在幾毫秒~幾秒之間發生完成,對使用者來說幾乎是即時的互動體驗。

🔍 小補充:Request / Response 的技術細節

  • 這樣的溝通是透過 HTTP 或 HTTPS 協議 進行的,確保雙方知道怎麼「講同一種語言」。
  • 當你在瀏覽器中按下 F12(開發者工具),再切到「Network(網路)」頁籤,就可以看到每一次 Request / Response 的詳細紀錄,包含請求的網址、方法、回傳的內容與狀態碼。

CSR 與 SSR 是什麼?

在現代網頁開發中,當我們在討論「一個網站的畫面是怎麼產生的?」時,會遇到兩種很重要的技術概念:

Client-Side Rendering(CSR,客戶端渲染)Server-Side Rendering(SSR,伺服器端渲染)

這兩者的主要差異在於——「誰」負責把資料變成畫面?

是使用者的瀏覽器(Client)處理?還是伺服器(Server)處理?

下面我們來分別說明。

Client-Side Rendering(CSR):畫面在瀏覽器端生成

CSR 的意思是:資料從伺服器拿回來後,瀏覽器(前端)再用 JavaScript 把畫面畫出來

這是目前非常流行的做法,尤其是在使用 React、Vue、Angular 等現代前端框架時幾乎都是走 CSR 的流程。

🛠 CSR 的詳細流程如下:

  1. 使用者在瀏覽器輸入網址、進入網站。
  2. 瀏覽器下載一個「非常簡單的 HTML 檔案」,這個檔案通常幾乎是空的,只是幫你把 JavaScript 載入進來。
  3. 接著瀏覽器會下載 JavaScript 檔案(通常包含整個網站的邏輯與畫面結構)。
  4. JavaScript 開始執行,這時候才向伺服器發出資料請求(例如 API)。
  5. 當伺服器把資料回傳後,前端再用 JavaScript 把資料「渲染成畫面」。
  6. 使用者看到真正的內容,可能已經過了幾百毫秒甚至幾秒。
flowchart TD
    %% 初始加載流程
    Browser[瀏覽器] -->|1.請求頁面| Server[伺服器]
    Server -->|2.回傳HTML骨架和JS| Browser
    
    %% CSR主要流程
    Browser -->|3.載入JS| Bundle[JavaScript Bundle]
    Bundle -->|4.建立| ReactApp[React/Vue應用]
    ReactApp -->|5.管理| VirtualDOM[Virtual DOM]
    VirtualDOM -->|6.渲染| RealDOM[實際DOM]
    RealDOM -->|7.使用者看到| UI[使用者介面]
   
    
    %% 互動與狀態更新
    UI -->|8.互動| Event[事件觸發]
    Event -->|9.執行| Handler[事件處理函數]
    Handler -->|10.更新| State[應用狀態/Store]
    State -->|11.觸發重新渲染| VirtualDOM
    
    %% 重要概念標註
    ReactApp -.->|管理| Props[Props傳遞]
    ReactApp -.->|維護| StateManagement[狀態管理]
    VirtualDOM -.->|高效| DiffAlgorithm[差異比對演算法]
    
    classDef serverSide fill:#f9d,stroke:#333,stroke-width:1px
    classDef clientSide fill:#adf,stroke:#333,stroke-width:1px
    classDef component fill:#bfb,stroke:#333,stroke-width:1px
    classDef stateFlow fill:#ffa,stroke:#333,stroke-width:1px
    classDef concept fill:#eee,stroke:#999,stroke-width:1px,stroke-dasharray: 5 5
    
    class Server serverSide
    class Browser,Bundle,ReactApp,VirtualDOM,RealDOM,UI clientSide
    class AppComponent,HeaderComponent,MainContent,FooterComponent,ProductList,ProductCard1,ProductCard2 component
    class Event,Handler,State stateFlow
    class Props,StateManagement,DiffAlgorithm concept

🎬 生活比喻:

你訂了一份 IKEA 的家具組裝包裹,打開包裹時,裡面只有說明書、螺絲、木板,還有工具。

你必須依照說明書自己動手把整組家具組裝好,才能真正看到完整的成品。

這就是 CSR——自己在瀏覽器端把一切拼湊出來

Server-Side Rendering(SSR):畫面在伺服器端生成

SSR 則是相反的做法:在使用者請求網頁時,伺服器就已經把資料整理好並「生成完整 HTML 頁面」,直接送給瀏覽器。

這種做法其實是比較「傳統」的方式,也常見於許多內容為主的網站或部落格。

🛠 SSR 的詳細流程如下:

  1. 使用者打開網站。
  2. 瀏覽器向伺服器發出 Request。
  3. 伺服器拿到請求後,在後端執行邏輯、抓資料、組成完整的 HTML
  4. 把這個「已經包含畫面與資料」的 HTML 一次送給瀏覽器。
  5. 瀏覽器只需要接收並顯示這個 HTML,幾乎不需要額外的處理。
  6. 使用者能馬上看到完整的內容,速度快又利於 SEO。
flowchart TD
    %% 初始請求和伺服器端渲染
    Browser[瀏覽器] -->|1.請求頁面| Server[伺服器]
    
    %% 伺服器端處理
    Server -->|2.處理請求| Router[路由處理]
    Router -->|3.呼叫| Controller[控制器]
    Controller -->|4.獲取數據| Database[(資料庫/API)]
    Database -->|5.返回數據| Controller
    Controller -->|6.傳遞數據| TemplateEngine[模板引擎]
    TemplateEngine -->|7.渲染模板| Templates[(模板文件)]
    Templates -->|8.套用數據| TemplateEngine
    TemplateEngine -->|9.生成HTML| HTML[完整HTML]
    
    %% 回傳到客戶端
    HTML -->|10.添加少量JS| EnhancedHTML[增強型HTML]
    Server -->|11.回傳完整HTML| Browser
    
    %% 客戶端處理
    Browser -->|12.解析渲染| VisibleContent[用戶看到完整頁面]
    Browser -->|13.加載JS| EnhancementJS[增強JavaScript]
    EnhancementJS -->|14.添加交互功能| Interactive[增強用戶體驗]
    
    %% 後續請求
    Interactive -->|15.點擊鏈接| NewRequest[新頁面請求]
    NewRequest -->|16.提交表單或請求| Server
    
    %% 技術框架例子
    subgraph "傳統SSR技術"
        PHP["PHP + Laravel/Symfony"]
        Ruby["Ruby on Rails"]
        Python["Python + Django/Flask"]
        NodeJS["Node.js + Express + EJS"]
        Java["Java + Spring MVC + Thymeleaf"]
    end
    
    Server -.->|常用技術| PHP
    Server -.->|常用技術| Ruby
    Server -.->|常用技術| Python
    Server -.->|常用技術| NodeJS
    Server -.->|常用技術| Java
    
    classDef browser fill:#adf,stroke:#333,stroke-width:1px
    classDef server fill:#f9d,stroke:#333,stroke-width:1px
    classDef data fill:#ffd,stroke:#333,stroke-width:1px
    classDef process fill:#dfd,stroke:#333,stroke-width:1px
    classDef tech fill:#f5f5f5,stroke:#999,stroke-width:1px,stroke-dasharray: 5 5
    
    class Browser,VisibleContent,Interactive,NewRequest browser
    class Server,Router,Controller,TemplateEngine,HTML,EnhancedHTML server
    class Database,Templates data
    class EnhancementJS process
    class PHP,Ruby,Python,NodeJS,Java tech


🎬 生活比喻:

像去餐廳點好餐後,餐廳直接幫你把整套餐點端上桌,你不需要自己動手煮。

這就是 SSR——伺服器幫你準備好一切,只要享用就好

CSR vs SSR 差異總整理:

項目CSR(Client-Side Rendering)SSR(Server-Side Rendering)
畫面生成地點使用者的瀏覽器(前端)伺服器端
初次載入速度較慢(要先載入 JS、再請求資料再渲染)較快(一次拿到已組好的畫面)
SEO 表現較差(搜尋引擎可能看不到內容)較好(搜尋引擎能抓到 HTML 內容)
後續互動體驗非常流暢,支援動態互動通常要加上前端 JS 才能有互動
技術挑戰較依賴前端開發技能與架構設計較依賴後端模板技術或 SSR 框架
適用情境SPA、Web App、使用者互動多的系統部落格、商品頁、內容導向且重視 SEO 的網站

那該選哪一種?

想法 / 需求建議選擇
「我想做像 Gmail、Facebook 那樣的 Web App」CSR
「我的網站主要是文章、商品頁,需要被 Google 搜尋到」SSR
「我希望網站初次載入就很快看到內容」SSR
「我的網頁資料是從外部 API 拿來的,更新頻繁」CSR
「我使用的是 Next.js / Nuxt」它們可以混合 SSR + CSR,視需求調整

CSR 對 SEO 的影響是什麼?

為什麼 CSR 會影響 SEO?從搜尋引擎的角度來看

很多剛開始接觸前端開發的同學,會好奇:「CSR(Client-Side Rendering)不是能做出很動態的網站嗎?為什麼會對 SEO 不友善?」

這要從 搜尋引擎(像 Google)是怎麼看你網站的內容 說起。

🔍 搜尋引擎是怎麼抓你網站的內容?

搜尋引擎會透過一種叫做 爬蟲(crawler) 的程式,自動去瀏覽網頁、讀取 HTML 裡的文字內容、連結、標題等等,然後建立搜尋結果的索引(index)。

這些爬蟲最擅長的就是直接讀「HTML 原始碼」

但問題來了:CSR 的 HTML 一開始是空的。

🧱 CSR 的問題:HTML 裡幾乎沒內容

回顧一下 CSR 的流程,我們知道:

  • 當使用者第一次打開網頁時,伺服器回傳的 HTML 幾乎是空的(只包含一個 <div id="app"></div>
  • 實際內容(文章、圖片、產品)是等 JavaScript 執行完、資料抓回來後 才動態加到頁面上

✅ 人類看網頁的流程:

等一下畫面就跑出來了 → 看得懂內容 → 沒問題

❌ 搜尋引擎的流程:

拿到的是空的 HTML → 看不到真正內容 → 無法收錄或理解這個頁面

這就會造成 SEO(搜尋引擎最佳化)效果變差 的情況。

⚠️ 會出現什麼具體後果?

  • 你的網頁可能根本不會被 Google 納入搜尋結果
  • 即使收錄了,搜尋結果上也會看不到正確的標題或描述
  • 頁面內容無法被爬蟲理解 → 沒辦法依據關鍵字正確排序
  • 對依賴自然搜尋流量的網站(例如電商、媒體、部落格)來說是大災難

那該怎麼辦?

如果你開發的頁面「非常重視 SEO」,例如:

  • 產品介紹頁(需要被搜尋到)
  • 部落格文章頁(要靠自然流量)
  • 媒體內容頁(如新聞、報導)

那麼你可以考慮這兩種替代方案:

✅ 1. SSR(Server-Side Rendering)

使用伺服器端渲染,讓伺服器直接回傳一份已經包含完整資料的 HTML 頁面,讓爬蟲一進來就能看到內容。

這樣可以確保搜尋引擎能正確抓到你要的內容。

現代框架中:

  • React → 可以使用 Next.js
  • Vue → 可以使用 Nuxt

✅ 2. 靜態預渲染(Static Site Generation)

如果你的頁面內容不是經常變動,可以在「建置階段」就把畫面生好,像是「事先烤好的餅乾」,直接放在伺服器上等使用者來吃。

這種方法叫做 預渲染(Pre-rendering)靜態生成(Static Generation),效果就跟 SSR 類似,但執行時效能更好、也更穩定。

  • 也是 Next.js、Nuxt 等框架的功能之一
  • 常與 JAMstack 架構搭配(像是 Markdown 網站、靜態部落格)

小結:CSR ≠ SEO 友善,但不是不能處理

項目CSR(Client-Side Rendering)SSR / 靜態生成
首次載入 HTML 是否包含資料?❌ 幾乎沒有✅ 有完整內容
搜尋引擎能否讀取頁面資料?⚠️ 不一定能讀到✅ 可以
適合哪類網站?互動性高的系統、內部頁面重視搜尋流量的公開頁面

CSR 能讓網站看起來更動態、互動性更高,但它天生不太適合拿來處理 SEO 關鍵頁面。

要打造既漂亮又搜尋友善的網站,理解這個限制非常重要。

好消息是,現在很多前端框架都已經支援「混合渲染」策略,讓你在同一個專案中可以選擇哪一頁用 CSR、哪一頁用 SSR 或預渲染,彈性十足!

只要策略正確,就不用擔心 SEO 掉漆啦 😄


結語

前端與伺服器的互動,是現代網頁開發中非常基礎、卻又重要的核心概念。

無論你是初學者,或是剛接觸前後端分離的架構,理解「request / response」的流程、CSR 與 SSR 的差異,會幫助你更有信心地開發動態網站。

記得,網頁不是魔法,而是程式之間有條不紊的對話。

掌握這場對話,你就能掌握畫面背後的世界!

Similar Posts