成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官,我實現了一個 Chrome Devtools

網絡 通信技術
這種基于 websocket 的調試協議叫做 chrome devtools protocol。因為功能比較多,所以分了多個域(一般復雜的東西都會分域),包括 DOM、Debugger、Network、Page 等等,分別放不同的調試協議。

[[426371]]

網頁會加載資源、運行 JS、渲染界面、存儲數據等,我們開發時怎么看到執行的狀態呢?用調試工具 chrome devtools。它支持 dom 調試、JS debugger、本地存儲的展示、運行時間的 profile 等。

Node.js 也是同樣,不過它只支持 JS debugger 和 profile。我們可以通過 chrome devtools 或者 vscode debugger 等來調試。

這些工具都是遠程 attach 到運行的程序上來調試的,之間怎么交互數據呢?通過 webSocket。而且還制定了 chrome devtools protocol 的協議,規定了有什么能力,如何通信。

這種基于 websocket 的調試協議叫做 chrome devtools protocol。因為功能比較多,所以分了多個域(一般復雜的東西都會分域),包括 DOM、Debugger、Network、Page 等等,分別放不同的調試協議。chrome devtools 就是通過這個協議實現的調試。

新版 chrome(金絲雀版)可以打開設置中的實驗特性的 Protocol Monitor 面板。

就可以看到傳輸的 CDP 數據:

這就是 chrome devtools 的原理。

理解了這個原理有什么用呢?

我們可以重新實現服務端,只要對接了調試協議,那么就能夠用 chrome devtools 來調試。

比如 kraken(把 css 渲染到 flutter)是怎么做到用 chrome devtools 調試 dom 和樣式的?就是對接了這個協議。

我們可以重新實現客戶端,只要對接了這個協議,那就可以用任何工具調試網頁/Node.js。

大家用 chrome devtools 可以調試 Node.js 和網頁,用 vscode debugger 也可以,用 webstorm debugger 也可以。為什么呢?因為它們都對接了這個協議。

那我們是不是可以對接這個協議實現一個類似 chrome devtools 的調試工具呢?

我們來實驗下:

我們啟動 chrome,通過 --remote-debugging-port 指定調試端口:

  1. /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --remote-debugging-port=9222 

然后連上它。

這里我們不用直接對接協議,chrome 提供了各種語言的 sdk,調用 api 就行:

