前端代码风格实践 prettier + ESLint + Git Hook + lint-staged

solvep 2020-11-09 10:50:24
前端 代码 prettier 实践 风格


image

整洁的代码如同优美的散文。—— Grady Booch

前言: 在繁杂的业务迭代时,接手其他项目,如果没有一个统一的代码风格,阅读起来是相当困难的,毕竟团队里的每个人习惯不一样。团队协作,意味着需要牺牲一些个性,减少一些没必要的争吵。

1.Prettier是什么?

顾名思义 prettier(更漂亮的),让你的代码更漂亮。官网说的很清楚了

  • An opinionated code formatter
  • Supports many languages
  • Integrates with most editors
  • Has few options

很少的配置,意味着强约制,也遵循了第一条 opinionated 。what-is-opinionated-software,简单来说就是强约制,给你选择的机会少。这种设计理念用在 代码风格统一 的工具上是极其正确的,目的就是统一,少量的配置,让团队停止争吵。

2.ESlint是什么

ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于2013年6月创建。代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。

ESLint 是一个代码检查工具,它能够被开发者灵活的配置option,使其能够满足制定好的代码规范的要求。

tip:前端代码不管TS还是ES,都用ESLint, TSLint已经不在维护了

3.Prettier 和 ESLint 的区别

我开始的时候也认为这两个东西好像有点重复,确实有交集,不过Prettier 只会做代码风格的统一,并不会检查代码规范,关于代码规范的检查应该交给 ESLint。

ESLint 主要解决的是代码规范,虽然ESLint也可以解决一些代码风格问题,但做的不够好, 而prettier就是为了 format 而生的工具。

总结:ESLint 专注于全方位的 Lint 检查,Prettier 专注于代码格式化相关。

4.实践

4.1配置 eslint

npm i -D eslint
//.eslintrc.js
module.exports = {
root: true,
env: {
node: true
},
extends: ['eslint:recommended'],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
//强制使用单引号
quotes: ['error', 'single'], // 看这里,是不是和prettier做了重复的事情,可删哦~
//强制不使用分号结尾
semi: ['error', 'never']
},
parserOptions: {
parser: 'babel-eslint',
ecmaVersion: 6 // 支持es6
}
}

4.2配置 prettier

npm i -D prettier
// .prettierrc.js
module.exports = {
// 一行最多 100 字符
printWidth: 100,
// 使用 4 个空格缩进
tabWidth: 2,
// 不使用缩进符,而使用空格
useTabs: false,
// 行尾需要有分号
semi: false,
// 使用单引号
singleQuote: true,
// 对象的 key 仅在必要时用引号
quoteProps: 'as-needed',
// jsx 不使用单引号,而使用双引号
jsxSingleQuote: false,
// 末尾不需要逗号
trailingComma: 'none',
// 大括号内的首尾需要空格
bracketSpacing: true,
// jsx 标签的反尖括号需要换行
jsxBracketSameLine: false,
// 箭头函数,只有一个参数的时候,也需要括号
arrowParens: 'always',
// 每个文件格式化的范围是文件的全部内容
rangeStart: 0,
rangeEnd: Infinity,
// 不需要写文件开头的 @prettier
requirePragma: false,
// 不需要自动在文件开头插入 @prettier
insertPragma: false,
// 使用默认的折行标准
proseWrap: 'preserve',
// 换行符使用 lf
endOfLine: 'lf'
}

4.3 ESLint 与 Prettier配合使用

npm i -D eslint-plugin-prettier
//.eslintrc.js
module.exports = {
rules: {
'prettier/prettier': 'error' // 标记
},
"extends": ["plugin:prettier/recommended"] // 插件
}

如果是vue的项目记得加上, "plugin:vue/essential"也要安装哦~

npm i -D eslint-plugin-vue

eslint-plugin-prettier插件会调用prettier对你的代码风格进行检查,其原理是先使用prettier对你的代码进行格式化,然后与格式化之前的代码进行对比,如果过出现了不一致,这个地方就会被prettier进行标记。

