Skip to content

用 Prettier 格式化项目代码 #144

@Dream4ever

Description

@Dream4ever

需求描述

依情况而定,可以参考 为什么我不使用 Prettier 这篇文章中的方案,只用 ESLint,不用 Prettier,因为 ESLint 更自由。

为了规范化开发,需要用 Prettier 来格式化项目代码。

安装依赖

参考官方文档 Install 一节,先在项目中安装 prettier: yarn add --dev --exact prettier

注意:每个需要使用 Prettier 来格式化代码的项目,都需要安装 prettier 这个库。

忽略列表

在项目根目录下新建一个 .prettierignore 文件,用于记录不需要 Prettier 格式化的文件,该文件的规则.gitignore 是一样的。

配置规则

在项目根目录下新建一个 .prettierrc 文件,内容如下:

{
  "printWidth": 80,
  "tabWidth": 2,
  "useTabs": false,
  "semi": false,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "jsxSingleQuote": false,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "jsxBracketSameLine": false,
  "arrowParens": "always",
  "requirePragma": false,
  "proseWrap": "preserve",
  "htmlWhitespaceSensitivity": "css",
  "vueIndentScriptAndStyle": true,
  "endOfLine": "auto",
  "embeddedLanguageFormatting": "off"
}

以上各选项的含义如下:

行宽

"printWidth": 80:使行宽尽量保证在 80 字符以内,不强制,比如长字符串就不会强制折行。

制表符宽度

"tabWidth": 2:制表符宽度为 2 个字符宽度。

缩进方式

"useTabs": false:使用空格而不是 Tab 来缩进。

语句末分号

"semi": false:只在会产生歧义的时候才在语句末尾加分号。

单引号 vs 双引号

"singleQuote": true:尽量只用单引号,不过字符串中同时有单引号和双引号时,会使用数量更少的那个把字符串括起来。

对象属性名的括号

"quoteProps": "as-needed":只在需要的时候才把对象属性用引号括起来。

JSX 中单引号 vs 双引号

"jsxSingleQuote": false:在 JSX 中使用双引号。

行尾逗号

"trailingComma": "es5":添加 ES5 中支持的行尾逗号,比如 object, array。

对象大括号内侧空格

"bracketSpacing": true:对象大括号内侧添加空格,比如 { foo: bar },属性名 foo 和属性值 bar 与相邻的括号间有空格。

JSX 起始标签的尾括号

"jsxBracketSameLine": false:对于 JSX 中同时有起始标签和闭合标签的 HTML 元素,且起始标签有多条属性时,起始标签的尾括号 > 始终独占一行,效果如下所示。

<button
  className="prettier-class"
  id="prettier-id"
  onClick={this.handleClick}
>
  Click Here
</button>

箭头函数参数大括号

"arrowParens": "always":即使箭头函数只有一个参数,也强制用大括号括起来。虽然会多一个括号,但是对提高开发效率和改进代码质量非常有帮助。

格式化起点

"rangeStart": 0:将格式化范围设定为文件起点至当前所选内容的终点,也是 Prettier 的默认值。

格式化终点

"rangeEnd": Infinity:将格式化范围设定为当前所选内容的起点至文件的终点,也是 Prettier 的默认值。

Parser

Prettier 会根据文件自动选择所用的 parser,也建议用户不要手动设置该选项。

Require Pragma

"requirePragma": false:如果该字段的值设置为 true,那么只有当文件的起始内容是以下两种之一时,Prettier 才会格式化该文件:

/**
 * @prettier
 */

或者

/**
 * @format
 */

当需要对一个大型项目进行渐进式地重构时,这个参数就很有用了。

Insert Pragma

该参数和 requirePragma 参数一起使用时,Prettier 会在已被格式化的文件的开头加上一行 @format。如果文件开头已经有 docblock 了,那么会再添加一个空行( @format 是在 docblock 之前还是之后?)。

Markdown 换行

"proseWrap": "preserve":不对 Markdown 进行强制换行,保留原始格式。

HTML 空白字符

"htmlWhitespaceSensitivity": "css":该参数决定了要如何处理 HTML 中的空白字符。比如 span 元素内的文字两侧有空格,Prettier 根据该参数决定是否要删除。

Vue 的 JS 和 CSS 缩进

"vueIndentScriptAndStyle": true:该参数设置为 true 时,会对 Vue 组件 scriptstyle 标签中的内容进行缩进。如果不缩进,可能会破坏代码编辑器的折叠代码段的功能。

换行符

"endOfLine": "auto":不要求代码统一用 LF 换行,因为 Windows 下用的是 CRLF 换行,如果同时会在 Windows 和 Linux/macOS 下开发,就需要开启该选项。

另外最好在项目根目录下再新建一个 .prettierignore 文件,这样命令行和代码编辑器就都不会格式化不需要格式化的文件。该文件的格式和 gitignore syntax 是一样的。

文件中嵌入其他语言的格式化开关

"embeddedLanguageFormatting": false:比如 JS 文件中的 HTML 模板,或者 Markdown 中的代码,如果将该参数设置为 off,Prettier 就不会视图格式化这样的嵌入代码。

格式化

在终端执行 yarn prettier --write .,Prettier 就会自动将项目代码文件进行格式化。

如果只是需要检查代码是否满足格式化要求,那么执行 yarn prettier --check . 即可,该命令会检查代码文件(不含被 git 和 Prettier 忽略的文件)是否满足格式化要求,并输出检查结果,但不修改代码。该命令可以集成到持续集成(CI)工作流中,以保证项目代码质量。

不过在实际开发中,在终端手动执行命令来格式化代码太不方便了,在 VSCode 中,可以安装 Prettier - Code formatter 这个扩展,扩展的配置也很丰富,可以好好看看。

另外,即使通过 VSCode 扩展来使用 Prettier,也务必要按照前面的流程,在每个项目中都用 npm 或 Yarn 安装 prettier 这个库,扩展才能生效。

搭配 ESLint

ESLint 这样的 Linter 包含两大类规则,一类是用于保证代码质量的,比如 no-unused-varsno-extra-bind;另一类是用于格式化代码的,比如 max-lenno-mixed-spaces-and-tabs。而 Prettier 也是用于格式化代码的,所以在同时使用 ESLint 和 Prettier 时,ESLint 中格式化代码的规则就有可能和 Prettier 起冲突。

为了解决这个问题,可以使用 eslint-config-prettier 这样的库。这个库的简介就是 Turns off all rules that are unnecessary or might conflict with Prettier,也就是将 ESLint 的规则中和 Prettier 有冲突的部分,以及没必要启用的部分,都给它禁用掉。

终端执行 yarn add --dev eslint-config-prettier 安装这个库,然后在 ESLint 配置文件 .eslintrc.*extends 字段的最后,加上 prettier,这样才能保证覆盖其他配置,扩展才能生效。

{
  extends: [
    'standard',
    'prettier/standard',
    'plugin:jest/recommended'
    'prettier'
  ],
}

参考资料

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions