React + Vite SPA 部署到 Vercel:404 問題排查全紀錄

更新 發佈閱讀 3 分鐘

最近將 GitHub repo 的前端作品部署到了 vercel,然而在部署時並非一帆風順(不網上說的那麼簡單TT),因此順手記錄下來,提醒自己未來不要再採坑,也希望能幫助到需要的人~


專案背景

我最近開發了一個純前端多語系網站,技術包含:

  • React 18
  • Vite 5
  • React Router(動態路由 /:lang
  • i18next(國際化支援)

這個專案是一個 SPA (單頁應用程式),並且會依照路由切換語言。

專案結構如下:

i18n_demo/
├── package.json
├── vite.config.js
├── src/
└── public/

遇到的問題

1. 根目錄與 GitHub repo 結構問題

第一次部署時,網站畫面直接顯示 404。

後來發現原因是我的 GitHub repo 結構問題。我上傳的是 i18n_demo 資料夾,專案程式碼都在這個資料夾裡。

而 Vercel 預設會把 repo 根目錄當作專案根目錄,因此在部署時如果沒有設定 Root Directory,就會找不到 package.jsondist,導致部署失敗或 404。

解法:在 vercel 專案設定中,將 Root Directory 設為我上傳的 i18n_demo
vercel 建立專案畫面,Root Directory 應填入專案資料夾

vercel 建立專案畫面,Root Directory 應填入專案資料夾

點選 Edit 後可直接選擇對應資料夾

點選 Edit 後可直接選擇對應資料夾

2. 輸入網址或 f5 刷新網頁出現 404

當我成功部署後,利用其他設備輸入網址 (.../en) 查看卻出現 404,回來電腦刷新頁面也會出現 404。

  • 這是因為 SPA 是單頁應用,前端路由是 JavaScript 控制
  • 當瀏覽器直接訪問 /en、/zh 時,伺服器會嘗試去找 /en 這個文件
  • 但 SPA 中這些路徑並沒有對應的檔案
  • 出現 404

網路上查到的做法是在跟目錄新增一個 vercel.json,並寫上:

{
"rewrites": [
{ "source": "/(.*)", "destination": "/" }
]
}

這會讓所有的路徑導向 index.html,讓 React Router 處理前端路由。加上後,/en 或 /zh 這些語言設定就不會被伺服器阻擋。


總結

要將 GitHub 專案部署到 vercel 需要注意:

  1. 確認 GitHub repo 架構,並根據架構在 vercel 專案設定正確的 Root Directory
  2. 新增 vercel.json 並加入 rewrite 規則

參考

  1. 解决vercel部署的前端项目刷新后出现404的问题
  2. Rewrite to index.html ignored for React + Vite SPA (404 on routes)
留言
avatar-img
Elaine 粼粼的林林總總
7會員
37內容數
不定期地分享程式/旅遊/學習/閱讀或各式各樣的文章,如果對我的分享有興趣,歡迎來找我玩~
2026/02/28
前一篇文章介紹了 JavaScript 中的 class 及語法,本篇文章將延續上一篇的基礎,進一步深入了解 extends 如何建立繼承關係、super() 在建構子中的角色、super.method() 如何搭配覆寫(override)使用。
2026/02/28
前一篇文章介紹了 JavaScript 中的 class 及語法,本篇文章將延續上一篇的基礎,進一步深入了解 extends 如何建立繼承關係、super() 在建構子中的角色、super.method() 如何搭配覆寫(override)使用。
2026/02/25
探討 JavaScript ES6 推出的 class 語法,其本質上是基於原型的語法糖。文章從建構函式概念出發,對比其與 class 的 constructor 差異,透過實際程式碼驗證 class 內部方法屬於原型物件。說明 class 作為 function 的特性以及其不會被提升的重要區別。
2026/02/25
探討 JavaScript ES6 推出的 class 語法,其本質上是基於原型的語法糖。文章從建構函式概念出發,對比其與 class 的 constructor 差異,透過實際程式碼驗證 class 內部方法屬於原型物件。說明 class 作為 function 的特性以及其不會被提升的重要區別。
2026/02/24
本文探討 JavaScript 中的原型 (prototype) 與原型鏈 (prototype chain),解釋物件如何從原型繼承屬性與方法,以及屬性查找機制。說明建構函式 與 new 如何利用原型建立共用方法,達到程式碼重用與節省記憶體的效果。
2026/02/24
本文探討 JavaScript 中的原型 (prototype) 與原型鏈 (prototype chain),解釋物件如何從原型繼承屬性與方法,以及屬性查找機制。說明建構函式 與 new 如何利用原型建立共用方法,達到程式碼重用與節省記憶體的效果。
看更多
你可能也想看
Thumbnail
本篇文章介紹 MUI(原 Material UI)這個強大的 React UI 元件庫,涵蓋其核心元件、不同產品線、安裝與匯入元件的方式,以及如何在專案中套用樣式與主題。幫助開發者快速建立一致且具有品牌風格的介面。結論將引導讀者瞭解如何進一步自訂 MUI 的樣式主題。
Thumbnail
本篇文章介紹 MUI(原 Material UI)這個強大的 React UI 元件庫,涵蓋其核心元件、不同產品線、安裝與匯入元件的方式,以及如何在專案中套用樣式與主題。幫助開發者快速建立一致且具有品牌風格的介面。結論將引導讀者瞭解如何進一步自訂 MUI 的樣式主題。
Thumbnail
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
React 是開發網頁、手機前端最流行的 JavaScript 套件之一。React 由 Meta 開發。React 並不是一個框架。這是因為它只負責呈現 UI 的元件。不過,React 為 Angular 和 Vue 等框架提供了另一種解決方式,使我們可以與它一起完成覆雜的前端頁面功能。
Thumbnail
React 是開發網頁、手機前端最流行的 JavaScript 套件之一。React 由 Meta 開發。React 並不是一個框架。這是因為它只負責呈現 UI 的元件。不過,React 為 Angular 和 Vue 等框架提供了另一種解決方式,使我們可以與它一起完成覆雜的前端頁面功能。
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
Thumbnail
Zustand是什麼?React前端狀態管理 分別講解狀態管理以及Zustand 是什麼?接續下來講解Zustand用法以及Context以及Redux的比較。
Thumbnail
Zustand是什麼?React前端狀態管理 分別講解狀態管理以及Zustand 是什麼?接續下來講解Zustand用法以及Context以及Redux的比較。
Thumbnail
接續上一篇,navbar元件其實寫的不是很好,還不能說是可真正reuse,我們把程式改成這樣,透過props傳入navbar的items,定義好navbar title, li的href/name/active等等,就可以達到navbar元件無須改code就能重用的目的! Navbar 元件中用m
Thumbnail
接續上一篇,navbar元件其實寫的不是很好,還不能說是可真正reuse,我們把程式改成這樣,透過props傳入navbar的items,定義好navbar title, li的href/name/active等等,就可以達到navbar元件無須改code就能重用的目的! Navbar 元件中用m
Thumbnail
本文章目的是希望可以用最簡單的範例,來讓大家了解React到底是什麼東西,有什麼好處,並且套用bootstrap的navbar,加上自己客製的css,來達到component重用的目的! 用React來開發網頁,必須把目標拆解成一個個component,最後組合起來就成為一個網站! 假如我們目標是要
Thumbnail
本文章目的是希望可以用最簡單的範例,來讓大家了解React到底是什麼東西,有什麼好處,並且套用bootstrap的navbar,加上自己客製的css,來達到component重用的目的! 用React來開發網頁,必須把目標拆解成一個個component,最後組合起來就成為一個網站! 假如我們目標是要
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News