• EditorConfig + ESLint + Prettier 实现代码规范化


    前言

    接上文,本文主要记录下如何实现代码规范化。上文详见:Vite 3.x + Vue 3.x + TypeScript 4.x + Element Plus + Pinia 搭建项目_倔强的小绵羊的博客-CSDN博客

     一、集成 EditorConfig 配置

    官网地址:EditorConfig

    EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。

    在项目根目录下新增 .editorconfig 文件。

    1. # Editor configuration, see http://editorconfig.org
    2. # 表示是最顶层的 EditorConfig 配置文件
    3. root = true
    4. [*] # 表示所有文件适用
    5. charset = utf-8 # 设置文件字符集为 utf-8
    6. indent_style = space # 缩进风格(tab | space)
    7. indent_size = 2 # 缩进大小
    8. end_of_line = lf # 控制换行类型(lf | cr | crlf)
    9. trim_trailing_whitespace = true # 去除行首的任意空白字符
    10. insert_final_newline = true # 始终在文件末尾插入一个新行
    11. [*.md] # 表示仅 md 文件适用以下规则
    12. max_line_length = off
    13. trim_trailing_whitespace = false

    注意:VSCode 使用 EditorConfig 需要下载扩展插件 EditorConfig for VS Code

    二、集成 Prettier 配置

    官网:Prettier · Opinionated Code Formatter

    ①、安装 Prettier

    1. # npm
    2. npm install --save-dev --save-exact prettier
    3. # yarn
    4. yarn add --dev --exact prettier

    ②、创建 Prettier 配置文件

    echo {}> .prettierrc

     配置 .prettierrc

    1. # .prettierrc
    2. {
    3. "useTabs": false,
    4. "tabWidth": 2,
    5. "printWidth": 88,
    6. "singleQuote": true,
    7. "trailingComma": "none",
    8. "bracketSpacing": true,
    9. "semi": false
    10. }

    然后,创建一个 .prettierignore 文件,让 Prettier 和编辑器知道哪些文件不用格式化,例如:

    1. # .prettierignore
    2. node_modules
    3. dist

    ③、使用 Prettier 格式化所有文件

    1. # npm
    2. npx prettier --write .
    3. # yarn
    4. yarn prettier --write .

    注意:VSCode 编译器使用 Prettier 配置需要下载插件 Prettier - Code formatter。

    三、集成 ESLint 配置

    ①、安装 ESLint

    1. # npm
    2. npm install eslint --save-dev
    3. # yarn
    4. yarn add eslint --dev

    注意:VSCode 使用 ESLint 配置文件需要下载插件 ESLint。

    ②、配置 ESLint

    初始化命令:

    1. # npm
    2. npx eslint --init
    3. # yarn
    4. yarn eslint --init
    • 选择模式,本项目这里选择 To check syntax, find problems, and enforce code style(检查语法、发现问题并强制执行代码风格) 

      

    • 选择语言模块,本项目选择 JavaScript modules (import/export)

     

    • 选择语言框架,这里选择 Vue.js 

    • 项目是否使用 TypeScript,这里选择 Yes

    • 代码在哪里运行,这里选择 Browser 和 Node (按空格选择,选完后回车键确定)

    • 为项目定义风格,这里选择 Use a popular style guide(使用一种流行的风格指南)

    • 想遵循哪种风格指南,这里选择 Airbnb

    • 你希望配置文件是什么格式,这里选择 JavaScript

    • 现在安装它们吗,这里选择 Yes

    • 使用哪个包管理器,这里选择 yarn

     注意:如果自动安装依赖失败,那么需要手动安装

    1. # npm
    2. npm i @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-airbnb-base eslint-plugin-import eslint-plugin-vue -D
    3. # yarn
    4. yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-airbnb-base eslint-plugin-import eslint-plugin-vue -D

    ③、ESLint 配置文件

    上面操作完成后,在项目根目录下会自动生成 .eslintrc.cjs 文件。

    注意:这里为什么是 .cjs 文件,因为本项目是使用 vite3 构建,在 package.json 中设置了 "type": "module"

    1. // .eslintrc.cjs
    2. module.exports = {
    3. env: {
    4. browser: true,
    5. es2021: true,
    6. node: true
    7. },
    8. extends: ['plugin:vue/essential', 'airbnb-base'],
    9. parserOptions: {
    10. ecmaVersion: 'latest',
    11. parser: '@typescript-eslint/parser',
    12. sourceType: 'module'
    13. },
    14. plugins: ['vue', '@typescript-eslint'],
    15. rules: {}
    16. }

    根据项目实际情况,修改 .eslintrc.cjs 配置 。

    ④、修改 package.json 文件

    1. {
    2. "script": {
    3. ...
    4. "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix"
    5. }
    6. }

    ⑤、新增 ESLint 忽略文件

    在项目根目录下新增 .eslintignore 文件

    1. # .eslintignore
    2. node_modules
    3. dist
    4. index.html
    5. *.d.ts

    四、解决 ESLint 和 Prettier 冲突

    我们通常会在项目中根据实际情况添加一些额外的 ESLint 和 Prettier 配置规则,难免会存在规则冲突情况。

    解决两者冲突问题,需要用到 eslint-plugin-prettier 和 eslint-config-prettier。

    • eslint-plugin-prettier 将 Prettier 的规则设置到 ESLint 的规则中;
    • eslint-config-prettier 关闭 ESLint 中与 Prettier 中会发生冲突的规则

    最后形成优先级:Prettier 配置规则 > ESLint 配置规则。

    ①、安装插件

    1. # npm
    2. npm i eslint-plugin-prettier eslint-config-prettier -D
    3. # yarn
    4. yarn add eslint-plugin-prettier eslint-config-prettier -D

    ②、在 .eslintrc.cjs 中添加 Prettier 插件

    1. module.exports = {
    2. ...
    3. extends: [
    4. ...
    5. "plugin:prettier/recommended", // 插件约束规范 解决eslint和prettier的冲突问题
    6. ],
    7. }

    extends 代表继承多个规范。在继承的情况下,里面包含相同的规则,最后一个会把前面相同的规则覆盖掉。

    ③、本项目 .eslintrc.cjs 文件配置

    1. // @ts-check
    2. const { defineConfig } = require('eslint-define-config')
    3. module.exports = defineConfig({
    4. root: true,
    5. globals: { defineOptions: 'writable' },
    6. env: {
    7. browser: true,
    8. es2021: true,
    9. node: true
    10. },
    11. parser: 'vue-eslint-parser',
    12. parserOptions: {
    13. ecmaVersion: 'latest',
    14. parser: '@typescript-eslint/parser',
    15. sourceType: 'module'
    16. },
    17. extends: [
    18. 'plugin:vue/vue3-recommended',
    19. 'airbnb-base',
    20. 'plugin:@typescript-eslint/recommended',
    21. 'prettier',
    22. 'plugin:prettier/recommended'
    23. ],
    24. plugins: ['vue', '@typescript-eslint'],
    25. rules: {
    26. 'import/prefer-default-export': 'off',
    27. 'prettier/prettier': 'error',
    28. 'import/no-unresolved': 'off',
    29. 'import/extensions': 'off',
    30. 'import/no-absolute-path': 'off',
    31. 'import/no-extraneous-dependencies': 'off',
    32. 'vue/multi-word-component-names': 'off',
    33. 'no-undef': 0,
    34. 'vue/script-setup-uses-vars': 'error',
    35. 'vue/no-reserved-component-names': 'off',
    36. '@typescript-eslint/ban-ts-ignore': 'off',
    37. '@typescript-eslint/explicit-function-return-type': 'off',
    38. '@typescript-eslint/no-explicit-any': 'off',
    39. '@typescript-eslint/no-var-requires': 'off',
    40. '@typescript-eslint/no-empty-function': 'off',
    41. 'vue/custom-event-name-casing': 'off',
    42. 'vue/first-attribute-linebreak': [
    43. 'error',
    44. {
    45. singleline: 'ignore',
    46. multiline: 'below'
    47. }
    48. ],
    49. 'no-use-before-define': 'off',
    50. '@typescript-eslint/no-use-before-define': 'off',
    51. '@typescript-eslint/ban-ts-comment': 'off',
    52. '@typescript-eslint/ban-types': 'off',
    53. '@typescript-eslint/no-non-null-assertion': 'off',
    54. '@typescript-eslint/explicit-module-boundary-types': 'off',
    55. '@typescript-eslint/no-unused-vars': 'error',
    56. 'no-unused-vars': 'error',
    57. 'space-before-function-paren': 'off',
    58. 'vue/attributes-order': 'off',
    59. 'vue/one-component-per-file': 'off',
    60. 'vue/html-closing-bracket-newline': 'off',
    61. 'vue/max-attributes-per-line': 'off',
    62. 'vue/multiline-html-element-content-newline': 'off',
    63. 'vue/singleline-html-element-content-newline': 'off',
    64. 'vue/attribute-hyphenation': 'off',
    65. 'vue/require-default-prop': 'off',
    66. 'vue/require-explicit-emits': 'off',
    67. 'vue/html-self-closing': [
    68. 'error',
    69. {
    70. html: {
    71. void: 'always',
    72. normal: 'never',
    73. component: 'always'
    74. },
    75. svg: 'always',
    76. math: 'always'
    77. }
    78. ]
    79. }
    80. })

     

     参考文章:从 0 开始手把手带你搭建一套规范的 Vue3.x 项目工程环境 - 掘金

  • 相关阅读:
    排序算法(基于c++)
    python pandas提取正无穷inf与负无穷-inf所在数据行/列
    B-树(B-Tree)与二叉搜索树(BST):讲讲数据库和文件系统背后的原理(读写比较大块数据的存储系统数据结构与算法原理)...
    细解“微服务”架构体系——SpringCloud Alibaba!
    Spring总结1.0
    int、Integer、new Integer和Integer.valueOf()的 ==、equals比较
    前端面试题之HTML篇
    C#开发的OpenRA游戏之信标按钮
    5 - 2 单选题
    目标与学习方向
  • 原文地址:https://blog.csdn.net/lhz_333/article/details/126407788