:用 `@rrweb/rrweb-plugin-sequential-id-record` 為錄制事件打上連續(xù)編號)
rrweb 事件順序 ID 插件實戰(zhàn)用rrweb/rrweb-plugin-sequential-id-record為錄制事件打上連續(xù)編號【免費下載鏈接】rrwebrecord and replay the web項目地址: https://gitcode.com/gh_mirrors/rr/rrweb本文介紹 rrweb 官方插件rrweb/rrweb-plugin-sequential-id-record順序 ID 錄制插件的安裝、配置與底層原理。它通過與rrweb/rrweb-plugin-sequential-id-replay配合使用為錄制階段產(chǎn)出的每一個事件附加一個從 1 開始遞增的序號并在回放階段校驗事件順序是否完整、是否發(fā)生丟幀或亂序。讀完本文你將掌握如何為事件流添加穩(wěn)定的順序標識、如何在回放端做一致性校驗以及該機制在事件關(guān)聯(lián)與調(diào)試中的典型用法。插件定位與回放端插件成對使用rrweb 的錄制與回放默認依賴事件內(nèi)的timestamp來排序與驅(qū)動時間軸但時間戳并非嚴格單調(diào)且無法直接表達“事件流中第 N 個事件”這一語義。順序 ID 插件正是為解決這一問題而生錄制端本文主角在每個事件被 emit 之前往事件對象上寫入一個全局遞增的整數(shù) ID回放端讀取該 ID檢查事件到達順序是否為 1、2、3…… 的連續(xù)遞增序列一旦發(fā)現(xiàn)跳躍、重復或缺失立即在控制臺輸出錯誤信息。官方文檔明確要求兩個插件“成對使用”詳見 rrweb/rrweb-plugin-sequential-id-replay 的 README。完整的 rrweb 使用說明見倉庫根目錄的 guide.md插件的通用機制RecordPlugin/ReplayPlugin接口見 插件 API 文檔。安裝與 rrweb 其它插件一樣通過 npm 安裝即可npm install rrweb/rrweb-plugin-sequential-id-record從 package.json 可以看到該包要求rrweb ^2.1.1作為 peerDependency同時聲明了 UMDmain/unpkg/jsdelivr與 ESMmodule兩種產(chǎn)物因此既適合打包器內(nèi)的import使用也適合 CDN 直接引入。配套的回放插件需要單獨安裝npm install rrweb/rrweb-plugin-sequential-id-replay基本用法在 record 配置中掛載插件在錄制端通過record的plugins配置項將插件注入事件處理管線import { record } from rrweb/record; import { getRecordSequentialIdPlugin } from rrweb/rrweb-plugin-sequential-id-record; record({ emit: function emit(event) { // 將事件發(fā)送到服務端 }, plugins: [ getRecordSequentialIdPlugin({ key: _sid, // 默認值 }), ], });要點說明record的plugins選項在 guide.md 中有官方定義默認值為[]用于“l(fā)oad plugins to provide extended record functions”getRecordSequentialIdPlugin是工廠函數(shù)調(diào)用后返回一個RecordPlugin實例示例中的key參數(shù)可以省略因為_sid就是它的默認值。生成的插件名與事件形態(tài)插件內(nèi)部聲明了固定的插件名常量PLUGIN_NAME rrweb/sequential-id1見 src/index.ts。插件本身不產(chǎn)生EventType.Plugin類型的獨立事件而是通過eventProcessor對每一個即將 emit 的事件原地改寫向事件對象上寫入{ [_options.key]: id }id 從 1 開始、每次自增。因此一個典型事件的最終形態(tài)類似于{ type: 3, // IncrementalSnapshot timestamp: 1690000000000, data: { /* ...原始增量數(shù)據(jù)... */ }, _sid: 42, // 插件寫入的順序 ID }由于eventProcessor對所有類型的事件FullSnapshot、Meta、IncrementalSnapshot、Custom 等統(tǒng)一生效因此整條事件流中的每個事件都能拿到唯一的順序編號。源碼級原理eventProcessor 注入鏈要理解該插件為什么能“給所有事件加 ID”需要看 rrweb 錄制端的事件處理管線。record/index.ts 中定義了內(nèi)部eventProcessorconst eventProcessor (e: eventWithTime): T { for (const plugin of plugins || []) { if (plugin.eventProcessor) { e plugin.eventProcessor(e); } } // ...packFn 等后續(xù)處理 return e; };所有事件在 emit 之前都會依次經(jīng)過每個插件注冊的eventProcessorRecordPlugin接口定義在 packages/types/src/index.ts 的RecordPlugin類型中。順序 ID 插件正是利用這一點在eventProcessor回調(diào)里執(zhí)行Object.assign(event, { [_options.key]: id })實現(xiàn)零侵入地為事件流注入連續(xù)編號。值得注意的實現(xiàn)細節(jié)工廠函數(shù)內(nèi)部用Object.assign({}, defaultOptions, options)合并默認值因此傳入{ key: myId }時只會覆蓋key其它默認行為不受影響計數(shù)器id是工廠函數(shù)閉包內(nèi)的局部變量隨插件實例創(chuàng)建而復位為 0——這意味著每次調(diào)用record()開啟新的錄制會話時順序 ID 都會從 1 重新開始同一會話內(nèi)才保證單調(diào)遞增插件名rrweb/sequential-id1中的版本號后綴1遵循 rrweb 插件命名約定便于未來以帶版本的方式兼容演進?;胤哦伺涮仔r烅樞蛞恢滦缘氖亻T員錄制端負責“打 ID”回放端則負責“查 ID”。配套插件rrweb/rrweb-plugin-sequential-id-replay的使用方式如下其完整 README 見 packages/plugins/rrweb-plugin-sequential-id-replay/README.mdimport { Replayer } from rrweb/replay; import { getReplaySequentialIdPlugin } from rrweb/rrweb-plugin-sequential-id-replay; const replayer new Replayer(events, { plugins: [ getReplaySequentialIdPlugin({ // 必須與錄制端保持一致 key: _sid, // 默認值 warnOnMissingId: true, // 默認值 }), ], }); replayer.play(); // ERROR: [sequential-id-plugin]: expect to get an id with value 42, but got 666回放端插件的行為邏輯見 rrweb-plugin-sequential-id-replay/src/index.ts維護一個內(nèi)部計數(shù)器currentId初始值為 1對每個事件先檢查key是否存在于事件上存在比較事件攜帶的 ID 與期望值currentId。相等則currentId不相等則輸出console.error錯誤格式為[sequential-id-plugin]: expect to get an id with value 期望值, but got 實際值——這正是官方示例中replayer.play()后出現(xiàn)的報錯來源不存在若warnOnMissingId為true默認值輸出console.warn[sequential-id-plugin]: failed to get id in key: key。回放端插件是通過ReplayPlugin的handler掛載到事件回放流程中的handler的調(diào)用點位于 replay/index.ts 中CAST_EVENT狀態(tài)機投遞事件之前。也就是說校驗發(fā)生在事件被真正應用到 DOM 之前一旦 ID 序列斷裂能第一時間在控制臺暴露問題。配置參數(shù)一覽參數(shù)默認值插件端說明key_sid錄制端 回放端事件上存放順序 ID 的字段名兩端必須一致warnOnMissingIdtrue僅回放端事件上找不到key字段時是否輸出警告關(guān)于默認值的補充說明錄制端默認key為_sid見 record 插件源碼 中defaultOptions回放端默認key同樣為_sid見 replay 插件源碼 中defaultOptions。在配置時強烈建議顯式指定與錄制端完全相同的key值避免因文檔示例與默認值不一致造成兩端錯位例如錄制端寫入了_sid回放端卻在讀_id結(jié)果每個事件都觸發(fā)failed to get id in key的警告。典型應用場景從插件的能力邊界出發(fā)它適合以下場景事件與業(yè)務日志的精確關(guān)聯(lián)當事件經(jīng)由服務端存儲、再按需拉取回放時可借助順序 ID 把回放中的每一個事件與后端日志、錯誤堆棧、埋點數(shù)據(jù)一一對上號定位“回放到第幾步出問題”回放完整性與丟幀檢測事件在傳輸、壓縮或存儲過程中若發(fā)生缺失/亂序例如 WebSocket 斷線重連、事件分批落庫后再合并回放端插件的連續(xù)性校驗會立即報錯幫助你發(fā)現(xiàn)數(shù)據(jù)管道的問題調(diào)試錄制鏈路在開發(fā)自定義插件或修改事件流時順序 ID 提供了一種低成本的事件計數(shù)手段可以快速確認每個事件是否都經(jīng)過了預期的處理管線。需要說明的是該插件只負責“編號 校驗”不參與事件的時間軸調(diào)度——回放推進仍由timestamp驅(qū)動順序 ID 更多承擔的是調(diào)試與一致性保障職責。若需深入了解 rrweb 事件模型與插件開發(fā)可繼續(xù)閱讀 事件機制文檔、插件 API 文檔 以及倉庫根目錄的 guide.md?!久赓M下載鏈接】rrwebrecord and replay the web項目地址: https://gitcode.com/gh_mirrors/rr/rrweb創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考