Vite 打包的大坑:為什麼測試環境 staging 默默變成了 production ?

當我們在開發前端專案時,常常會遇到明明在本地開發測試都好好的,但一打包部署到測試環境( staging ),某些功能就莫名其妙失蹤的靈異事件!

這次苦主遇到的狀況是:使用 pnpm build:staging 指令打包後,左側導覽列的「管理員選單( isAdmin )」居然直接蒸發了!

經過一番鍵盤柯南式的徹查,終於抓到幕後黑手,原來是我們自以為很懂的 Vite 在搞鬼。


🔍 案發現場:為什麼選單不見了?

在原本的程式碼中,開發者用了 import.meta.env.PROD 來做判斷。心裡想著:「開發環境( dev )是 false ,測試環境( staging )應該也是 false ,只有真正的正式環境( production )才會是 true 吧?」

結果 Vite 表示:「你想得美!」

我們來看看 Vite 在不同指令下的真實真面目:

執行的指令MODE 變數PROD 變數( 關鍵在這裡 )導致的後果
vite (dev)developmentfalse順利繞過檢查,選單正常顯示。
vite build –mode stagingstagingtrue 🚨誤判為正式環境,跑去呼叫真實 API 檢查,結果因為 IP 不對直接被拒絕,選單慘遭隱形。
vite buildproductiontrue正常的正式環境流程。

破案關鍵:在 Vite 的世界裡,只要你執行了 vite build 這個打包指令,不管後面帶的 –mode 是什麼,它都會偷偷把 NODE_ENV 設定為 production 。因此, import.meta.env.PROD 在測試環境下也會被無情地判定為 true !


🛠️ 拯救選單:動手修正它

既然知道了 Vite 的脾氣,修正的方法就很簡單了。我們不要再相信傲嬌的 PROD 變數,直接去檢查 MODE 的名字是不是叫做 production 就好了!

程式碼改動

請把原本的防禦邏輯修改如下:

JavaScript

// ❌ 原本的寫法( 會誤判測試環境 )
if (!import.meta.env.PROD) { ... }

//  修正後的寫法( 精準識別是不是真的正式環境 )
if (import.meta.env.MODE !== 'production') { ... }

同時,別忘了同步更新專案的 README.md 說明文件,讓未來的自己或其他同事不會再踩進同一個坑裡。


🎉 修正後的快樂結局

改用 import.meta.env.MODE 來把關之後,判斷邏輯就變得非常聽話了:

  • pnpm run dev 👉 模式為 development 👉 順利放行,直接顯示選單!
  • pnpm run build:staging 👉 模式為 staging 👉 順利放行,直接顯示選單!
  • pnpm run build 👉 模式為 production 👉 嚴格把關,呼叫 API 檢查!

現在重新執行 pnpm build:staging 打包,那個令人朝思暮想的管理員選單終於乖乖下凡,回歸到它該出現的地方囉!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *