本文档介绍了 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, .cjs | dprint_plugin_typescript | dprint_plugin_typescript::format_text |
.json, .jsonc | dprint_plugin_json | format_json() |
.css, .scss, .sass, .less | malva | format_css() |
.html | markup_fmt | format_html() |
.md, .markdown | dprint_plugin_markdown | format_markdown() |
.yml, .yaml | pretty_yaml | format_yaml() |
.sql | sqlformat | format_sql() |
.ipynb | dprint_plugin_jupyter | dprint_plugin_jupyter::format_text |
.svelte, .vue, .astro | markup_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: FmtOptionsConfig 和 unstable: UnstableFmtOptionsFmtOptionsConfig:核心格式化设置(缩进宽度、行宽、引号等)UnstableFmtOptions:用于实验性格式化器的功能标志(sql, component)来源:cli/tools/fmt.rs42-45 cli/tools/fmt.rs159-163
格式化系统通过主 format 函数与 Deno 的 CLI 集成,该函数负责参数解析、文件收集和执行模式。
来源:cli/tools/fmt.rs57-157 cli/tools/fmt.rs165-188 cli/tools/fmt.rs229-242
该系统支持通过 Formatter trait 的多种执行模式
CheckFormatter:验证格式化而不修改文件,报告差异RealFormatter:应用格式化更改并将文件写回磁盘来源: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.rs844-856 cli/tools/fmt.rs537-558
TypeScript 格式化程序通过 create_external_formatter_for_typescript() 支持模板字面量和注释中的嵌入式语言。
format_embedded_css() 格式化模板字面量中的嵌入式 CSS。format_embedded_html() 格式化嵌入式 HTML。format_embedded_sql() 格式化嵌入式 SQL 查询(不稳定)。来源: cli/tools/fmt.rs560-661 cli/tools/fmt.rs663-734 cli/tools/fmt.rs736-767