看懂訂閱生命週期
主畫面與第二 Console subscriber 都能接住 snapshot,並且可獨立 unsubscribe。
CHAPTER 24 · 240 MINUTES
本章共 240 分鐘:課次 24 用 memory adapter 建立即時資料模型,課次 25 前 60 分鐘追蹤 adapter、模擬訂閱失敗與復原;全程不冒充真 Firebase。
LEARNING GOALS
主畫面與第二 Console subscriber 都能接住 snapshot,並且可獨立 unsubscribe。
實際看到 subscribe、notify、push 與 unsubscribe 順序,不再靠猜。
失敗時保留舊留言且不留幽靈 listener,retry 後回到正常更新。
輸入:第 23 章產物:完成可驗證、提交並顯示結果的聯絡表單
本章輸出:完成可追蹤、可取消、可模擬訂閱失敗並重試的 memory adapter 即時留言原型,不冒充 Firebase
產物類型:prototype;後續用途:第 25 章
PROBLEM & ANALOGY
第 23 章是寄出一次後等結果;本章像訂閱共同白板,資料來源一變就通知所有同一個 adapter 的 subscriber。
本章要解決:訂閱可能重複、snapshot 可能為空、留言可能含惡意標籤;每一層都要有明確責任。
名稱邊界:標準 solution 使用 memory adapter 練習 Firebase 介面責任,不是原生 WebSocket 教學,也不冒充已連線 Firebase。
SCOPE
ref、onValue、snapshot、push、unsubscribe 與安全 DOM 渲染。
Firebase Web app config、Realtime Database 與最小權限 Rules。
原生 WebSocket 協定、正式 Rules 架構與大規模資料查詢。
CORE IDEAS
DEBUGGING & SECURITY
課堂刻意錯誤:重複 subscribe 未取消;或 addMessage 先 append、callback 又 render;再輸入 <img src=x onerror=alert(1)> 驗證 XSS。
createElement()、textContent 建立;任何 innerHTML 直接退件。先查:看 trace 與 listener 數量,確認舊 subscriber 有 unsubscribe。
先查:檢查留言節點用 createElement 與 textContent,禁止 innerHTML。
先查:確認失敗保留舊資料,恢復後由 snapshot 重畫。
PRACTICE CONTRACT
檔案:script.js
位置:依任務文字搜尋對應元素或函式
結果:主畫面 subscriber 收到初始 snapshot,trace 顯示 subscribe 與 notify
檔案:script.js
位置:依任務文字搜尋對應元素或函式
結果:留言以純文字渲染,Console subscriber 可訂閱並可 unsubscribe
檔案:script.js
位置:依任務文字搜尋對應元素或函式
結果:失敗時保留舊留言且無幽靈 listener,retry 後畫面與 Console subscriber 同時收到新 snapshot
EVIDENCE
主畫面由 ______ 訂閱;更新經過 ______;取消時呼叫 ______;留言用 ______ 防止 HTML。
標準證據只證明 adapter 介面責任;真 Firebase 需另有 database、Rules 與 Network 證據。
標準證據:同一頁的主畫面與 Console subscriber 都收到更新;取消 Console 後只剩畫面收到。主畫面訂閱失敗時留言不消失,trace 證明沒有幽靈 listener,retry 後才恢復新增。這些只證明 memory adapter 介面。
Live 延伸另驗:Firebase 帳號、project、Web app config、Realtime Database、Rules/Emulator、Network 與同一路徑雙視窗證據。
下一章:加入「現在是誰」與 owner uid 權限判斷。