Prettier配置踩坑记那些年我遇到的格式化难题

司徒付敏 前端 阅读 755
赞 13 收藏
二维码
手机扫码查看
反馈

项目初期的技术选型

最近接手了一个老项目,团队里新来了几个实习生,代码风格五花八门。有些喜欢分号,有些讨厌分号;有些人缩进用2个空格,有些人用4个空格;还有人居然混用了空格和Tab。每次Code Review都得手动调整格式,简直要命。

Prettier配置踩坑记那些年我遇到的格式化难题

之前也没怎么认真搞过Prettier,就是简单的安装一下配个默认配置就完事了。这次想着干脆好好搞一套完整的配置,省得后面越来越乱。开始没想到这玩意儿还挺有讲究的,踩了不少坑。

基础配置就这么点东西

基础配置其实很简单,就是那些常用的选项:

module.exports = {
  // 换行长度
  printWidth: 80,
  // 缩进用2个空格
  tabWidth: 2,
  // 不用tab
  useTabs: false,
  // 行末分号
  semi: true,
  // 使用单引号
  singleQuote: true,
  // 对象属性的引号规则
  quoteProps: 'as-needed',
  // jsx双引号
  jsxSingleQuote: false,
  // 尾随逗号
  trailingComma: 'es5',
  // 大括号前的空格
  bracketSpacing: true,
  // jsx标签右边的空格
  jsxBracketSameLine: false,
  // 箭头函数参数括号
  arrowParens: 'avoid',
  // 行尾换行
  endOfLine: 'lf'
};

这些配置基本能满足大部分需求,但是实际项目中还是会遇到一些特殊情况。比如Vue文件里的template部分,有时候格式化结果不太理想。开始没想到这个问题,后面才发现需要额外配置。

最大的坑:和ESLint的冲突

项目里本来就有ESLint,接入Prettier的时候遇到了第一个大坑。两个工具在某些规则上冲突了,比如分号的问题。ESLint强制不加分号,Prettier默认加,结果格式化一次,ESLint报错一次,来回打架。

开始折腾了好久,各种查资料试方案。最后用了eslint-config-prettier这个包来解决冲突:

npm install --save-dev eslint-config-prettier eslint-plugin-prettier prettier
// .eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-recommended', 
    'prettier' // 这个要在最后
  ],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': 'error'
  }
};

这里要注意顺序,prettier这个extends一定要放在最后,不然会被其他规则覆盖掉。这个我踩了好几次坑才明白。

Vue和TypeScript的特殊处理

项目是Vue + TypeScript的,配置的时候发现有些特殊的语法支持不好。比如Vue的template里的一些特殊标签,还有TS的一些高级类型写法。

后来加了这两个插件解决问题:

{
  "devDependencies": {
    "@trivago/prettier-plugin-sort-imports": "^4.1.1",
    "@vue/compiler-sfc": "^3.2.0"
  }
}

配置文件也相应调整:

module.exports = {
  printWidth: 80,
  tabWidth: 2,
  useTabs: false,
  semi: true,
  singleQuote: true,
  trailingComma: 'es5',
  bracketSpacing: true,
  arrowParens: 'avoid',
  endOfLine: 'lf',
  // Vue文件的特殊处理
  vueIndentScriptAndStyle: true,
  // import排序
  importOrder: [
    '^@/(.*)$',
    '^[./]'
  ],
  importOrderSeparation: true,
  importOrderSortSpecifiers: true
};

这个importOrder的功能挺不错的,能把导入的模块按规则排序,避免每次手动调整。不过刚开始配置的时候有点复杂,得把规则写清楚,不然容易出错。

团队协作的配置问题

配置好本地之后,还要考虑团队协作的问题。有些同事用VSCode,有些用WebStorm,编辑器设置可能不一样。我测试了几种方案,最后选择了pre-commit钩子的方式。

安装husky和lint-staged:

npm install --save-dev husky lint-staged
{
  "lint-staged": {
    "*.{js,jsx,vue,ts,tsx}": [
      "prettier --write",
      "git add"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  }
}

这样每次提交代码都会自动格式化,保证入库的代码都是统一格式的。但是这里有个小问题,就是格式化的速度有时候比较慢,特别是文件比较多的时候。不过还好,大多数时候都能接受。

CI/CD集成也要注意

项目用的是GitLab CI,还得在流水线里加上格式检查。这个比较简单,在package.json里加个script就行:

{
  "scripts": {
    "format-check": "prettier --check "src/**/*.{js,jsx,vue,ts,tsx,json,css,scss}"",
    "format": "prettier --write "src/**/*.{js,jsx,vue,ts,tsx,json,css,scss}""
  }
}

CICD的配置文件里加上检查命令,如果格式不对就失败。这样能确保所有提交的代码都符合规范。

一些意外的小问题

用了几个月后发现一些小问题。比如某些特殊的JSON文件格式化后会出错,还有一些配置文件被格式化后反而不好读。后来在.prettierignore文件里把这些特殊文件排除掉了:

*.min.js
config/**
dist/**
node_modules/**
*.min.css

还有个问题是,有时候手动改了格式之后,IDE的格式化快捷键会把改动撤销掉。这个主要是编辑器配置的问题,不同IDE的prettier插件行为不太一样。现在大家都统一在settings.json里配置了相同的格式化规则,问题基本解决了。

回顾与反思

总体来说这套配置还是挺有用的,至少代码风格统一了,Code Review的压力小了很多。但是过程中确实踩了不少坑,特别是ESLint和Prettier的冲突问题,花了很长时间才解决好。

现在回头看,有几个地方还可以优化。比如format检查的速度还可以再快一点,某些特殊语法的支持还需要完善。不过目前的配置基本够用,暂时先这么用着吧。

另外想说的就是,配置这东西没有完美的,适合自己项目的就好。有时候为了追求完美反而耽误了开发效率,那就得不偿失了。这次的经验告诉我,先把基础配置搭好,遇到具体问题再针对性解决,这样更实用。

以上是我踩坑后的总结,希望对你有帮助。如果有更好的配置方案或者遇到类似问题,欢迎交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论