網易雲音樂 Web 版採用 **單頁應用 (Single Page Application, SPA)** 架構。頁面不整頁刷新,音頻播放器組件常駐 DOM,實現「換頁不斷音」。
History API (pushState/replaceState) 或 Hash 模式 (#/playlist/123) 管理「虛擬頁面」狀態,URL 變化不觸發瀏覽器導航。<audio> 元素或封裝的 Player 類掛載在 **App 根組件** 或 **Body 直屬容器**,不隨路由切換銷毀。切歌僅修改 src 屬性。index.html (單一入口)
├── App.vue (根組件,生命週期最長)
│ ├── <audio-player ref="player" /> ← 常駐,不銷毀
│ ├── <router-view /> ← 路由出口,切換子頁面
│ │ ├── HomeView
│ │ ├── PlaylistView
│ │ ├── SearchView
│ │ └── UserProfileView
│ └── Store (Vuex) ← 全域狀態:currentSong, playlist, playing
create-react-app / vue create + react-router / vue-router + 狀態庫。HTMLAudioElement 類,暴露 play(src), pause(), onEnded 事件,掛載全域 (Context/Store/Window)。SPA 原理、History vs Hash 模式優劣、前端路由實現、音頻預載入策略、PWA 實戰。