Vue Vite 项目增加 eslint 和 prettier
Eslint 版本为 8.X
1. 安装 8.X 版本的 eslint
pnpm i eslint@^8.57.0 -D
2. 安装 eslint 以及 prettier 以及一堆依赖
pnpm i eslint eslint-plugin-vue @vue/eslint-config-prettier prettier eslint-plugin-prettier eslint-config-prettier eslint-plugin-import -D
3. 安装 TS 依赖
pnpm i @typescript-eslint/parser @typescript-eslint/eslint-plugin -D
4. 初始化 eslint
npx eslint --init
4.1. 选择 eslint 的校验模式
选择第三个
4.2. 选择项目类型
选择第一个 ESM 规范
4.3. 选择项目框架
我们是 vue,选择第二个
4.4. 是否使用 TS
项目中建议使用 TS
4.5. 运行在哪?
我这个在浏览器
4.6. 项目风格?
选择第二个
4.7. 选择 config 文件类型
我这边选择的是 JS
4.8. 缩进
tabs
4.9. 单引号双引号
4.10. 行尾?
4.11. 是否需要分号?
习惯了不要分号
4.12. 是否添加依赖
YES
4.13. 安装方式
pnpm 更快一些
5. .eslintrc.cjs 文件
5.1. 默认生成
module.exports = {
'env': {
'browser': true,
'es2021': true
},
'extends': [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:vue/vue3-essential'
],
'overrides': [
{
'env': {
'node': true
},
'files': [
'.eslintrc.{js,cjs}'
],
'parserOptions': {
'sourceType': 'script'
}
}
],
'parserOptions': {
'ecmaVersion': 'latest',
'parser': '@typescript-eslint/parser',
'sourceType': 'module'
},
'plugins': [
'@typescript-eslint',
'vue'
],
'rules': {
'indent': [
'error',
'tab'
],
'linebreak-style': [
'error',
'unix'
],
'quotes': [
'error',
'single'
],
'semi': [
'error',
'never'
]
}
}
5.2. 习惯的配置
module.exports = {
root: true,
globals: {
defineOptions: "readonly",
defineProps: "readonly",
defineEmits: "readonly",
defineExpose: "readonly",
withDefaults: "readonly",
chrome: true,
},
env: {
browser: true,
node: true,
node: true,
},
parser: "vue-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser",
ecmaVersion: "latest",
sourceType: "module",
ecmaFeatures: {
jsx: true,
},
},
extends: [
"plugin:vue/vue3-recommended",
"plugin:@typescript-eslint/recommended",
"prettier",
"plugin:prettier/recommended",
],
plugins: ["import"],
settings: {
"import/core-modules": [
"uno.css",
"~icons/*",
"virtual:svg-icons-register",
],
},
rules: {
"no-empty": 0,
"@typescript-eslint/no-empty-function": 0,
"@typescript-eslint/no-empty-interface": 0,
"@typescript-eslint/no-explicit-any": 0,
"@typescript-eslint/no-var-requires": 0,
"@typescript-eslint/no-non-null-assertion": 0,
"vue/multi-word-component-names": 0,
"vue/no-unused-components": 1,
"vue/valid-template-root": 1,
semi: ['error', 'never'],
"import/order": [
"error",
{
"newlines-between": "never",
// 对导入模块进行分组
groups: [
"builtin",
"external",
"internal",
"parent",
"sibling",
"index",
],
// 通过路径自定义分组
pathGroups: [
{
pattern: "vue",
group: "external",
position: "before",
},
{
pattern: "vue-router",
group: "external",
position: "before",
},
{
pattern: "pinia",
group: "external",
position: "before",
},
{
pattern: "naive-ui",
group: "external",
position: "before",
},
{
pattern: "@/constants",
group: "internal",
position: "before",
},
{
pattern: "@/config",
group: "internal",
position: "before",
},
{
pattern: "@/settings",
group: "internal",
position: "before",
},
{
pattern: "@/components",
group: "internal",
position: "before",
},
{
pattern: "@/router",
group: "internal",
position: "before",
},
{
pattern: "@/service",
group: "internal",
position: "before",
},
{
pattern: "@/store",
group: "internal",
position: "before",
},
{
pattern: "@/hooks",
group: "internal",
position: "before",
},
{
pattern: "@/utils",
group: "internal",
position: "before",
},
{
pattern: "@/assets",
group: "internal",
position: "before",
},
{
pattern: "@/**",
group: "internal",
position: "before",
},
],
pathGroupsExcludedImportTypes: [
"vue",
"vue-router",
"pinia",
"naive-ui",
],
},
],
},
};
6. .eslintignore 文件
需要过滤的文件
*.sh
*.woff
*.tff
*.html
*.yaml
*.md
node_modules
.vscode
.idea
.husky
/public
/docs
/bin
/app/public
components.d.ts /**
route.d.ts
manifest.json
*.json
7. .prettierrc.js 文件
module.exports = {
trailingComma: 'none',
singleQuote: true,
semi: true,
bracketSpacing: true,
printWidth: 100,
tabWidth: 2,
}
8. .prettierrc.json 文件
{
"$schema": "https://json.schemastore.org/prettierrc",
"semi": false,
"tabWidth": 2,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "none"
}
9. .prettierignore 文件
# 忽略格式化文件 (根据项目需要自行添加)
node_modules
10. .vscode/extensions.json 文件
{
"recommendations": [
"Vue.vscode-typescript-vue-plugin",
"antfu.iconify", // iconify 图标显示
"antfu.unocss", // unocss 代码提示
"christian-kohler.path-intellisense", // 文件路径提示/补全
"dbaeumer.vscode-eslint", // eslint
"esbenp.prettier-vscode", // prettier
"eamodio.gitlens", // git
"editorconfig.editorconfig", // editorconfig
"mikestead.dotenv", // .env支持
"naumovs.color-highlight", // 颜色高亮
"steoates.autoimport",
"vue.volar" // vue3
]
}
11. .vscode/settings.json 文件
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.fontLigatures": true,
"editor.formatOnSave": false,
"editor.guides.bracketPairs": "active",
"editor.quickSuggestions": {
"strings": true
},
"eslint.enable": true,
"editor.tabSize": 2,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"json",
"jsonc",
"json5",
"yaml",
"yml",
"markdown"
],
"files.associations": {
"*.env.*": "dotenv"
},
"files.eol": "\n",
"path-intellisense.mappings": {
"@": "${workspaceFolder}/src",
"~@": "${workspaceFolder}/src"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "Vue.volar"
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。