当执行ESLint fix的时候prettier的lint冲突会被ESLint当做错误处理

4.4 解决eslint和prettier的冲突

上文提到,ESLint 与格式化相关的 rule 和 prettier 的 rule 有些重叠,如果想把格式化相关的事情都交给 prettier 去做,使用这个工具可以屏蔽掉 ESLint 与格式化相关的 rule。

安装 eslint-config-prettier 即可

npm i -D eslint-config-prettier

4.5安装 lint-staged husky

npm install husky lint-staged
// package.json
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js, css, md}": "eslint --fix"
},

4.6 最后 vscode配置

打开配置文件 setting.json

//setting.json
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true, // 保存时自动执行eslint
},
}

5.总结

配置完 基情享受同事的的拥抱吧!

版权声明
本文为[solvep]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000037768150

  1. [front end -- JavaScript] knowledge point (IV) -- memory leakage in the project (I)
  2. This mechanism in JS
  3. Vue 3.0 source code learning 1 --- rendering process of components
  4. Learning the realization of canvas and simple drawing
  5. gin里获取http请求过来的参数
  6. vue3的新特性
  7. Get the parameters from HTTP request in gin
  8. New features of vue3
  9. vue-cli 引入腾讯地图(最新 api,rocketmq原理面试
  10. Vue 学习笔记(3,免费Java高级工程师学习资源
  11. Vue 学习笔记(2,Java编程视频教程
  12. Vue cli introduces Tencent maps (the latest API, rocketmq)
  13. Vue learning notes (3, free Java senior engineer learning resources)
  14. Vue learning notes (2, Java programming video tutorial)
  15. 【Vue】—props属性
  16. 【Vue】—创建组件
  17. [Vue] - props attribute
  18. [Vue] - create component
  19. 浅谈vue响应式原理及发布订阅模式和观察者模式
  20. On Vue responsive principle, publish subscribe mode and observer mode
  21. 浅谈vue响应式原理及发布订阅模式和观察者模式
  22. On Vue responsive principle, publish subscribe mode and observer mode
  23. Xiaobai can understand it. It only takes 4 steps to solve the problem of Vue keep alive cache component
  24. Publish, subscribe and observer of design patterns
  25. Summary of common content added in ES6 + (II)
  26. No.8 Vue element admin learning (III) vuex learning and login method analysis
  27. Write a mini webpack project construction tool
  28. Shopping cart (front-end static page preparation)
  29. Introduction to the fluent platform
  30. Webpack5 cache
  31. The difference between drop-down box select option and datalist
  32. CSS review (III)
  33. Node.js学习笔记【七】
  34. Node.js learning notes [VII]
  35. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  36. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  37. 【JQuery框架,Java编程教程视频下载
  38. [jQuery framework, Java programming tutorial video download
  39. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  40. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  41. 【Vue,阿里P8大佬亲自教你
  42. 【Vue基础知识总结 5,字节跳动算法工程师面试经验
  43. [Vue, Ali P8 teaches you personally
  44. [Vue basic knowledge summary 5. Interview experience of byte beating Algorithm Engineer
  45. 【问题记录】- 谷歌浏览器 Html生成PDF
  46. [problem record] - PDF generated by Google browser HTML
  47. 【问题记录】- 谷歌浏览器 Html生成PDF
  48. [problem record] - PDF generated by Google browser HTML
  49. 【JavaScript】查漏补缺 —数组中reduce()方法
  50. [JavaScript] leak checking and defect filling - reduce() method in array
  51. 【重识 HTML (3),350道Java面试真题分享
  52. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  53. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  54. [re recognize HTML (3) and share 350 real Java interview questions
  55. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  56. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  57. 【重识 HTML ,nginx面试题阿里
  58. 【重识 HTML (4),ELK原来这么简单
  59. [re recognize HTML, nginx interview questions]
  60. [re recognize HTML (4). Elk is so simple