如何修正網頁 App 出現的空白白頁
空白白頁幾乎總是代表兩種情況之一:App 的 JavaScript 在繪製任何東西之前就當機了,或是 JavaScript 根本沒有載入。請開啟瀏覽器主控台(右鍵 → 檢查 → Console),閱讀第一則紅色錯誤,然後檢查 Network 分頁中載入失敗的檔案。大多數原因是缺少環境變數、基礎路徑錯誤、建置未完成,或是某個元件當機。
本指南涵蓋以 React、Vue 或類似框架建置的單頁應用程式(包括 AI 建置工具製作的 App),這類 App 最常出現空白頁面。
為什麼頁面是白的
現代的單頁應用程式(SPA)會傳送給瀏覽器一個幾乎是空的 HTML 檔案,大致如下:
<body>
<div id="root"></div>
<script type="module" src="/assets/index-a1b2c3.js"></script>
</body>
接著 JavaScript 會在那個空的 div 中建置整個頁面。如果腳本載入失敗,或在渲染之前就拋出錯誤,div 就會保持空白,你看到的就是白色。這個頁面並不是以可見的方式「壞掉」,它只是從來沒有被繪製出來。
因此,修正工作總是從開發者工具開始,而不是從頁面本身開始。
步驟一:閱讀主控台
開啟開發者工具:在頁面上按右鍵並選擇檢查,或按 F12(Mac 上為 Cmd+Option+I)。切換到 Console(主控台)分頁,然後重新載入頁面。
請看第一則紅色錯誤;後面的錯誤通常只是附帶影響。錯誤的內容會指出原因:
| 主控台訊息(典型用語) | 代表的意思 | 前往 |
|---|---|---|
Cannot read properties of undefined (reading '...') | 程式碼預期的資料不存在 | 步驟四 |
... is not defined / ... is not a function | 缺少匯入、變數或設定 | 步驟四或步驟三 |
Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html" | 某個腳本的網址回傳的是 HTML 頁面,而不是 JavaScript | 步驟二 |
Uncaught SyntaxError: Unexpected token '<' | 同樣的問題:預期是 JavaScript,卻收到 HTML | 步驟二 |
supabaseUrl is required、Missing API key 或類似訊息 | 某個環境變數是空的 | 步驟三 |
Access to fetch ... has been blocked by CORS policy | 送往其他網域的請求被阻擋 | 參考如何修正 CORS 錯誤 |
| 完全沒有錯誤 | 渲染有執行,但沒有顯示任何東西,或被 CSS 隱藏 | 步驟六 |
請複製完整的錯誤文字,包括檔名與行號。如果你使用的是 AI 建置工具,直接把它貼到對話中。
步驟二:檢查檔案是否載入成功
開啟 Network 分頁,勾選 Disable cache(停用快取),然後重新載入。查看 .js 與 .css 檔案的請求。
- JavaScript 檔案的狀態為 404:頁面正在請求伺服器上不存在的檔案。
- 狀態為 200,但類型是
text/html:伺服器回傳了一個頁面(通常是index.html本身,因為 SPA 後備規則),而不是腳本。根本原因相同:檔案不在頁面預期的位置。
常見原因:
基礎路徑錯誤。 如果 App 是由子資料夾提供,例如 example.com/app/,但建置時卻設定為從 /assets/... 載入檔案,那麼每個腳本請求都會找不到。在 Vite 中,這是 vite.config 中的 base 選項;在 Create React App 中是 homepage 欄位;在 Next.js 中是 basePath。它必須與 App 實際提供服務的位置相符。
過時的 index.html。 建置工具會為檔案加上內容雜湊的名稱,例如 index-a1b2c3.js。新的部署之後,舊檔案就不見了。如果瀏覽器或 CDN 仍快取著舊的 index.html,它就會請求舊檔案而拿不到任何東西。強制重新整理(Cmd+Shift+R 或 Ctrl+Shift+R)可以確認這一點。長期的解決方法是:為 index.html 提供短時效或不快取的標頭,而帶有雜湊的檔案則長期快取。
建置未完成或未部署。 如果建置失敗,主機可能提供的是舊的或空的輸出資料夾。請查看建置記錄中的錯誤。
發佈了錯誤的資料夾。 主機必須提供建置輸出(通常是 dist 或 build),而不是專案的原始碼資料夾。若提供原始碼,得到的 index.html 會指向 /src/main.tsx,而瀏覽器無法執行它。
步驟三:檢查環境變數
前端 App 通常會在建置時讀取 API 網址或公開金鑰等設定。如果正式環境的建置缺少某個變數,像 createClient(undefined, undefined) 這樣的程式碼會立即拋出錯誤,頁面就會變成白色。
需要知道的事項:
- 在 Vite 中,只有以
VITE_開頭的變數可以在瀏覽器程式碼中使用,讀取方式為import.meta.env.VITE_NAME。在 Create React App 中是REACT_APP_;在 Next.js 中是NEXT_PUBLIC_。 - 這些值是在 App 建置時就寫入的。在建置之後才新增變數,必須重新建置並重新部署才會生效。
- 預覽環境或你的本機可能有一個
.env檔案,但正式環境的建置並沒有。請在主機上設定相同的變數。 - 帶有上述前綴的任何東西,最後都會進入公開的 JavaScript。只放公開的值,絕不要放密鑰。
快速測試方法:在主控台錯誤中搜尋設定名稱附近的 undefined,或直接詢問:
已發佈的 App 顯示空白頁。請列出前端讀取的每一個環境變數,檢查正式環境的建置中哪些缺少或為空,並在缺少時讓 App 顯示清楚的錯誤訊息,而不是空白頁。
步驟四:修正當機
如果主控台顯示一般的 JavaScript 錯誤,代表程式碼在渲染時當機了。AI 建置的 App 中典型的原因包括:
- 資料尚未載入。 元件在
user抵達之前就讀取user.name。解決方法是加入載入狀態,或使用可選串連(user?.name)。 - 資料為空。 新帳號沒有任何記錄,但程式碼假設列表至少有一個項目。
- 資料格式非預期。 API 回傳了錯誤物件,而不是程式碼預期的列表。
- 缺少匯入。 檔案被重新命名或移動之後。
- 在伺服器端渲染時使用只存在於瀏覽器的 API,例如在 Next.js 伺服器元件中使用
window或localStorage。
把完整錯誤、頁面,以及你當時登入的是哪個帳號,一併提供給 AI:
新使用者的 Dashboard 頁面是空白的。主控台:
TypeError: Cannot read properties of undefined (reading 'map'),位於ProjectList.tsx:18。我的帳號有專案,所以是正常的。請修正它,讓空帳號顯示「尚無專案」,並在預覽中測試一個新帳號。
步驟五:加入錯誤邊界
在 React 中,一個當機的元件可能讓整個 App 被卸載,這就是為什麼一個小小的錯誤會產生完全空白的頁面。錯誤邊界是一個元件,會攔截其下方的渲染錯誤,並改為顯示備用畫面。
在主要路由外圍加入錯誤邊界,顯示「發生錯誤」訊息與一個重新載入按鈕,並把錯誤記錄到主控台。讓標頭與導覽列位於它的外部,這樣它們仍然能夠渲染。
它不會修正錯誤本身,但訪客會看到一則訊息,而不是空白畫面,你也能看出是哪裡壞掉了。
步驟六:沒有錯誤,但仍是空白
如果主控台沒有錯誤,腳本也都有載入:
- 檢查 Elements 分頁。
<div id="root">裡面有內容嗎?如果有,代表它有渲染但看不到:白字配白底、opacity: 0、display: none,或是有一個全螢幕元素把它蓋住了。 - 檢查路由器。 如果沒有任何路由符合目前的網址,而且也沒有「找不到」路由,有些路由器就會什麼都不渲染。請加入一個顯示 404 頁面的萬用路由。
- 檢查掛載點。 程式碼必須掛載到一個確實存在的元素上。如果
index.html有id="app",而程式碼卻去尋找root,就什麼都不會出現(而 React 通常會記錄一則錯誤)。 - 檢查瀏覽器擴充功能。 試試無痕視窗。廣告攔截器偶爾會阻擋名稱類似
analytics或ads的腳本。
只有在重新整理頁面後才變成空白?
如果首頁正常,但重新整理 /dashboard 後出現空白頁或 404,代表伺服器不知道要為 App 路由回傳 index.html。這是路由後備規則的問題,請參考如何修正部署後的 404 錯誤。
常見錯誤
- 只讀最後一則錯誤,而不是第一則。 第一行紅色錯誤通常就是原因。
- 設定環境變數後沒有重新建置。 前端的變數是在建置時就固定的。
- 只用自己的帳號測試。 空帳號導致的當機,是最常見的空白頁原因之一。
- 假設部署成功。 在除錯程式碼之前,先檢查建置記錄。
- 把一切都怪到瀏覽器快取。 強制重新整理幾秒鐘就能排除這個可能;如果頁面仍然空白,問題出在別處。
Mythex 中的空白頁
如果預覽是空白的,請先確認 App 正在執行(開啟 Code → terminal),然後請 Mythex 啟動正確的伺服器、按下預覽工具列中的 Refresh(重新整理),或使用 /fix。如果是已發佈網址空白,文件建議等待一分鐘後強制重新整理,確認在發佈前已設定好環境變數與資料庫,並檢查你的主機配額。請記住,已發佈的 App 是一個快照:修正後請重新發佈。如果是某次修改造成的,可在最後一則正常的回覆上使用 Revert to this point(回復到此時點),將專案回復到該狀態。請參考文件中的疑難排解與發佈疑難排解,也可以參考我們的一般指南除錯 AI 建置的 App。
空白頁檢查清單
- 已閱讀主控台中的第一則紅色錯誤
- 已檢查 Network 分頁中回傳 404 或 HTML 的
.js/.css檔案 - 基礎路徑與 App 的提供位置相符
- 建置已完成,且發佈的是建置輸出資料夾
- 所有前端環境變數都已在正式環境的建置中設定,並已重新建置
- 已修正當機,包括空帳號與新帳號的情況
- 已加入錯誤邊界,讓未來的當機會顯示訊息
- 已為未知網址加入萬用路由
- 已在強制重新整理與無痕視窗中測試
常見問題
為什麼我的 React App 顯示空白白頁?
通常是因為 JavaScript 在任何內容渲染之前就當機了,或是 JavaScript 檔案根本沒有載入。開啟瀏覽器主控台,裡面第一則紅色錯誤會告訴你是哪一種情況,以及發生在哪個檔案與哪一行。
為什麼我的 App 在本機運作正常,部署後卻顯示空白頁?
最常見的原因包括:正式環境的建置從未設定環境變數、JavaScript 與 CSS 檔案是從錯誤的路徑請求(基礎路徑不符),以及快取中過時的 index.html 指向已不存在的檔案。
「Failed to load module script」是什麼意思?
瀏覽器請求了一個 JavaScript 檔案,卻拿到一個 HTML 頁面,通常是網站的 index.html 或錯誤頁面。代表檔案路徑錯誤,或檔案在伺服器上不存在,因此請檢查建置輸出與 App 的基礎路徑設定。
如何避免一個錯誤讓整個頁面變成空白?
加入錯誤邊界(error boundary)。在 React 中,錯誤邊界是一個元件,會攔截其下方頁面區塊中的渲染錯誤,並顯示備用訊息,而不是把整個畫面都卸載。