菜单

控制台实现

相关源文件

本文档涵盖了 Deno 的控制台实现,包括对象检查系统、控制台 API 方法、格式化和样式设置功能。控制台系统通过 console.log()console.error()console.table() 等方法,以及复杂的对象格式化和检查功能,提供了调试工具。

有关更广泛的 Deno 命名空间 API 的信息,请参阅 Deno 命名空间 API。有关 Node.js 控制台兼容性功能的更多信息,请参阅 Node.js API Polyfills

架构概述

控制台实现跨越了 JavaScript 和 Rust 层,核心格式化逻辑在 JavaScript 中,而性能关键型操作则在 Rust 中进行。

系统组件图

来源: ext/console/01_console.js1-10 ext/console/lib.rs1-31 ext/node/polyfills/internal/console/constructor.mjs115-189

核心组件

控制台系统由几个关键组件组成,协同工作以提供全面的调试功能。

主控制台模块结构

组件文件目的
formatValueext/console/01_console.js439-546核心对象格式化逻辑
inspectext/console/01_console.js1583-1630主要检查入口点
inspectArgsext/console/01_console.js1666-1692格式化控制台参数
Consoleext/node/polyfills/internal/console/constructor.mjs115-189Node.js 兼容的控制台
op_preview_entriesext/console/lib.rs11-30用于预览集合的 Rust op

来源: ext/console/01_console.js5-162 ext/console/lib.rs5-9

对象检查系统

对象检查系统是控制台实现的核心,负责将 JavaScript 值转换为可读的字符串表示。

检查流程图

来源: ext/console/01_console.js439-546 ext/console/01_console.js624-1026

主要检查功能

检查系统支持多项高级功能

  • 循环引用检测:使用 ctx.seen 数组和 ctx.circular 映射来跟踪和显示循环引用,显示为 [Circular *n]
  • 自定义检查方法:支持 Symbol.for("Deno.customInspect")Symbol.for("nodejs.util.inspect.custom")
  • 深度控制:通过 [Object] 占位符可配置检查深度,用于深层对象。
  • 特定类型格式化:为数组、对象、Map、Set、函数等提供专门的格式化器。

来源: ext/console/01_console.js530-543 ext/console/01_console.js473-526 ext/console/01_console.js936-946

控制台 API 方法

控制台提供一套完整的调试方法,遵循 Web 标准和 Node.js 兼容性。

控制台方法实现

来源: ext/node/polyfills/internal/console/constructor.mjs434-686 ext/console/01_console.js1737-1851

方法实现

关键控制台方法及其实现

方法实现文件目的
loginfodebugconsoleMethods.logext/node/polyfills/internal/console/constructor.mjs434-436输出到 stdout
warnerrorconsoleMethods.warnext/node/polyfills/internal/console/constructor.mjs438-440输出到 stderr
assertconsoleMethods.assertext/node/polyfills/internal/console/constructor.mjs490-496条件警告
tableconsoleMethods.tableext/node/polyfills/internal/console/constructor.mjs555-685表格数据展示
time/timeEndconsoleMethods.timeext/node/polyfills/internal/console/constructor.mjs453-472性能计时

来源: ext/node/polyfills/internal/console/constructor.mjs433-686

样式和颜色系统

控制台支持丰富的文本样式和彩色输出,并能自动检测 TTY。

颜色和样式配置

来源: ext/console/01_console.js204-302 ext/console/01_console.js174-188 ext/console/01_console.js373-375

样式定义

控制台为不同的值类型定义了样式

来源: ext/console/01_console.js204-220

格式说明符

控制台支持 printf 风格的格式说明符,用于灵活的输出格式化。

格式说明符处理

来源: ext/console/01_console.js1720-1800 ext/console/01_console.js1966-2100

Node.js 兼容层

Deno 提供了 Node.js 兼容的控制台实现,以兼容现有的 Node.js 代码。

Node 控制台集成

Node.js 的控制台构造函数提供了基于流的控制台功能。

功能实现目的
流绑定kBindStreamsEager, kBindStreamsLazy连接到 stdout/stderr 流
颜色检测kGetInspectOptions自动检测 TTY 颜色支持
分组缩进kGroupIndent, kGroupIndentationWidth控制台分组支持
错误处理createWriteErrorHandler流错误管理

来源: ext/node/polyfills/internal/console/constructor.mjs208-316 ext/node/polyfills/internal/console/constructor.mjs412-431

Rust 集成

控制台系统通过 ops 与 Rust 集成,以实现性能关键的操作。

核心 Rust 操作

deno_console 扩展提供了基本的操作。

此操作可以预览集合(Maps、Sets)中的条目,以便在不完全迭代的情况下进行高效检查。

来源: ext/console/lib.rs11-30

其他核心 Ops

控制台也使用来自运行时(runtime)的核心 Ops。

  • op_get_constructor_name:获取对象的构造函数名称。
  • op_get_non_index_property_names:高效获取对象属性名称。
  • op_preview_entries:预览集合条目。

来源: ext/console/01_console.js32-35