在電腦瀏覽器使用開發者工具模擬手機排版雖然方便,但為了確認實際的觸控體驗與介面比例,今天將《微光採集瓶》放到 iPhone 上進行實機測試。過程中遇到了一些本地連線限制與設定問題,因此改用 ngrok 建立外部測試網址,並針對手機螢幕調整響應式版面(RWD),同時微調深色背景下的文字可讀性。
一開始嘗試透過區網 IP 讓手機連入電腦上的開發伺服器,但連線始終逾時,無法順利開啟網頁。當時推測可能與 Wi-Fi 的 AP 隔離設定、電腦防火牆或防毒軟體的連線限制有關,但沒有進一步確認確切原因。
為了避免花費太多時間排查底層網路設定,我改用 ngrok 將本地開發伺服器公開為外部 HTTPS 網址,讓 iPhone 可以透過 Safari 開啟專案。
1. 設定 Vite 開發伺服器
打開專案根目錄中的 vite.config.js,在 defineConfig 的 server 設定中加入相關參數:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
server: {
host: '0.0.0.0',
port: 5173,
allowedHosts: true
}
})
其中,host: '0.0.0.0' 讓 Vite 監聽所有網路介面,port: 5173 指定開發伺服器使用的埠號,而 allowedHosts: true 則允許所有 Host 網域通過檢查。
需要注意的是,allowedHosts: true 會降低 Host 網域檢查的保護,因此只適合在了解風險的短期測試情境下使用。較安全的方式是只允許實際使用的 ngrok 網域,並在測試結束後停止公開的開發伺服器。
2. 設定 ngrok Token
npx ngrok config add-authtoken 你的Token
這個步驟主要是完成 ngrok 的帳戶驗證設定,首次使用時才需要執行。
3. 啟動 Vite 與 ngrok
npx vite --host 0.0.0.0
5173 埠轉發至外部網址:npx ngrok http 127.0.0.1:5173
這裡假設 Vite 確實運作於 5173 埠。如果該埠已被其他程序佔用,Vite 可能改用其他埠號,此時就必須讓 ngrok 指向實際使用的埠號。
ngrok 啟動後,終端機會顯示 Forwarding 網址。將產生的 HTTPS 網址複製到 iPhone Safari,即可測試手機是否能正常開啟網頁。

在手機瀏覽器上輸入上圖 Forwarding 那串網址就可以看到採集瓶網頁啦~
在使用 ngrok 將本地開發伺服器公開至外部網路的過程中,我遇到了幾個環境設定與連線問題,經過逐步排查後,才順利讓手機瀏覽器正常存取網頁。
1. 防毒軟體攔截
初次執行 ngrok 時,電腦安裝的 Avast 防毒軟體跳出警示,將 ngrok.exe 標記為 Other:PUP-gen [PUP],導致程式無法正常執行。
2. 連接埠設定錯誤(ERR_NGROK_8012)
成功啟動 ngrok 後,使用手機開啟轉發網址時,畫面出現 ERR_NGROK_8012 錯誤,表示 ngrok 無法正常連接到本地端的目標服務。
原因: Vite 預設使用 5173 埠提供開發伺服器服務。當該埠已被其他程序佔用時,Vite 可能自動改用 5174 等其他可用埠號。如果 ngrok 指向的埠號與 Vite 實際使用的埠號不同,就可能造成連線失敗。此外,本機位址設定也可能影響連線結果。
處理方式: 先確認 Vite 終端機顯示的實際網址與埠號,再讓 ngrok 指向相同的服務位置。例如,當 Vite 確實運作於 5173 埠時,可以使用以下指令:
npx ngrok http 127.0.0.1:5173
透過確認兩端的連線設定一致,排除 ngrok 無法連接本地伺服器的問題。
3. Vite 安全機制阻擋(403 Forbidden)
當 ngrok 成功連接本地伺服器後,手機 Safari 載入網頁時仍出現 403 Forbidden 錯誤,並提示需要將 ngrok 網域加入 server.allowedHosts 設定。
原因: Vite 開發伺服器具有 Host 網域檢查機制,用來限制可接受的請求網域,以降低 DNS 重新綁定(DNS Rebinding)等攻擊風險。由於 ngrok 使用的外部網域未列入允許清單,因此請求遭到阻擋。
處理方式: 我在 vite.config.js 的 server 設定中加入 allowedHosts: true,允許外部轉發網址的 Host 請求通過檢查。修改設定後,重新啟動 Vite,再透過 ngrok 網址測試,最後成功在手機上開啟網頁。
不過,這種設定會允許所有 Host 網域,存在一定的安全風險。若要採用較安全的方式,可以將實際使用的 ngrok 網域加入允許清單,而不是開放所有網域。
透過這次排除問題的過程,我不僅熟悉了 ngrok 的基本使用方式,也更了解本地伺服器的連接埠設定、外部網路轉發,以及開發環境安全機制之間的關係。
當網頁成功在 iPhone Safari 開啟後,我進一步觀察手機實際顯示的版面,發現電腦瀏覽器的手機模擬畫面與實機呈現仍有差異,因此針對手機直向螢幕調整了響應式版面。
這次調整主要著重在整體垂直配置,重新調整標題、搜尋欄、採集瓶、色盤、提示文字與採集按鈕等元素的位置與間距,讓主要操作區域在手機畫面中呈現得更協調。
此外,版面也運用了以下 CSS 設定:
100dvh: 配合手機瀏覽器動態變化的可視高度,減少網址列顯示或收合時造成的高度差異。env(safe-area-inset-top) 與 env(safe-area-inset-bottom): 配合裝置安全區域,避免內容過度貼近瀏海或底部手勢操作區。完成版面調整後,我發現部分文字在深色背景下仍然偏暗,尤其是輔助文字、輸入框提示,以及停用狀態的按鈕,辨識度不太理想。
因此,我提高了幾個區塊的文字明度與不透明度,讓文字在深色背景下更容易閱讀:
.btn-nav-action: 調整為 rgba(255, 255, 255, 0.85)。.filter-bar: 調整為 rgba(255, 255, 255, 0.8)。.btn-reset-filter: 調整為 rgba(255, 255, 255, 0.8)。.selected-label: 調整為 #cbd5e1。.btn-edit-inline: 調整為 rgba(255, 255, 255, 0.8)。.note-input::placeholder: 調整為 rgba(255, 255, 255, 0.85)。.btn-collect.btn-disabled: 調整文字顏色為 rgba(255, 255, 255, 0.85),並同步調整邊框顏色與文字陰影。此外,我也調整了停用狀態輸入框的透明度設定,避免提示文字因為整體透明度而變得難以辨識。
完成 ngrok 轉發、Vite 設定與手機版面調整後,我成功使用 iPhone Safari 開啟《微光採集瓶》,並實際觀察採集頁面在手機螢幕上的顯示效果。
與原本的畫面相比,調整後的版面重新分配了主要內容的垂直位置與間距,並提高深色背景下的文字辨識度,讓整體介面更符合手機直向瀏覽的使用情境。
成果截圖:


明天(Day 30)將迎來鐵人賽的最後一天!我們將把《微光採集瓶》部署至正式的網頁託管平台,讓大家能透過公開網址體驗這個專案。同時,也會整理這 30 天的實作成果,分享開發過程中的收穫、遇到的挑戰,以及未來可能延伸的方向,為這段開發旅程畫下句點。