module.exports = { root: true, env: { browser: true, es2021: true, node: true, }, extends: [ 'plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended' ], /* * 解决引入ts文件import xxx (不带文件后缀) eslint报错问题 * https://stackoverflow.com/questions/55198502/using-eslint-with-typescript-unable-to-resolve-path-to-module * */ // settings: { // "import/resolver": { // "node": { // "paths": ["src"], // "extensions": [".js", ".jsx", ".ts", ".tsx"] // } // } // }, parser: "vue-eslint-parser", parserOptions: { parser: '@typescript-eslint/parser', ecmaVersion: "latest", sourceType: 'module' }, plugins: [ '@typescript-eslint' ], rules: { // 使用单引号 /* 示例 // bad code let str = "hello world" // good code let str = 'hello world' */ 'quotes': ['error', 'single'], // 三等号 /* 示例 // bad code if (a == b) {} // good code if (a === b) {} */ 'eqeqeq': ['error', 'always'], // 禁止出现未使用过的变量 'no-unused-vars': 'error', // 强制在关键字前后使用一致的空格 /* 示例 // bad code if (foo) { //... }else if (bar) { //... }else { //... } // good code if (foo) { //... } else if (bar) { //... } else { //... } */ 'keyword-spacing': [ 'error', { 'overrides': { 'if': { 'after': true }, 'for': { 'after': true }, 'while': { 'after': true }, 'else': { 'after': true } } } ], // https://eslint.org/docs/rules/camelcase 'camelcase': ['error', {'properties': 'never'}], // 缩进使用 4 个空格,并且 switch 语句中的 Case 需要缩进 // https://eslint.org/docs/rules/indent 'indent': ['error', 4, { 'SwitchCase': 1, 'flatTernaryExpressions': true }], // 数组的括号内的前后禁止有空格 // https://eslint.org/docs/rules/array-bracket-spacing /* 示例 // bad code const foo = [ 'foo' ]; const foo = [ 'foo']; const foo = ['foo' ]; const foo = [ 1 ]; // good code const foo = ['foo']; const foo = [1]; */ 'array-bracket-spacing': ['error', 'never'], // 需要在操作符之前放置换行符 // https://eslint.org/docs/rules/operator-linebreak // 'operator-linebreak': ['error', 'before'], // 在开发阶段打开调试 (区分stag prod) // https://eslint.org/docs/rules/no-debugger 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // 只有一个参数时,箭头函数体可以省略圆括号 // https://eslint.org/docs/rules/arrow-parens 'arrow-parens': 'off', // 禁止空语句(可在空语句写注释避免),允许空的 catch 语句 // https://eslint.org/docs/rules/no-empty /* 示例 // bad code if (foo) { } while (foo) { } // good code if (foo) { // empty } */ 'no-empty': ['error', {'allowEmptyCatch': true}], // 禁止在语句末尾使用分号 // https://eslint.org/docs/rules/semi /* 示例 // bad code const obj = {}; // good code const obj = {} */ 'semi': ['error', 'never'], // 函数圆括号之前没有空格(挺有争议的) // https://eslint.org/docs/rules/space-before-function-paren /* 示例 // bad code function foo () { // ... } const bar = function () { // ... } // good code function foo() { // ... } const bar = function() { // ... } */ 'space-before-function-paren': ['error', { 'anonymous': 'never', // 匿名函数表达式 'named': 'never', // 命名的函数表达式 'asyncArrow': 'never' // 异步的箭头函数表达式 }], // 禁止行尾有空格 // https://eslint.org/docs/rules/no-trailing-spaces 'no-trailing-spaces': ['error'], // 注释的斜线或 * 后必须有空格 // https://eslint.org/docs/rules/spaced-comment /* 示例 // bad code //This is a comment with no whitespace at the beginning // good code // This is a comment with a whitespace at the beginning */ 'spaced-comment': ['error', 'always', { 'line': { 'markers': ['*package', '!', '/', ',', '='] }, 'block': { // 前后空格是否平衡 'balanced': false, 'markers': ['*package', '!', ',', ':', '::', 'flow-include'], 'exceptions': ['*'] } }], // https://eslint.org/docs/rules/no-template-curly-in-string // 禁止在字符串中使用字符串模板。不限制 'no-template-curly-in-string': 'off', // https://eslint.org/docs/rules/no-useless-escape // 禁止出现没必要的转义。不限制 'no-useless-escape': 'off', // https://eslint.org/docs/rules/no-var // 禁止使用 var 'no-var': 'error', // https://eslint.org/docs/rules/prefer-const // 如果一个变量不会被重新赋值,必须使用 `const` 进行声明。 /* 示例 // bad code let a = 3 console.log(a) // good code const a = 3 console.log(a) */ 'prefer-const': 'error', // eslint-plugin-vue@7 新增的规则,暂时先全部关闭 'vue/valid-v-slot': 'error', 'vue/experimental-script-setup-vars': 'off', // 不允许数组括号内有空格 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/array-bracket-spacing.md /** * 示例 * bad code * var arr = [ 'foo', 'bar' ]; * var arr = ['foo', 'bar' ]; * var [ x, y ] = z; * * good code * var arr = ['foo', 'bar', 'baz']; * var arr = [['foo'], 'bar', 'baz']; * var [x, y] = z; */ 'vue/array-bracket-spacing': ['error', 'never'], // 在箭头函数的箭头之前/之后需要空格 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/arrow-spacing.md /** * 示例 * bad code * ()=> {}; * () =>{}; * (a)=> {}; * (a) =>{}; * * good code * () => {}; * (a) => {}; * a => a; * () => {'\n'}; */ 'vue/arrow-spacing': ['error', {'before': true, 'after': true}], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/attribute-hyphenation.md // vue html 属性小写,连字符 /** * 示例 * bad code * * * good code * */ 'vue/attribute-hyphenation': ['error', 'always'], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/attributes-order.md // 属性顺序,不限制 'vue/attributes-order': 'off', // 在打开块之后和关闭块之前强制块内的空格 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/block-spacing.md /** * 示例 * bad code * function foo() {return true;} * if (foo) { bar = 0;} * (a) =>{};function baz() {let i = 0; * return i; * } * * good code * function foo() { return true; } * if (foo) { bar = 0; } */ 'vue/block-spacing': ['error', 'always'], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/camelcase.md // 后端数据字段经常不是驼峰,所以不限制 properties,也不限制解构 /** * 示例 * bad code * import { no_camelcased } from "external-module" * var my_favorite_color = "#112C85"; * obj.do_something = function() { * // ... * }; * * good code * import { no_camelcased as camelCased } from "external-module"; * var myFavoriteColor = "#112C85"; * var _myFavoriteColor = "#112C85"; * var myFavoriteColor_ = "#112C85"; */ 'vue/camelcase': ['error', {'properties': 'never'}], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/comma-dangle.md // 禁止使用拖尾逗号,如 {demo: 'test',} /** * 示例 * bad code * var foo = { * bar: "baz", * qux: "quux", * var arr = [1,2,]; * }; * * good code * var foo = { * bar: "baz", * qux: "quux" * var arr = [1,2]; */ 'vue/comma-dangle': ['error', 'never'], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/comment-directive.md // vue 文件 template 中允许 eslint-disable eslint-enable eslint-disable-line eslint-disable-next-line // 行内注释启用/禁用某些规则,配置为 1 即允许 /** * 示例 * bad code *
* * good code *
*/ 'vue/comment-directive': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/component-name-in-template-casing.md // 组件 html 标签的形式,连字符形式,所有 html 标签均会检测,如引入第三方不可避免,可通过 ignores 配置,支持正则,不限制 'vue/component-name-in-template-casing': 'off', // 需要 === 和 !==,不将此规则应用于null // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/eqeqeq.md /** * 示例 * bad code * if (x == 42) { } * if ("" == text) { } * if (obj.getStuff() != undefined) { } * var arr = [1,2,]; * }; * * good code * a === b * foo === true * bananas !== 1 * value === undefined */ 'vue/eqeqeq': ['error', 'always', {'null': 'ignore'}], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-closing-bracket-newline.md // 单行写法不需要换行,多行需要,不限制 'vue/html-closing-bracket-newline': 'off', // 自关闭标签需要空格 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-closing-bracket-spacing.md /* 示例
*/ 'vue/html-closing-bracket-spacing': ['error', { 'startTag': 'never', 'endTag': 'never', 'selfClosingTag': 'always' }], // 标签必须有结束标签 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-end-tags.md /* 示例

*/ 'vue/html-end-tags': 'error', // html的缩进.在多行情况下,属性不与第一个属性垂直对齐 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-indent.md /* 示例
*/ 'vue/html-indent': ['error', 4, { 'attribute': 1, 'baseIndent': 1, 'closeBracket': 0, 'alignAttributesVertically': false, // 在多行情况下,属性是否应与第一个属性垂直对齐 'ignores': [] }], // html属性引用采用双引号 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-quotes.md /* 示例 */ 'vue/html-quotes': ['error', 'double'], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-self-closing.md // html tag 是否自闭和,不限制 'vue/html-self-closing': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/jsx-uses-vars.md // 当变量在 `JSX` 中被使用了,那么 eslint 就不会报出 `no-unused-vars` 的错误。需要开启 eslint no-unused-vars 规则才适用 /* import HelloWorld from './HelloWorld'; export default { render () { return ( ) }, } 此时不会报 `no-unused-vars` 的错误,仅警告 */ 'vue/jsx-uses-vars': 'warn', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/key-spacing.md // 属性定义,冒号前没有空格,后面有空格 /* 示例 // bad code const obj = { a:1 } // good code const obj = { a: 1 } */ 'vue/key-spacing': ['error', {'beforeColon': false, 'afterColon': true}], // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/match-component-file-name.md // 组件名称属性与其文件名匹配,不限制 'vue/match-component-file-name': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/max-attributes-per-line.md // 每行属性的最大个数,不限制 'vue/max-attributes-per-line': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/multiline-html-element-content-newline.md // 在多行元素的内容前后需要换行符,不限制 'vue/multiline-html-element-content-newline': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/mustache-interpolation-spacing.md // template 中 {{var}},不限制 'vue/mustache-interpolation-spacing': 'off', // name属性强制使用连字符形式 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/name-property-casing.md /* 示例 // bad code export default { name: 'MyComponent' } // good code export default { name: 'my-component' } */ 'vue/name-property-casing': ['error', 'kebab-case'], // 禁止在计算属性中执行异步操作 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-async-in-computed-properties.md /* 示例 computed: { // bad code pro () { return Promise.all([new Promise((resolve, reject) => {})]) }, foo1: async function () { return await someFunc() }, bar () { return fetch(url).then(response => {}) }, tim () { setTimeout(() => { }, 0) }, inter () { setInterval(() => { }, 0) }, anim () { requestAnimationFrame(() => {}) }, // good code foo () { var bar = 0 try { bar = bar / this.a } catch (e) { return 0 } finally { return bar } }, } */ 'vue/no-async-in-computed-properties': 'error', // 禁止布尔默认值,不限制 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-boolean-default.md 'vue/no-boolean-default': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-confusing-v-for-v-if.md 'vue/no-confusing-v-for-v-if': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-dupe-keys.md // 属性名禁止重复 /* 示例 // bad code person: { age: '', age: '' } // good code person: { age: '', name: '' } */ 'vue/no-dupe-keys': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-duplicate-attributes.md // 禁止 html 元素中出现重复的属性 /* 示例 // bad code
// good code
*/ 'vue/no-duplicate-attributes': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-multi-spaces.md // 删除 html 标签中连续多个不用于缩进的空格 /* 示例 // bad code
// good code
*/ 'vue/no-multi-spaces': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-parsing-error.md // 禁止语法错误 /* 示例 // bad code
// good code
*/ 'vue/no-parsing-error': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-reserved-keys.md // 禁止使用保留字,包括Vue /* 示例 // bad code props: { $nextTick () {} } // good code props: { next () {} } */ 'vue/no-reserved-keys': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-restricted-syntax.md // 禁止使用特定的语法,不限制 'vue/no-restricted-syntax': 'off', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-shared-component-data.md // data 属性必须是函数 /* 示例 // bad code data: { } // good code data() { return {} } */ 'vue/no-shared-component-data': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-side-effects-in-computed-properties.md // 禁止在计算属性对属性进行修改,不限制 'vue/no-side-effects-in-computed-properties': 'off', // 不允许在属性中的等号周围有空格 // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-spaces-around-equal-signs-in-attribute.md /* 示例 // bad code
// good code
*/ 'vue/no-spaces-around-equal-signs-in-attribute': 'error', // https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-template-key.md // 禁止在