菜单

格式化和 Linting

相关源文件

本文档介绍了 Deno 内置的代码格式化系统,该系统为 TypeScript、JavaScript、JSON、CSS、HTML、YAML、SQL 及其他文件类型提供自动代码格式化。该格式化系统通过 deno fmt 命令实现,并通过插件架构与各种第三方格式化库集成。

有关格式化功能的语言服务器集成,请参阅 Language Server Protocol。有关通用的开发工具上下文,请参阅 Developer Tools

架构概述

格式化系统围绕插件化架构构建,该架构将工作委托给不同文件类型的专用格式化器,同时提供统一的配置、缓存和 CLI 集成。

核心格式化流程

来源:cli/tools/fmt.rs57-157 cli/tools/fmt.rs190-227 cli/tools/fmt.rs801-858

文件类型支持矩阵

格式化系统通过专用格式化器支持多种文件类型

文件扩展名格式化库功能
.ts, .tsx, .js, .jsx, .mts, .cts, .mjs, .cjsdprint_plugin_typescriptdprint_plugin_typescript::format_text
.json, .jsoncdprint_plugin_jsonformat_json()
.css, .scss, .sass, .lessmalvaformat_css()
.htmlmarkup_fmtformat_html()
.md, .markdowndprint_plugin_markdownformat_markdown()
.yml, .yamlpretty_yamlformat_yaml()
.sqlsqlformatformat_sql()
.ipynbdprint_plugin_jupyterdprint_plugin_jupyter::format_text
.svelte, .vue, .astromarkup_fmt (unstable)format_html()

来源:cli/tools/fmt.rs813-857 cli/tools/fmt.rs349-405 cli/tools/fmt.rs358-375

配置系统

格式化系统从 deno.json 文件和命令行标志读取配置,并跨工作区成员分层解析选项。

配置解析流程

来源:cli/tools/fmt.rs1188-1374 cli/tools/fmt.rs1411-1432 cli/tools/fmt.rs1434-1512

关键配置类型

该系统使用多种配置类型来管理格式化选项

  • FmtOptions:主配置容器,包含 options: FmtOptionsConfigunstable: UnstableFmtOptions
  • FmtOptionsConfig:核心格式化设置(缩进宽度、行宽、引号等)
  • UnstableFmtOptions:用于实验性格式化器的功能标志(sql, component

来源:cli/tools/fmt.rs42-45 cli/tools/fmt.rs159-163

CLI 集成与工作流

格式化系统通过主 format 函数与 Deno 的 CLI 集成,该函数负责参数解析、文件收集和执行模式。

命令处理工作流

来源:cli/tools/fmt.rs57-157 cli/tools/fmt.rs165-188 cli/tools/fmt.rs229-242

执行模式

该系统支持通过 Formatter trait 的多种执行模式

  • CheckFormatter:验证格式化而不修改文件,报告差异
  • RealFormatter:应用格式化更改并将文件写回磁盘
  • Watch Mode:持续监控文件更改并自动重新格式化

来源:cli/tools/fmt.rs872-883 cli/tools/fmt.rs886-985 cli/tools/fmt.rs987-1092

缓存和性能

该系统使用增量缓存来避免重新格式化未更改的文件,从而显着提高大型代码库的性能。

增量缓存架构

来源:cli/tools/fmt.rs209-224 cli/tools/fmt.rs913-916 cli/tools/fmt.rs1033-1046

格式稳定性检查

该系统通过 format_ensure_stable() 来确保格式稳定性,该函数会验证格式化的代码在再次格式化时是否产生相同的输出。

来源:cli/tools/fmt.rs1098-1147

插件系统与外部格式化器

格式化系统通过插件架构委托给专门的外部格式化器,从而支持多种语言,同时保持一致的配置。

插件集成架构

来源: cli/tools/fmt.rs844-856 cli/tools/fmt.rs537-558

嵌入式语言支持

TypeScript 格式化程序通过 create_external_formatter_for_typescript() 支持模板字面量和注释中的嵌入式语言。

  • CSS: 使用 format_embedded_css() 格式化模板字面量中的嵌入式 CSS。
  • HTML: 使用 format_embedded_html() 格式化嵌入式 HTML。
  • SQL: 使用 format_embedded_sql() 格式化嵌入式 SQL 查询(不稳定)。

来源: cli/tools/fmt.rs560-661 cli/tools/fmt.rs663-734 cli/tools/fmt.rs736-767