DevTools 擴充功能
主控台旁的 Text.js 面板:元件樹、儲存格層級的影格檢查工具與影格時間軸。
Text.js DevTools 擴充功能會在主控台旁新增 Text.js 面板,用來檢查正在主控台中渲染的應用程式。
- 元件:每個主控台根節點的 React 樹,包含 props、Hook、key,以及背後以儲存格配置的
tx-box/tx-text場景節點。 - 影格:以儲存格網格呈現目前影格。將游標移到儲存格上,查看繪製它的元件。點擊可選取節點。選取的節點會在即時主控台中醒目顯示。
- 時間軸:每個影格的 React、版面配置、繪製與編碼時間、略過與輸出的影格、影格輸出間隔,以及
%cspan。 - 控制項:暫停與繼續輸出、切換版面配置線框、固定或自動調整網格大小、將影格複製為文字。
安裝
擴充功能從 packages/devtools-extension 建置,並以未封裝的形式載入:
bun run --cwd packages/devtools-extension build- 開啟
chrome://extensions,啟用「開發人員模式」。 - 點擊「載入未封裝項目」,選擇
packages/devtools-extension/dist。 - 重新載入應用程式並開啟 DevTools。網頁建立主控台根節點後,就會出現 Text.js 面板。
建置也會產生 release/textjs-devtools-<version>.zip,可直接用於 Chrome 線上應用程式商店。
元件
選取元件可查看 props、依呼叫順序排列的 Hook(State、Ref、Memo、Effect 等,包含目前的值),以及該元件渲染的場景節點,並以儲存格為單位顯示位置、大小與方框內縮距離。將游標移到某一列上,就會在主控台中醒目顯示該節點。主體節點可顯示或隱藏元件之間的 tx-box 與 tx-text 元素。
面板開啟時,樹狀結構會在提交後更新。顯示的值是摘要,並非即時物件。
影格
影格檢查器會繪出渲染器的儲存格緩衝區:每個字形、前景、背景與屬性。將游標移到儲存格上,會顯示其字元與顏色、依繪製順序位於最上層的場景節點(遵循 overflow、捲動偏移量與 zIndex),以及渲染該節點的元件。點擊會在元件中選取該節點,並以渲染器本身的醒目提示覆蓋層,在即時主控台中醒目顯示。
時間軸
每個長條代表渲染器的一個影格:
| 階段 | 測量內容 |
|---|---|
| React | 影格開始時執行完畢的同步 React 工作 |
| 版面配置 | Yoga 版面配置 |
| 繪製 | 將場景點陣化至儲存格緩衝區 |
| 編碼 | 建立 %c 格式字串並呼叫 console.log() |
略過的影格會以淡色顯示:沒有變更,因此沒有輸出記錄。影格間隔圖表會將輸出影格之間的間隔,與 66 ms 的最小間隔比較。
計時到 console.log() 為止。訊息的格式化與繪製在 DevTools 內部執行,網頁無法觀測,因此時間軸不會顯示這些時間。在影格之間提交的並行渲染會計入提交次數,但不計時。
運作方式
與 React DevTools 一樣,擴充功能會在網頁執行前安裝全域 Hook:
globalThis.__TEXTJS_DEVTOOLS_HOOK__每個主控台根節點都會在建立時向這個 Hook 註冊。未安裝擴充功能時,這個 Hook 不存在,根節點只會檢查一次,不會在每個影格執行額外工作。已安裝擴充功能但面板關閉時,每個影格的額外成本是讀取一次屬性。只有面板要求時,才會計算樹狀結構與影格。
訊息依序流經網頁 → 內容指令碼 → Service Worker → 面板。內容指令碼會在每個網頁執行,確保 Hook 在應用程式啟動前就存在。這是擴充功能唯一要求的存取權限。擴充功能不會載入遠端程式碼,也不會將任何內容傳送到本機以外。
隱私權
擴充功能不會收集任何資料。不會發出網路請求、不會儲存任何內容,也沒有分析追蹤功能。元件樹、影格與計時資料只會在同一個瀏覽器的網頁與 DevTools 面板之間傳遞,並在關閉 DevTools 時捨棄。點擊複製影格時,會將影格文字寫入剪貼簿。
限制
- 支援 Chrome 與以 Chromium 為基礎的瀏覽器,版本須為 111 或更新版本。
- 在安裝擴充功能前已啟動的應用程式,需要重新載入。
- 只會檢查分頁最上層的影格。
- 時間來自
performance.now(),瀏覽器會將其精確度降低至約 0.1 ms。