返回专题

专题 2023

Chrome DevTools 调研

Chrome DevTools

CDPChromeDebug
本文目录7
  1. 简介
  2. 调研
  3. Cloudflare Workers 内的 Chrome DevTools
  4. Electron 内使用 Chrome DevTools
  5. chii 内的 Chrome DevTools
  6. 定制 Chrome 开发者工具
  7. 安装开发工具

简介

最近在调研在线调试相关产品,目前有以下设想:

  • 在 FaaS Worker 项目中集成 Chrome DevTools
  • 在本地开发前端模块的过程中,真机调试集成 Chrome DevTools

调研

Cloudflare Workers 内的 Chrome DevTools

  • 在进入编辑页的时候,会 inspect websocket 连接远程的调试服务

  • 编辑后点击 send,会保存当前代码到远程

  • 后请求接口获取返回结果

  • 与此同时,远程调试服务会通过 websocket 发送 CDP 消息,在控制台打日志

Electron 内使用 Chrome DevTools

  • src/index.js

    JavaScript
    const path = require("path");
    const {
      app,
      ipcMain,
      webContents,
      BrowserWindow,
      BrowserView,
    } = require("electron");
    
    const createWindow = () => {
      // Simulator Window
      const simulatorWindow = new BrowserWindow({
        useContentSize: false,
        titleBarStyle: "hidden",
        webPreferences: {
          preload: path.join(__dirname, "preload.js"),
          webSecurity: false,
          webviewTag: true,
        },
      });
      simulatorWindow.maximize();
      simulatorWindow.loadFile(path.join(__dirname, "index.html"));
      simulatorWindow.openDevTools({ mode: "detach" });
    
      // Devtools View
      const devtoolsView = new BrowserView();
      simulatorWindow.setBrowserView(devtoolsView);
      devtoolsView.setBounds({
        x: 500,
        y: 0,
        width: simulatorWindow.getBounds().width - 500,
        height: simulatorWindow.getBounds().height,
      });
      devtoolsView.setAutoResize({ width: true, height: true });
    
      ipcMain.on("open-devtools", (_event, simulatorContentsId) => {
        const simulator = webContents.fromId(simulatorContentsId);
        simulator.setDevToolsWebContents(devtoolsView.webContents);
        simulator.debugger.attach();
        simulator.openDevTools();
      });
    };
    
    app.whenReady().then(() => {
      createWindow();
    
      app.on("activate", () => {
        if (BrowserWindow.getAllWindows().length === 0) {
          createWindow();
        }
      });
    });
    
    app.on("window-all-closed", () => {
      if (process.platform !== "darwin") {
        app.quit();
      }
    });
    
  • src/preload.js

    JavaScript
    const { contextBridge, ipcRenderer } = require("electron");
    
    contextBridge.exposeInMainWorld("electronAPI", {
      ipcRenderer: {
        send: (...args) => ipcRenderer.send(...args),
      },
    });
    
  • src/index.html

    HTML
    <html>
      <head>
        <style type="text/css">
          * {
            margin: 0;
          }
    
          \#simulator {
            height: 100%;
            width: 500px;
          }
        </style>
      </head>
      <body>
        <webview id="simulator" src="https://github.com/JiyuShao"></webview>
        <script>
          const { ipcRenderer } = electronAPI;
          const emittedOnce = (element, eventName) =>
            new Promise((resolve) => {
              element.addEventListener(eventName, (event) => resolve(event), {
                once: true,
              });
            });
          const simulatorView = document.getElementById("simulator");
          const simulatorReady = emittedOnce(simulatorView, "dom-ready");
          simulatorReady.then(() => {
            const simulatorId = simulatorView.getWebContentsId();
            ipcRenderer.send("open-devtools", simulatorId);
          });
        </script>
      </body>
    </html>
    

chii 内的 Chrome DevTools

定制 Chrome 开发者工具

安装开发工具

官方推荐工作流见 Chrome DevTools workflow,工具安装参照 GET DEPOT TOOLS

Bash

# 下载源码
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

# 将其添加到本机环境变量中
export PATH=$PATH:/path/to/depot_tools

# 对于旧版本的 devtools-frontend,需要使用 depot_tools 的低版本,否则会报错:
# depot_tools/ninja.py: Could not find Ninja in the third_party of the current project, nor in your PATH.
cd depot_tools
git reset --hard 138bff28

# 关闭 depot_tools 的自动更新
export DEPOT_TOOLS_UPDATE=0
返回首页
上一篇jsdom 与 worker-dom 学习记录下一篇Knative 学习记录

Discussion

留言与讨论

想法、补充和不同意见都欢迎。