在現代行動應用程式的開發中,工程團隊經常面臨一個兩難:原生開發(Native Development)能提供極致的流暢度與使用者體驗,但其發布週期受限於 Apple App Store 與 Google Play Store 的審核機制,導致迭代速度緩慢;而 Web 技術則能實現即時更新,卻常被詬病為缺乏質感且反應遲鈍。Uber Eats 的資深主任工程師 Nick DiStefano 在 QCon 演講中分享了他們如何將複雜的 Feed 頁面從傳統原生架構遷移至一種「由原生驅動的單頁 Webview(Native-driven, Single-page WebView)」架構,旨在打破發布週期的限制,同時保留原生的操作感。
背景與遷移動機
Uber Eats 的應用程式規模龐大,擁有數百個頁面與數千項監控指標,由數百名開發者維護。在傳統的原生開發模式下,任何微小的 UI 調整或實驗功能都需要經過完整的二進位檔(Binary)編譯與商店審核。對於追求快速實驗與配置能力的執行團隊而言,這種依賴於第三方平台的發布節奏成了開發瓶頸。
雖然業界曾嘗試過伺服器驅動 UI(Server-Driven UI, SDUI),即由後端定義佈局組件(如樂高積木)再由 App 渲染,但當設計需求變得複雜時,SDUI 的定義語言(DSL)會變得越來越像 HTML。此外,Uber 發現他們在 Android、iOS 之外,還需要維護 ubereats.com 網站以及整合在 Uber 主程式中的 Web 體驗。為了避免重複開發三套邏輯,且不再讓 Web 端成為功能的「二等公民」,團隊決定嘗試將核心頁面遷移至 Webview。
核心技術實作:原生驅動的 Webview 架構
Uber Eats 並非簡單地將網站嵌入 App,而是建構了一套高度整合的混合架構。其核心在於將 Webview 視為頁面內容的容器,而外層的導航欄(Nav Bar)與轉場動畫則由原生層控制。
為了消除 Webview 的違和感,團隊重點解決了以下關鍵組件:
身分驗證與無縫銜接(Authentication):使用者在原生 App 中已登入,不能在進入 Webview 頁面時再次看到登入畫面。團隊開發了一套基於 Cookie 的解決方案,透過原生端將 OAuth 令牌(Token)交換為 Cookie,在 Webview 載入前完成身份同步。
訊息橋接機制(Message Bridge):這是最複雜的部分。為了讓 Web 頁面能觸發原生功能(如顯示底層彈窗 Bottom Sheet 或觸發原生通知),團隊建立了一個通用的能力橋接層。他們避免為每個功能建立專屬 API,而是定義「能力(Capabilities)」,例如將特定動作轉化為通用的「顯示彈窗」指令,以降低維護成本並解決版本相容性問題。
原生載入體驗(Loading Experience):為了避免 Webview 載入時出現白屏,團隊設計了原生啟動畫面(Splash Screen)與漸進式載入流程。當 Web 內容準備就緒後,透過訊息橋接通知原生層隱藏啟動畫面,實現視覺上的平滑過渡。
後端渲染與狀態管理:為了降低延遲並優化 SEO,Uber 採用伺服器端渲染(SSR),並使用 Go 語言的 Temple 庫來生成 HTML 模板。同時,團隊極力將業務邏輯與狀態(State)移至後端,使前端僅作為呈現層,減少對原生橋接的依賴。
遷移過程中的挑戰與限制
大規模遷移 UI 框架最困難的不是技術原型,而是對既有複雜度的對齊。Uber Eats 採取了「先攻堅複雜頁面」的策略,選擇最需要頻繁實驗的 Home Feed 作為切入點。
在執行過程中,團隊發現僅靠開發者自測不足以應對大規模用戶的邊緣案例(Edge Cases)。他們與手動 QA 團隊合作,建立了一套詳盡的規格庫,涵蓋 UI 交互、載入順序(例如廣告與內容的載入順序會影響點擊率)、以及數以千計的分析事件(Analytics Events)。如果分析指標在遷移後出現偏差,會直接影響數據科學團隊的決策,因此確保數據一致性被視為遷移成功的最高標準。
此外,平台方的限制依然存在。例如 iOS 的 Cookie 儲存機制在冷啟動時有未公開的行為,而 Android 的 Webview SDK 版本並不隨 OS 更新,可能導致部分設備版本不匹配。這些問題要求團隊必須與 Apple 和 Google 的工程團隊保持密切溝通,而非完全脫離原生生態。
實務意義與總結
Uber Eats 的這次遷移證明了:只要維持「一頁一 Webview」的原則,並保留原生外殼(Native Shell),就能在享受 Web 即時更新能力的同時,維持原生的轉場體驗與故事感。
這套方案的成功關鍵在於將客戶端「薄層化」。如果一個團隊的狀態管理過多地留在客戶端,頻繁的橋接將導致架構變得脆弱且難以維護。只有當後端能驅動大部分的呈現邏輯時,遷移至 Webview 才能帶來真正的開發效率提升。
對於考慮類似路徑的團隊,其核心建議在於:不要試圖一次性遷移所有頁面,而應建立一套標準化的監控、驗證與橋接庫,將 Webview 視為一種可配置的 UI 能力,而非單純的網頁嵌入。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。