美文网首页
代码美化利器 - Prettier

代码美化利器 - Prettier

作者: MrWelson | 来源:发表于2021-10-13 09:23 被阅读0次
    prettier.jpg

    Prettier 作为前端开发不可不知的一个工具,能让你的代码更清爽,在团队开发中能显著提升代码的观感,再也不怕同事骂你的代码是 mountain shit 了

    Prettier

    本文根据官网意译(V2.4.1),如有错误,欢迎指正

    简介

    Prettier 是一个包含大量固有规范的代码格式化工具,支持多种前端开发语言以及 Markdown 、YAML,它能够保证代码呈现的一致性。

    为什么要用 Prettier ?

    Prettier 官网上说 “使用 Prettier 最重要的原因就是停止在代码风格上的争论”。确实如此,在一个团队里或者项目中,有一个共同的代码风格指南是一件非常有价值的事情。但如果仅靠人为的去控制编程时的代码风格是一件非常痛苦且不值得这样去做。所以需要借助 Prettier 来帮我们实现代码风格的统一,因为它是全自动的帮我们修改代码格式。

    Prettier 和 Linters 的区别

    Linters ( ESLint / TSLint 等) 主要包含2类规则:

    • 代码风格规则

      可以用来检查代码风格是否符合约定规范,但并不会自动排版,Prettier 则会基于约定好的代码规范自动排版。所以用了 Prettier 之后,此类规则大部分就不再需要了。

    • 代码质量规则

      可以用来帮我们检查语法错误、拼写错误等,可以规避一些真实的 bugs,但 Prettier 并不能在这些方面提供帮助。

    总结来说,Linters 主要用于检查代码规范和语法错误,Prettier 则主要用于检查代码风格并自动排版,因此,两者搭配使用能更大程度的帮助开发者们提高编程效率。

    固有风格

    Prettier 只有很少的配置项,且以后也不会增加。

    Prettier 所提供的代码格式化规范并不是随心所欲、完全可配的,大部分都是内置固定的代码规范。因为它的初衷就是为了停止在代码风格上的争论,所以并不是完全自由的,但它提供的代码格式化规范已经度过了研究阶段,被很多大型组织或项目采用,是一个足够成熟的方案。

    使用

    安装插件

    使用 npm 安装

    npm install --save-dev --save-exact prettier
    

    使用 yarn安装

    yarn add --dev --exact prettier
    

    创建配置文件

    项目根目录下创建 .prettierrc.json 文件

    {}
    

    创建忽略文件

    项目根目录下创建 .prettierignore 文件

    Tip! Base your .prettierignore on .gitignore and .eslintignore (if you have one).

    示例

    # 忽略文件夹:
    build
    coverage
    
    # 忽略某一类型文件:
    *.html
    

    单文件中忽略格式化

    JavaScript

    // prettier-ignore
    matrix(
      1, 0, 0,
      0, 1, 0,
      0, 0, 1
    )
    

    JSX

    <div>
      {/* prettier-ignore */}
      <span     ugly  format=''   />
    </div>
    

    HTML

    <!-- prettier-ignore -->
    <div         class="x"       >hello world</div            >
    
    <!-- prettier-ignore-attribute -->
    <div
      (mousedown)="       onStart    (    )         "
      (mouseup)="         onEnd      (    )         "
    ></div>
    
    <!-- prettier-ignore-attribute (mouseup) -->
    <div
      (mousedown)="onStart()"
      (mouseup)="         onEnd      (    )         "
    ></div>
    

    CSS

    /* prettier-ignore */
    .my    ugly rule
    {
    
    }
    

    Markdown

    <!-- prettier-ignore -->
    Do   not    format   this
    

    多行忽略

    <!-- prettier-ignore-start -->
    
    <!-- prettier-ignore-end -->
    

    使用命令行格式化

    格式化所有文件

    // npm
    npx prettier --write .
    // yarn
    yarn prettier --write .
    

    格式化文件夹

    // npm
    npx prettier --write app/
    // yarn
    yarn prettier --write app/
    
    

    格式化文件

    // npm
    npx prettier --write app/components/Button.js
    // yarn
    yarn prettier --write app/components/Button.js
    //
    yarn prettier --write "app/**/*.test.js"
    
    

    检查文件是否已经格式化

    // npm
    npx prettier --check .
    
    // yarn
    yarn prettier --check .
    

    --check 命令只会检查已经格式化的文件,而不会重写它们。

    --write 则会自动检查并排版。

    编辑器集成

    在编辑器中集成 Prettier 是最广泛的使用方式。具体集成方式请查看各编辑器的 扩展/插件 使用说明。

    注意 ! 需要在每个项目中都安装 Prettier 插件,从而保证它们使用正确的版本。

    VSCode 扩展下载 Prettier - Code formatter

    ESLint

    使用 eslint-plugin-prettier 可以确保 ESLint 和 Prettier 能够完美搭配,避免两者的语法规则产生冲突。

    安装插件

    npm install -D eslint-plugin-prettier eslint-config-prettier
    

    修改 Eslint 配置文件

    // .eslintrc.json 
    {
      "extends": ["plugin:prettier/recommended"]
    }
    

    到这里就已经配置好了,可以放手开撸了。

    如果出现错误提示:Delete ␍ eslint prettier/prettier ,只需要在 .prettier.config.js 中加入

    {
        endOfLine: 'auto'
    }
    

    就可以解决。其他解决办法可根据报错信息自行搜索。

    同样的,如果你使用了 Stylelint,也可以安装 stylelint-config-prettier 插件。

    其他插件查看文档 Integrating with Linters

    Pre-commit Hook

    Prettier 也可用于 pre-commit,具体使用参见 Pre-commit Hook

    配置项

    Print Width

    指定代码换行的字符长度,默认为 80,超过该长度会换行。

    出于可读性考虑,官方建议不超过 80个字符。

    Default CLI Override API Override
    80 --print-width <int> printWidth: <int>

    Tab Width

    指定缩进长度,默认为 2。

    Default CLI Override API Override
    2 --tab-width <int> tabWidth: <int>

    Tabs

    指定缩进的方式:空格 或 Tab,默认为 false,即使用空格缩进。

    Default CLI Override API Override
    false --use-tabs useTabs: <bool>

    Semicolons

    指定语句的结尾是否要使用分号。

    Default CLI Override API Override
    true --no-semi semi: <bool>

    Quotes

    使用单引号代替双引号。

    JSX 引号会忽略这条规则。

    Default CLI Override API Override
    false --single-quote singleQuote: <bool>

    Quote

    对象的属性是否需要添加引号,默认 as-needed

    • "as-needed" - 对象的属性需要加引号时才会添加
    • "consistent" - 只要有一个对象属性需要加引号,则都会加上引号
    • "preserve" - 原样保存
    Default CLI Override API Override
    "as-needed" `--quote-props <as-needed consistent preserve>` `quoteProps: "<as-needed consistent preserve>"`

    注意,在 Vue、Angular、 TypeScript and Flow 语句中,Prettier 不会对数值类型的属性添加引号

    JSX Quotes

    在 JSX 中使用单引号替代双引号,默认false

    Default CLI Override API Override
    false --jsx-single-quote jsxSingleQuote: <bool>

    Trailing Commas

    元素末尾的逗号。默认为 es5

    如下例中数组最后一个元素后的逗号已经对象最后一个属性后的逗号。

    const array = [1,2,3,];
    cosnt object = {
        name: 'cat',
        age: 3,
    }
    
    • "es5" - ES5中的 objects, arrays 等会添加逗号,TypeScript 中的 type 后不加逗号
    • "none" - 都不添加逗号
    • "all" - 总是添加逗号,包括函数的参数后也会加逗号
    Default CLI Override API Override
    "es5" `--trailing-comma <es5 none all>` `trailingComma: "<es5 none all>"`

    Bracket Spacing

    对象中的空格,默认为 true

    • true - 例如: { foo: bar }
    • false - 例如: {foo: bar}
    Default CLI Override API Override
    true --no-bracket-spacing bracketSpacing: <bool>

    JSX Brackets

    将 html 开始标签的后面一个 > 放在最后一行的末尾,而不是单独一行。

    默认 false,即单独一行

    • true - 例如:
    <button
      className="prettier-class"
      onClick={this.handleClick}>
      Click Here
    </button>
    
    • false - 例如:
    <button
      className="prettier-class"
      onClick={this.handleClick}
    >
      Click Here
    </button>
    
    Default CLI Override API Override
    false --jsx-bracket-same-line jsxBracketSameLine: <bool>

    Arrow Function Parentheses

    当箭头函数只有一个参数时,是否加上括号,默认 always

    带上括号有利于添加类型注释,扩展参数或者设置参数默认值

    • "always" - 例如: (x) => x
    • "avoid" - 例如: x => x
    Default CLI Override API Override
    "always" `--arrow-parens <always avoid>` `arrowParens: "<always avoid>"`

    Range

    只格式化文件中的某一段代码

    Default CLI Override API Override
    0 --range-start <int> rangeStart: <int>
    Infinity --range-end <int> rangeEnd: <int>

    Parser

    指定代码格式化的解析器。 Prettier 会自动根据文件类型推断解析器,通常不需要额外指定。 Parser

    File Path

    指定文件名用来推断使用哪一种解析器 parser

    该配置项只在 CLI 和 API 生效,在配置文件中设置是无效的

    Require Pragma

    指定编译指示:只格式化在文件顶部包含特定注释的文件。

    当需要逐步格式化某个大体量的项目时,这是非常有用的。

    默认为 fasle 。设置为 true 时,使用以下两种注释的文件,会被格式化。

    /**
     * @prettier
     */
    
    /**
     * @format
     */
    
    Default CLI Override API Override
    false --require-pragma requirePragma: <bool>

    Insert Pragma

    插入编译指示:当文件已经被 Prettier 格式化之后,会在文件顶部插入一个特殊的 @format 标记。

    Default CLI Override API Override
    false --insert-pragma insertPragma: <bool>

    Prose Wrap

    Prose Wrap

    By default, Prettier will wrap markdown text as-is since some services use a linebreak-sensitive renderer, e.g. GitHub comment and BitBucket. In some cases you may want to rely on editor/viewer soft wrapping instead, so this option allows you to opt out with "never".

    • "always" - Wrap prose if it exceeds the print width.
    • "never" - Do not wrap prose.
    • "preserve" - Wrap prose as-is. First available in v1.9.0
    Default CLI Override API Override
    "preserve" `--prose-wrap <always never preserve>` `proseWrap: "<always never preserve>"`

    HTML Whitespace Sensitivity

    指定对 HTML, Vue, Angular, and Handlebars 文件中的空格保持敏感。

    如下示例,是否对保留空格将会直接影响到页面的呈现:

    html output
    with spaces 1<b> 2 </b>3 1 2 3
    without spaces 1<b>2</b>3 123

    所以需要设置 whitespace-sensitive formatting

    设定为 css 时会根据标签的 display 属性 ( inline、block ) 采取不同的格式化方式,例如:

    <!-- <span> is an inline element, <div> is a block element -->
    
    <!-- 格式化前,根据标签属性采取格式化方式 -->
    <span class="dolorum atque aspernatur">Est molestiae sunt facilis qui rem.</span>
    <div class="voluptatem architecto at">Architecto rerum architecto incidunt sint.</div>
    
    <!-- 格式化后 -->
    <span class="dolorum atque aspernatur"
      >Est molestiae sunt facilis qui rem.</span
    >
    <div class="voluptatem architecto at">
      Architecto rerum architecto incidunt sint.
    </div>
    

    也可手动指定 display 类型

    <!-- 格式化前,手动指定为 block 属性 -->
    <!-- display: block -->
    <span class="dolorum atque aspernatur">Est molestiae sunt facilis qui rem.</span>
    
    <!-- 格式化后 -->
    <!-- display: block -->
    <span class="dolorum atque aspernatur">
      Est molestiae sunt facilis qui rem.
    </span>
    

    更详情的用法参见 Whitespace-sensitive formatting

    • "css" - 遵循 CSS 的 display 属性
    • "strict" - 所有空格都将认定为是有意义的
    • "ignore" - 所有空格都将认定为是无意义的
    Default CLI Override API Override
    "css" `--html-whitespace-sensitivity <css strict ignore>` `htmlWhitespaceSensitivity: "<css strict ignore>"`

    Vue files script and style tags indentation

    vue 文件中,是否给 scriptstyle 内的代码添加缩进。

    • "false" - 不添加缩进,例如:
    <script>
    export default {
        mounted() {
            console.log("Component mounted!");
        }
    };
    </script>
    
    • "true" - 添加缩进,例如:
    <script>
        export default {
            mounted() {
                console.log('Component mounted!')
            }
        }
    </script>
    
    Default CLI Override API Override
    false --vue-indent-script-and-style vueIndentScriptAndStyle: <bool>

    End of Line

    指定代码最后是否添加一行空行

    end-of-line

    • "lf" – Line Feed only (\n), common on Linux and macOS as well as inside git repos
    • "crlf" - Carriage Return + Line Feed characters (\r\n), common on Windows
    • "cr" - Carriage Return character only (\r), used very rarely
    • "auto" - Maintain existing line endings (mixed values within one file are normalised by looking at what’s used after the first line)
    Default CLI Override API Override
    "lf" `--end-of-line <lf crlf cr auto>` `endOfLine: "<lf crlf cr auto>"`

    Embedded Language Formatting

    是否需要格式化在文件中引用的代码

    • "auto" – 如果 Prettier 可以识别嵌入的代码,则会格式化
    • "off" - 不会对嵌入的代码进行格式化
    Default CLI Override API Override
    "auto" --embedded-language-formatting=off embeddedLanguageFormatting: "off"

    相关文章

      网友评论

          本文标题:代码美化利器 - Prettier

          本文链接:https://www.haomeiwen.com/subject/xqesoltx.html