为何设置printWidth=200后Prettier仍换行return foo(?
问题
格式化代码时,Prettier 会自动把return foo(换行到新行。明明已经设置了printWidth = 200,且单行有足够空间容纳代码,这是为什么?如何阻止这种换行?不想用prettier-ignore这类临时方案,有没有对应的配置项可以控制这个行为?
示例代码
function foo() { // 我不关心代码是否能运行,只在意格式化结果 /* return foo('test', baz` some text here `); */ return foo( 'test', baz` some text here ` ); }
当前 Prettier 配置
{ "singleQuote": true, "arrowParens": "always", "semi": true, "trailingComma": "es5", "bracketSameLine": true, "printWidth": 200 }
期望格式化效果
return foo('test', baz` some text here `);
原因与解决方案
原因
Prettier 对包含**模板字面量(template literal)**的函数调用有特殊换行逻辑:当函数参数中存在多行模板字面量时,无论printWidth设置多大,Prettier 默认都会将函数调用拆分为多行。它认为这类多行内容会降低单行可读性,属于“强制换行”场景,不受printWidth约束。
解决方案
目前 Prettier 没有专门配置项直接关闭该行为,但可通过调整expressionSpacing配置(仅支持 Prettier 2.4.0+)间接实现:
修改.prettierrc,添加"expressionSpacing": false:
{ "singleQuote": true, "arrowParens": "always", "semi": true, "trailingComma": "es5", "bracketSameLine": true, "printWidth": 200, "expressionSpacing": false }
该配置会取消函数调用括号内的额外缩进,同时改变 Prettier 对含多行模板字面量的函数调用的换行判断逻辑,使其优先保持单行,符合期望效果。
注意:expressionSpacing会影响所有表达式的空格处理,比如a + b会变为a+b。若需保留表达式空格,此方案不适用,这种情况下暂时无完美配置项解决,只能接受 Prettier 默认行为,或使用// prettier-ignore作为临时折中方案。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

