
一、背景:
开发Vue或者React的项目的时候,我们经常用到ESLint进行代码的校验,ESLint极大的提高了团队代码的一致性和规范性,可以减少许多低级错误。
当代码出现不符合规范的格式的时候,ESLint会在控制台提示相关的异常信息,手动修复无疑带来了极大的编码成本。
但如果ESLint的配置可以自动修复代码和格式化的话,这将极大的提高我们的生产力。
ESLint 可以检测出你代码中潜在的问题,比如使用了某个变量却忘记了定义,而 Prettier 作为代码格式化工具,能够统一你或者你的团队的代码风格。
使用工具去约束规范,比单纯的口头约定有更强的约束性,而且过程是无感知的。
本文将详细介绍 vscode 下使用 vetur + prettier + eslint 来统一 vue 编码风格,并强制加入规范到项目代码中,最后通过自动化的格式化方式来保障团队代码质量
二、IDE&插件:
- 编辑器:vscode
- 插件
npm
- eslint
- babel-eslint
- eslint-plugin-vue
- prettier
- eslint-plugin-prettier
- eslint-config-prettier
- lint-staged
- husky
关键配置文件
- .editorconfig // 字符集配置,
缩进等配置 - .eslintrc.js // eslint(npm)配置,ide eroor/warning 信息在这里配置
- .eslintignore // eslint 排除文件,如一些库文件
- .editorconfig // 字符集配置,
三、安装与配置:
1. 使用EditorConfig配置IDE和编辑器
EditorConfig允许您为任何文件类型定义缩进样式和其他空白设置。这样您的编辑器就可以自动选择正确的设置。当开发人员使用具有不同行结尾的平台时,例如Mac和Windows,这很方便。
以下是典型的配置(.editorconfig),其中包含Markdown,JSON和YAML文件的单独规则:
.editorconfig
root = true[*.{js,jsx,ts,tsx,vue}]indent_style = spaceend_of_line = lfcharset = utf-8trim_trailing_whitespace = trueinsert_final_newline = true[*.{json,yml,md}]indent_style = spaceindent_size = 2
EditorConfig由流行的IDE和编辑器通过插件提供支持。
2. 配置prettier、eslint、vetur
vscode搜索插件 Eslint、Vetur、Prettier安装
Prettier是一个有见识的代码格式化工具。它通过解析代码并使用自己的规则重新打印它,并考虑最大行长来强制执行一致的样式,并在必要时包装代码。
如今,它已成为解决所有代码格式问题的优选方案;支持 JavaScript、 Flow、 TypeScript、 CSS、 SCSS、 Less、 JSX、 Vue、 GraphQL、 JSON、 Markdown 等语言,
Prettier具有以下几个有优点:
- 几乎不需要做决定,因为 Prettier 的配置选项很少。
- 团队成员不需要为规则去争论。
- 开源代码开发者不需要去学习项目的代码风格。
- 不需要去修复 ESLint 报告的风格问题。
- 保存文件的时候可以自动统一风格。
Prettier 可以在保存文件的时候可以自动统一风格:
For 老项目如果你的项目中采用的是eslint默认规则并且没有添加别的规则、没有使用standard或airbnb等风格预设,你可以下载编辑器插件,prettier 覆盖 vscode 默认格式化快捷键,但没有针对 eslint 配置进行格式化,所以需要单独配置用户设置开启。
找到 首选项->设置 菜单,在右侧 用户配置 中添加 "prettier.eslintIntegration": true 开启 eslint 支持。
以下配置是推荐配置
"eslint.autoFixOnSave": true, //保存时自动修复eslint错误"eslint.validate": [ //eslint 验证文件类型"javascript","javascriptreact","jsx",{"language": "html","autoFix": true},{"language": "vue","autoFix": true}],,对于老项目可能会导致保存时批量格式化后样式变动的问题,但你任然可以通过 option + shift + f 来使用prettier插件格式化
For 新项目
新项目可以采用更加严格的规范保障代码质量。使得代码库从刚开始编写,风格就是符合标准的, 此时,我们可以将 eslint 和 prettier 的风格配置安装到项目中
安装prettier
npm install prettier eslint-config-prettier eslint-plugin-prettier -D |
|---|
安装eslint
npm install eslint eslint-plugin-vue babel-eslint -D |
|---|
集成 eslint & prettier
eslint-plugin-prettier 公开了一个 “recommended” 配置,将 plugin:prettier/recommended 添加到 extends 的子属性 plugin:vue/essential 之后,以默认设置在 ESLint 中启用对 Prettier 的支持:
eslint-plugin-prettier 扩展了eslint的规则,它通过对比格式化前和用 Prettier 格式化后的代码,有不一致的地方就会报错,然后你可以手动运行 eslint —fix 来修复。
.eslintrc.js
module.exports = {root: true,env: {node: true},plugins: ['vue'],rules: {},parserOptions: {parser: 'babel-eslint' // 增加对es6的语法支持},extends: ['plugin:vue/essential','plugin:vue/recommended',"plugin:prettier/recommended", //使用prettier 推荐配置'prettier/vue' //忽略 eslint里vue 和 prettier冲突的部分,采用prettier的规则]
禁用eslint 起冲突规则的部分
不过 Prettier 的格式化很可能和你使用的 ESLint 配置冲突,比如你的 ESLint 设定的不使用分号,而 Prettier 默认使用分号,这时候你需要配置 Prettier 让它不使用分号。反之如果你想使用 Prettier 的规则而不是 ESLint 的,为防止 ESLint 报错。
您需要知道的是,两者混合使用时候,需要修改规则,以防止重复或冲突;eslint-config-prettier即为解决此问题的存在,可以使用它关闭所有可能引起冲突的规则,eslint-config-prettier 是一个配置包,具体使用的时候应该这样加,确保prettier相关配置总是在最后,不然规则可能被覆盖
{"extends": ["some-other-config-you-use","prettier","prettier/@typescript-eslint","prettier/babel","prettier/flowtype","prettier/react","prettier/standard","prettier/unicorn","prettier/vue"]}
如果你使用了一种代码风格,比如airbnb,但是和prettier又有起冲突的部分,建议添加 "prettier/that-plugin",假如 eslint-config-airbnb 启用了 eslint-plugin-react规则,那 prettier/react 是需要的
{"extends": ["airbnb","prettier","prettier/react"]}
eslint-config-prettier还附带一个CLI工具,可帮助您检查配置是否包含任何不必要的规则或与Prettier冲突的规则。
首先,为package.json添加一个脚本:
{"scripts":{"eslint-check":"eslint --print-config。| eslint-config-prettier-check"}}
然后运行 npm run eslint-check。
退出代码:
- 0:没有发现问题。
- 1:意外错误。
- 2:发现冲突规则。
修改prettier规则配置
事实上,当在项目中如此配置,可能会出现些“诡异”的报错,即便采用如上修复,也无法解决;而且这也不是您预期的提示;
error: Delete ⏎ (prettier/prettier) at src/pages/xxx
此时,可以对规则进行甄别、梳理,择选出适宜的规则;对于此,您可以参考 Configuring Prettier Options & eslint-plugin-prettier#options;依据个人编码习惯,有采取如下配置:
rules: {'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off','no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',"vue/attributes-order":'error', // vue 里属性按规律排序"prettier/prettier": ['error',{"singleQuote": true,"semi":false, // 更多自定义规则 https://prettier.io/docs/en/options.html}]}
至此,项目代码里已经配置了严格的 eslint + prettier 代码风格约定,command + s 时刻保存,就会帮你格式化代码,形成统一的团队代码风格
3. Pre-commit约束代码提交
以上探讨了如何运用 ESLint & Prettier 写出优质代码,这都是针对个人的推荐性行为;为保证团队统一代码风格,则必须采取些手段以强制约束;假如您的团队使用 Git 作为代码管理工具,在 commit 行为及之前进行甄别约束,是很棒的选择;于此,可借助 husky & lint-staged 来实现之。
# install husky & lint-stagednpm install lint-staged husky -D# package.json config{"lint-staged": {"linters": {"*.{js,vue}": [//"eslint --fix", # 自动修复代码eslint错误和格式化,这个按需使用"eslint","git add"]},"ignore": ["**/dist/*.js"]}}
值得一提的是,在实际项目中, husky 很可能由于各种原因,导致不能很好的工作;这多半是由于 .git/hooks/pre-commit 与期待目标不匹配所致,您可以手动修改,也可以采取如下办法 (备注:如果您的 husky 版本在 0.14 及以上):
四、 写在最后
在编写高质量代码时付出的努力越多,花在调试上的时间就越少。如果为项目开发工作流程,做了足够充分而适宜的建设,这不仅可以极大提升代码编写质量与速度,同时可节省调试、解决问题时间开销,而且还能避免无端而起的坏心情,从而更进一步促进工作效率,如此造就的这份优质循环,可以使得您拥有更多时间去学习、折腾、品味人生
