简介:本文记录了作者如何在一天内快速开发一个 Prettier 插件,涵盖需求分析、技术选型、实现过程及优化建议,适合想提升代码格式化效率的开发者。
Prettier 作为前端代码格式化的标杆工具,凭借其“意见一致”的配置和跨语言支持,已成为开发者日常工作的标配。然而,当团队或项目存在特定规范(如自定义模板字符串规则、特殊注释格式等)时,原生 Prettier 的配置选项可能无法完全满足需求。此时,开发一个自定义插件成为高效解决方案。
本文将以实际案例展开,讲述如何在一天内从零开发一个 Prettier 插件,解决团队中“多行模板字符串缩进不一致”的痛点,同时提供可复用的技术路径和优化建议。
在 React/Vue 组件中,JSX 或模板字符串常包含多行内容。例如:
const query = `SELECT * FROM usersWHERE id = ${userId}`;
原生 Prettier 默认按 printWidth 折行,但缩进可能不符合团队规范(如希望所有内容缩进 2 空格)。手动调整效率低,且易被后续格式化覆盖。
parsers 和 printers 扩展原生功能。prettier-plugin-starter 模板快速初始化。使用官方模板初始化项目:
npx degit prettier/plugin-starter prettier-plugin-custom-indentcd prettier-plugin-custom-indentnpm install
关键文件结构:
src/index.ts # 插件入口printer.ts # 自定义打印逻辑options.ts # 配置解析package.json
在 printer.ts 中覆盖模板字符串的打印逻辑:
import { printDocument } from "prettier/doc-builders";import type { ParserOptions, PrintFn } from "prettier";const customPrint: PrintFn = (path, options, print) => {const node = path.getValue() as any;if (node.type === "template-literal") {const quasis = node.quasis;const indent = options.customIndent || 2; // 从配置读取缩进const lines = quasis.map((q: any) => q.value.raw.trim());const indentedLines = lines.map(line =>line ? " ".repeat(indent) + line : "");return indentedLines.join("\n");}return print(path);};export default {print: customPrint,};
在 options.ts 中定义插件配置:
export const options = {customIndent: {type: "int",default: 2,description: "缩进空格数",},};
修改 index.ts 暴露配置:
import { options } from "./options";import printer from "./printer";export default {languages: [{ name: "javascript", extensions: [".js", ".jsx"] }],parsers: { /* 复用原生 parser */ },printers: { "template-literal": printer.print },options,};
编写 Jest 测试用例:
import { format } from "prettier";import plugin from "../src";test("缩进 2 空格", async () => {const code = `const query = \`\n SELECT *\n FROM users\n\`;`;const result = await format(code, {parser: "babel",plugins: [plugin],customIndent: 2,});expect(result).toContain(" SELECT *\n FROM users");});
通过 npm link 本地测试,验证实际项目中的效果。
languages 配置扩展 TypeScript、HTML 等。prettier --check 确保代码一致性。<template> 格式化。eslint-plugin-prettier 统一代码风格。本文展示的插件虽在一天内完成,但实际项目中需持续优化。建议后续:
开发 Prettier 插件不仅是技术实践,更是提升团队效率的投资。即使时间有限,通过合理规划和工具利用,也能快速交付价值。