Chrome javascript 代理的 Devtools 格式化程序

Chrome Devtools formatter for javascript proxy

我最近开始在我的一个项目中使用代理。这样做的一个缺点是,当在调试器中检查对象时,它现在被代理包装 javascript proxy.

而不是看到 [[Handler]],[[Target]],[[isRevoked]] 我更愿意只看到 [[Target]] 引用的对象。

这是一个小小的不便,但我认为可以通过 Chrome Devtools custom formatter 解决。

这似乎很常见,但我找不到任何现有的格式化程序。只是想在我自己写之前仔细检查一下是否已经没有了。

原来这是很难实现的。第一个问题是 impossible to identify a Proxy 没有:

A: 将自定义交易品种添加到您的代理实施(如果您控制代理初始化代码)

B: 覆盖 window.Proxy 原型并使用 Wea​​kset 基本上跟踪每个代理初始化

最重要的是,无法访问原始 [[Target]] 对象。但是,运行 JSON.parse(JSON.stringify(obj)) 似乎仅用于 console.log 目的。

假设您没有修改代理处理程序的控制权,这就是您的解决方案:

// track all proxies in weakset (allows GC)
const proxy_set = new WeakSet();
window.Proxy = new Proxy(Proxy, {
      construct(target, args) {
        const proxy = new target(args[0], args[1]);
        proxy_set.add(proxy);
        return proxy;
      },
});

window.devtoolsFormatters = [{
  header(obj: any) {
    try {
      if (!proxy_set.has(obj)) {
        return null;
      }
      return ['object', {object: JSON.parse(JSON.stringify(obj))}]; //hack... but seems to work
    } catch (e) {
      return null;
    }
},
  hasBody() {
      return false;
  },
}];