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

更新 發佈閱讀 4 分鐘

最近將 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 這些語言設定就不會被伺服器阻擋。

3. 資源路徑錯誤

即使我新增了這個檔案卻還是會出現 404 的問題,因為:

  • 這時候瀏覽器已經拿到 index.html,頁面開始渲染
  • js/css/img 等資源會依照當前網址的「基準路徑」去抓資料。
    (例如瀏覽器在 /en時會去/en/assets 找資源)
  • 最後的結果也是 404。

要解決這個問題,需要修改 vite.config.js 的配置:

export default defineConfig({
  base: "./", // 新增這行
  plugins: [react()],
})

把 base 改成 './' 會讓 vite build 後使用相對路徑,也就是所有資源都會從 ./assets 這邊找,而不是去 /en/assets/zh/assets

總結

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

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

參考

  1. 解决vercel部署的前端项目刷新后出现404的问题
  2. Rewrite to index.html ignored for React + Vite SPA (404 on routes)
留言
avatar-img
Elaine 粼粼的林林總總
7會員
35內容數
不定期地分享程式/旅遊/學習/閱讀或各式各樣的文章,如果對我的分享有興趣,歡迎來找我玩~
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
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
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