如何让Prettier实现ESLint的space-in-parens效果?能否自定义规则?
实现Prettier模拟ESLint
space-in-parens规则的方案 首先得明确:Prettier的核心设计是强制统一的格式化风格,本身不支持自定义规则扩展,官方也因为这个理念,不会为这类个性化空格需求添加配置项(你找到的2017年讨论帖也能看出这点)。不过有两种可行的实现思路:
1. 编写自定义Prettier插件
Prettier支持通过插件扩展格式化逻辑,你可以写一个简单的插件来处理括号内的空格:
- 借助Prettier的AST遍历能力,定位到函数声明、函数调用、表达式等包含括号的节点
- 对括号的内容进行修改,在左括号后、右括号前插入空格
以下是一个极简的插件示例(基于Prettier的API):
module.exports = { parsers: { babel: require("prettier/parser-babel").parsers.babel, }, printers: { babel: { ...require("prettier/parser-babel").printers.babel, print(path, options, print) { const node = path.getValue(); // 处理函数声明的参数括号 if (node.type === "FunctionDeclaration") { const paramsDoc = path.call(print, "params"); return [ "function ", node.id.name, "( ", paramsDoc, " )", path.call(print, "body"), ]; } // 处理函数调用的括号 if (node.type === "CallExpression") { const calleeDoc = path.call(print, "callee"); const argsDoc = path.call(print, "arguments"); return [calleeDoc, "( ", argsDoc, " )"]; } // 其他节点沿用默认逻辑 return require("prettier/parser-babel").printers.babel.print( path, options, print ); }, }, }, };
将这个插件保存为prettier-plugin-space-in-parens.js,然后在项目的.prettierrc中配置使用:
{ "plugins": ["./prettier-plugin-space-in-parens.js"] }
2. 结合Prettier与ESLint自动修复
如果不想写插件,可以采用"先Prettier格式化,再ESLint修复"的流程:
- 正常配置Prettier处理大部分格式问题
- 在ESLint中启用
space-in-parens规则,并设置为["error", "always"] - 在项目的脚本中,先执行
prettier --write,再执行eslint --fix,这样ESLint会自动给括号内加上空格
这种方法不需要额外开发,适合快速实现需求,但需要确保两者的规则不会冲突(Prettier处理的规则ESLint最好关闭,避免重复处理)。
内容的提问来源于stack exchange,提问作者Vicente Echo
相关产品推荐
相关产品推荐