我們先連接上 chrome:

  1. const CDP = require('chrome-remote-interface'); 
  2.  
  3. async function test() { 
  4.     let client; 
  5.     try { 
  6.         client = await CDP(); 
  7.         const { Page, DOM, Debugger } = client; 
  8.         //... 
  9.     } catch(err) { 
  10.         console.error(err); 
  11.     } 
  12. test(); 

然后打開 baidu.com,等 2s,做個截圖:

  1. const CDP = require('chrome-remote-interface'); 
  2. const fs = require('fs'); 
  3.  
  4. async function test() { 
  5.     let client; 
  6.     try { 
  7.         client = await CDP(); 
  8.         const { Page, DOM, Debugger } = client; 
  9.  
  10.         await Page.enable(); 
  11.         await Page.navigate({url: 'https://baidu.com'}); 
  12.  
  13.         await new Promise(resolve => setTimeout(resolve, 2000)); 
  14.   
  15.         const res = await Page.captureScreenshot(); 
  16.         fs.writeFileSync('./screenshot.jpg', res.data, { 
  17.             encoding: 'base64' 
  18.         }); 
  19.     } catch(err) { 
  20.         console.error(err); 
  21.     } 
  22. test(); 

查看下效果:

這樣,我們就跑通了 CDP 的第一段代碼。

其余的功能,包括 Network、Debugger、DOM 等等也能實現,我們簡單試一下:

  1. await DOM.enable(); 
  2.  
  3. const { root } = await DOM.getDocument({ 
  4.     depth: -1 
  5. }); 

depth 為深度,設置為 -1 就是返回整個 dom:

有了這些數據我們是不是可以做 DOM 的瀏覽呢?

還有 DOM.setAttributeValue 可以設置屬性、DOM.getBoxModel 拿到盒模型大小等。

基于這些,我們做個 dom 編輯器沒問題吧。

還有網絡部分:

  1. await Network.enable(); 
  2. Network.on('responseReceived', async evt => { 
  3.     const res = await Network.getResponseBody({ 
  4.         requestId: evt.requestId 
  5.     }); 
  6.  
  7.     console.log(evt.response.url); 
  8.     console.log(res.body); 
  9. }); 

我們通過 responseReceived 事件監聽每一個響應,然后再通過 Network.getResponseBody 拿到響應的內容:

基于這些,我們實現 Network 面板的功能沒問題吧。

還可以對接 profiler:

  1. await Profiler.start(); 
  2. await new Promise(resolve => setTimeout(resolve,2000)); 
  3. const { profile }  = await Profiler.stop(); 

有這些數據,我們就可以通過 canvas 畫出個火焰圖出來。

理論上來說,chrome devtools 的所有功能我們都能實現。而且,一個網頁同時用多個調試工具調試是可以的,因為 websocket 本來就可以有多個客戶端。

可能你會說自己實現 chrome devtools 有什么意義?

大家自己做開源前端項目的時候,一般都是寫個網易云音樂客戶端,因為有現成的數據可以用。那為什么不做個 chrome devtools 呢?也有現成的數據啊,啟動瀏覽器就行,而且這個逼格多高啊。

我們也不用實現完整的 chrome devtools,可以單把網絡部分、單把 DOM 部分、單把 debugger 部分實現了,可以做不同的 UI,可以做 chrome devtools 沒有的功能和交互。

比如你面試可視化崗位,你說你對接了 chrome devtools protocol 的 profiler 部分,用 canvas 畫了個火焰圖,會加分很多的。

總結

Chrome 的調試是通過 WebSocket 和調試客戶端通信,制定了 Chrome Devtools Protocol 的協議,Node.js 也是,不過協議叫做 V8 debugger protocol。我們可以通過 protocol monitor 的面板看到所有的 CDP 協議請求響應。

可以實現 CDP 服務端,來對接 chrome devtools 的調試功能,調試不同的目標,比如 kraken 渲染引擎。

可以實現 CDP 客戶端,來用不同的工具調試,比如 vscode debugger、webstorm debugger 等。

我們也可以通過 sdk 的 api 來和 CDP 服務端對接,拿到數據,實現調試的功能。比如單獨實現 DOM 編輯器、Network 查看器、JS Debugger、 Profiler 和火焰圖都可以,而且可以做到比 chrome devtools 更強的功能,更好的交互。

當大家想做開源項目沒有數據的時候,不妨考慮下做個 CDP 客戶端,這不比云音樂項目香么?

 

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2020-05-13 14:35:47

HashMap面試官Java

2022-04-08 08:26:03

JavaHTTP請求

2017-03-16 15:27:10

面試官測試技術

2019-12-02 10:51:11

Redis存儲系統

2024-05-28 10:14:31

JavaScrip模板引擎

2021-06-09 07:55:19

NodeEventEmitte驅動

2021-12-02 08:19:06

MVCC面試數據庫

2020-09-08 06:43:53

B+樹面試索引

2023-07-31 08:26:09

2021-05-19 08:17:35

秒殺場景高并發

2022-01-10 11:04:41

單鏈表面試編程

2022-08-18 20:02:04

JSLRU緩存

2020-06-22 07:47:46

提交面試官訂單

2020-09-02 07:52:03

AOP測試環境

2024-04-09 08:39:16

本地緩存開發線程安全

2022-04-10 18:10:24

CURD鏈表

2020-09-17 17:53:12

面試ArrayList數組

2024-03-07 07:37:03

AQS線程獨占鎖

2021-11-02 09:05:25

Redis

2025-03-07 00:00:10

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区二区三区在线 | 中文成人在线 | 美女黄频 | www97影院| 精品国产一区二区三区性色av | 日本在线黄色 | 男女羞羞视频在线免费观看 | 国产一区亚洲 | 日屁视频 | 国产精品99久久久久久人 | 国产精品免费在线 | 啪一啪在线视频 | 国产精品久久久久影院色老大 | 国产中文字幕在线 | 久久久国产精品视频 | 国产欧美一区二区三区在线看蜜臀 | 国产亚洲精品久久久优势 | 国产精品久久久久久二区 | 国产精品一区二区三区在线 | 日韩aⅴ片| 成人在线观看欧美 | 亚洲精品久久久久久久久久久久久 | 国产精品成人av | 视频一区二区在线观看 | 国产目拍亚洲精品99久久精品 | 中文字幕欧美在线观看 | 天天爱av| 国产成人精品一区二区 | 国产一区二区在线免费观看 | 久久综合av | 成人在线精品视频 | 中文字幕精品一区二区三区在线 | 国产成人精品午夜视频免费 | 亚洲精品1区 | 精品日韩| 蜜臀网站| 日韩欧美在线视频观看 | 看片wwwwwwwwwww | 亚洲一区二区在线视频 | 久久伊人精品 | 99看片网|