module.exports = { root: true, env: { browser: true, es2021: true, node: true, }, extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:vue/vue3-recommended', ], parser: 'vue-eslint-parser', parserOptions: { ecmaVersion: 'latest', parser: '@typescript-eslint/parser', sourceType: 'module', }, plugins: ['@typescript-eslint', 'vue'], rules: { // TypeScript 规则 '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', }, ], '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-non-null-assertion': 'warn', // Vue 规则 'vue/multi-word-component-names': 'off', 'vue/no-v-html': 'error', // 防止 XSS 攻击 'vue/component-api-style': ['error', ['script-setup']], 'vue/component-name-in-template-casing': ['error', 'PascalCase'], 'vue/custom-event-name-casing': ['error', 'camelCase'], 'vue/define-macros-order': [ 'error', { order: ['defineProps', 'defineEmits'], }, ], 'vue/html-comment-content-spacing': ['error', 'always'], 'vue/no-unused-refs': 'error', 'vue/no-useless-v-bind': 'error', 'vue/padding-line-between-blocks': ['error', 'always'], 'vue/prefer-separate-static-class': 'error', // 一般规则 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'warn', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'warn', 'prefer-const': 'error', 'no-var': 'error', 'object-shorthand': ['error', 'always'], 'prefer-template': 'error', 'prefer-arrow-callback': 'error', }, ignorePatterns: ['dist', 'node_modules', '*.config.js', '*.config.ts'], }