Chrome 调试工具技巧:自定义格式转换器

Custom Formatters 自定义转换器

在大多数的情况下 DevTools 的 console 默认的对象的转化的方式都很有用,但是有时候你期望与众不同。默认的方式总是很 "默认" - 所以我们自定义自己输出对象的方式。做这个事情的函数被称为 Custom Formatter 在我们写下一个之前,需要在 DevTools 的设置 (在 DevTools 的 ⋮ 下拉框找到设置,或者按下 F1) 中把对应的设置打开:

所以,这样的 formatter 应该长什么样?它是一个最多有三个方法的对象:

  • header --- 处理如何展示在 console 的日志中的主要部分。
  • hasbody --- 如果你想显示一个用来展开对象的 ▶ 箭头,返回 true
  • body - 定义将会被显示在展开部分的内容中。

让我们一起来看一个基础的 自定义 formatter

我移除了循环的结构的错误处理,让它看起来更加简洁

header 方法返回了一个 JsonML (译者注:JsonML: JSON Markup Language JSON 标记语言) 数组,由这些组成:

  • 标签名
  • 属性对象
  • 内容 (文本值或者其他元素)

(如果这个看起来很眼熟的话,那可能是因为你之前写过一些 React 代码 :D)

在输出的时候,这个简单的 formatter 对于每层嵌套,直接以 7 个空格的缩进打印这个对象。所以现在我们的输出看起来是这样:

自定义格式化转换器的应用实践

现在有好几种 custom formatter 供你使用,例如:你可以在这个 immutable-devtools 仓库中找到对于 Immutable.js 结构的完美展示。但是同样可以自己造一个。

一般来说,每当遇到一些(结构)不寻常的对象的时候,或者大量的日志 (最好避免这样的情况,但是有时候很有用) 并且想从中做区分的时候,你可以采用一个 custom formatter 来处理。

很实用的一个窍门:直接将你不关心,不需要特别对待的对象过滤出来,这种情况,直接在 header 方法里面 return null 。让 DevTools 使用默认的转换方式来处理这些值。

【第3007期】通过调试技术,理清了视频播放很快的原理

好了,撇开实用性,同样可以在它上面找点乐子 - 这是一个关于 console 方法的蠢萌例子:它叫 console.clown () 并且它转换要打印的对象,在对象前面加上一个 emoji 表情 ... 可能是为了更好的显示效果吧,我猜 😁

源码在这里为了方便大家尝试,源码贴在下面:

javascript 复制代码
 window.devtoolsFormatters = [{
     header: function(obj){
       if (!obj.__clown) {
         return null;
       }
       delete obj.__clown;
       const style = `
         color: red;
         border: dotted 2px gray;
         border-radius: 4px;
         padding: 5px;
       `
       const content = `🤡 ${JSON.stringify(obj, null, 2)}`;

       try {
         return ['div', {style}, content]
       } catch (err) { // for circular structures
         return null;  // use the default formatter
       }
     },
     hasBody: function(){
         return false;
     }
 }]

 console.clown = function (obj) {
   console.log({...obj, __clown: true});
 }

 console.log({message: 'hello!'});   // normal log
 console.clown({message: 'hello!'}); // a silly log

如你所见,我正使用 console.clown 方法来给打印的对象添加一个特殊的属性,所以我可以将它区分出来并且在 formatter (转换器) 中对它进行区别对待,但在大部分现实的案例中,可以这样:比如检查这个对象是不是某一个特殊类的实例等等。

相关推荐
知了学历孙老师3 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu5 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说5 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵7 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot7 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot7 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI7 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance7 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写7 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端
大文说跨境7 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化