我的網頁遊戲在電腦上正常,到了手機卻壞掉:我踩到的部署陷阱

我把一款網頁遊戲上線了。

在自己的電腦上可以正常執行。GitHub 裡已經是修正後的程式碼。部署流程也顯示成功。

但在部分手機上,遊戲還是壞了。

Analytics 留下的錯誤是:

SyntaxError: Unexpected token '<'

我明明是在寫 JavaScript,為什麼突然冒出一個「<」?

這是我在製作網頁遊戲 ORA Quest 時真的遇到的問題。最後最有價值的,不是某一行神奇修正,而是弄懂這個錯誤到底想告訴我什麼。

真正的問題,可能根本不是「<」

一開始我以為是 JavaScript 語法錯誤。是不是混進奇怪字元?JSON 壞掉?少了一個逗號?

但碰到 Unexpected token '<' 時,很值得先確認一件事:瀏覽器原本要抓 JavaScript 或 JSON,伺服器是不是卻回傳了 HTML。

例如瀏覽器要求 game.js,理論上應該拿到 JavaScript。可是伺服器實際回傳的是從 <!DOCTYPE html> 開始的錯誤頁面。

瀏覽器仍然把它當 JavaScript 解析,碰到第一個 < 就失敗。

也就是說,被罵的那個符號不一定是兇手。真正的問題可能只是瀏覽器拿到了錯的內容。

最麻煩的 Bug,往往不是每個人都會遇到

這正是這次最折磨人的地方。

電腦可以跑。有些手機也可以。但換另一支手機,或是在社群 App 內建瀏覽器裡,就失敗。

這時很容易陷入這種流程:

改程式 → 部署 → 用自己的電腦打開 → 正常 → 以為修好了。

我以前也是這樣確認。

但如果問題跟快取、瀏覽器、舊資源或某個特定請求路徑有關,開發者自己的電腦反而可能給你一個「已經沒事」的假象。

現在再遇到,我會先檢查這 5 件事

  1. 直接打開出錯的 JS 或 JSON URL。
  2. 確認回傳內容真的是 JavaScript 或 JSON。
  3. 看看是不是其實回傳了 404、登入頁、WordPress 頁面或其他 HTML。
  4. 確認正式環境伺服器提供的檔案,跟 GitHub 裡預期的版本一致。
  5. 換裝置、換瀏覽器,盡量排除同一份快取後再測。

第一步尤其重要。

與其看到「JavaScript 錯誤」就一直改 JavaScript,不如先問一個更簡單的問題:

這個 URL 實際回傳了什麼?

光是這一點,就能省掉很多改錯地方的時間。

GitHub 正確,不代表正式環境就一定正確

這也是我這次被狠狠上了一課的地方。

GitHub 裡的程式碼可以完全正確,但使用者拿到的東西仍然可能不一樣。

中間還有自動部署、主機、WordPress、伺服器或 CDN 快取、瀏覽器快取,以及 App 內建瀏覽器等好幾層。

只要其中一層還在送舊檔案或意外內容,就會出現「我明明已經修了,為什麼使用者那邊還是壞的?」

所以我現在對「修好了」的定義改變了。

不是 commit 正確就算修好,而是正式環境的真實 URL,在接近真實使用者的條件下也能正常運作,才算結束。

別只想把錯誤消掉,還要讓下一次更容易查

以前一出錯,我只想趕快讓它消失。

現在我還會想:如果同樣的問題再出現,我能不能更快知道原因?

是哪個檔案失敗?請求的是哪個 URL?使用者是什麼環境?跑的是哪個 build?

有了這些資訊,下次就不會只是「同一個怪錯又來了」,而是能判斷「跟上次是不是同一個原因」。

一個人做產品,常常不是在寫程式,而是在弄懂到底發生了什麼

開始做網頁遊戲以前,我以為開發主要是做角色、寫故事、寫程式。

真正做起來後,大量時間其實花在這些問題上:為什麼只有這台裝置不行?為什麼昨天的 JavaScript 還在?為什麼 JSON 網址回傳的是 HTML?

每弄懂一個問題,我下一次能做的東西就多一點。

這次 Unexpected token '<' 留給我最大的教訓很簡單:

「我寫下的程式碼」和「使用者實際收到的檔案」,不一定是同一件事。

如果你現在也被這個錯誤卡住,先別急著重寫 JavaScript。直接打開那個出錯的 JS 或 JSON URL。要是看到 HTML,那已經是很重要的線索。

我正一邊踩這些坑,一邊製作 ORA Quest。如果你想看看這些除錯最後變成了什麼,可以免費試玩 ORA Quest。

コメント