ESLint+Prettier+Vetur 前端代码规范配置说明

224 阅读2分钟

脚手架创建项目时已选择安装ESLint,可直接从step2开始

step 1️⃣ 相关依赖下载

配置清单

VSCode插件清单依赖清单功能说明
ESLint v2.2.2eslint@6.8.0代码检查核心包
Prettier v9.1.0eslint-friendly-formatter@4.0.1友好处理报错行信息,可直接定位具体报错位置
Vetur v0.35.0eslint-plugin-vue@6.2.2校验Vue单文件规则
prettier@1.19.1代码风格统一
eslint-plugin-prettier@3.3.1让ESLint调用Prettier格式化代码
eslint-config-prettier@6.0.0去掉ESLint中Prettier里已经重复定义的项
@typescript-eslint/eslint-plugin@2.34.0校验ts的一些规则
@typescript-eslint/parser@2.34.0解析typescript
eslint-loaderwebpack转换eslint语法

1.1 安装依赖

  • //npm i 上面表格中提到的依赖 -D
    ​
    npm i eslint@6.8.0 eslint-friendly-formatter@4.0.1 eslint-plugin-vue@6.2.2 eslint-plugin-prettier@3.3.1 eslint-config-prettier@6.0.0 prettier@1.19.1 -D
    ​
    //TS 项目 
    npm i @typescript-eslint/eslint-plugin@2.34.0 @typescript-eslint/parser@2.34.0 -D
    

1.2 初始化配置文件

  • eslint --init
    

1.3 webpack

 rules: [
        // ...
        { 
            test: /.(js|vue)$/,
            loader: 'eslint-loader',
            enforce: 'pre',
            include: [ path.resolve(commonDir, '../index.js'), resolve('./pages'), resolve('./components')], // 
            options: {
                formatter: require('eslint-friendly-formatter')
            }
        }
    ]

step 2️⃣ 项目配置

2.1 新建eslintrc.js文件

在根目录下新建eslintrc.js文件,该文件中定义了ESLint的基础配置

module.exports = {
    root: true,
    env: {
        node: true,
        browser: true,
        es6: true
    },
    extends: [
        'plugin:vue/essential',
        "plugin:prettier/recommended", //解决 eslint 和 prettier 校验重复部分
        'eslint:recommended',
        '@vue/typescript/recommended',//cli3.X or cli4.X
        //'plugin:@typescript-eslint/recommended',//cli2.X
        'prettier/@typescript-eslint',
    ],
    // 优先级低于parser的语法解析配置
    parserOptions: {
        ecmaVersion: 2020,
        sourceType: "module"
    },
    // 默认前缀 eslint-plugin-
    // plugins: ['vue'],
    rules: {
        eqeqeq: ['off'],
        'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
        'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
        'space-before-blocks': [2, 'always'],
        'comma-dangle': [2, 'never'],
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-unused-vars': 'off',
        '@typescript-eslint/no-empty-function': 'off',
        '@typescript-eslint/camelcase': 'off',
        'no-unused-vars': 'off',
    },
    overrides: [{
        files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
        env: {
            jest: true
        }
    }]
};
​

2.2 新建prettier.config.js

module.exports = {
    // 一行最多 100 字符
    printWidth: 100,
    // 使用 4 个空格缩进
    tabWidth: 4,
    // 不使用缩进符,而使用空格
    useTabs: false,
    // 行尾需要有分号
    semi: true,
    // 使用单引号
    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,
    // 行尾换行格式
    endOfLine: 'auto',
    // 根据显示样式决定 html 要不要折行
    htmlWhitespaceSensitivity: 'css'
};
​

2.3修改vscode中的settings.json

在原有基础上新增即可

{
      ...
     //code format config start
    
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
    "[vue]": {
        "editor.defaultFormatter": "octref.vetur"
    },
    "[javascript]": {
        "editor.defaultFormatter": "vscode.typescript-language-features"
    },
    "[typescript]": {
        "editor.defaultFormatter": "vscode.typescript-language-features"
    },
​
    // #每次保存的时候自动格式化 
    "editor.formatOnSave": true,
    "eslint.enable": true,  //是否开启vscode的eslint
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true,
    },
    "eslint.validate": [     
        "javascript",
        "javascriptreact",
        {
            "language": "html",
            "autoFix": true
        },
        {
            "language": "vue",
            "autoFix": true
        },
        {
            "language": "typescript",
            "autoFix": true
        },
        {
            "language": "typescriptreact",
            "autoFix": true
        }
    ],
    
    "vetur.format.defaultFormatter.js": "vscode-typescript",
    "vetur.format.defaultFormatterOptions": {
        "js-beautify-html": {
            "wrap_attributes": "force-aligned"
        }
    },
    //end
    ...
}
  • \