vue3 解决 ESLint 各类型错误
前期项目中忽略了 eslint 检查,导致一运行 npm run lint
出现两千多条错误(இдஇ; ) 造孽啊
花了两三天搞完,做个错误汇总。
<!-- more -->
环境和配置
项目用 [email protected] + vite + [email protected]
关于eslint 配置的用法可参考:ESLint中文
eslint 有专门应用于 vue 的插件:eslint-plugin-vue
大致贴一下版本依赖
devDependencies: { "@babel/eslint-parser": "^7.18.2", "eslint": "^8.7.0", "eslint-config-prettier": "^8.3.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jest": "^25.7.0", "eslint-plugin-vue": "^8.3.0", }
eslint 的配置采用 JS 文件格式,经过几次修改已经忘了一开始的内容,只贴基础配置如下:
// .eslintrc.js module.exports = { // 只作用于当前目录 root: true, // 运行环境 env: { node: true, es6: true, }, // 解析器 parser: '@babel/eslint-parser', // 解析器选项 parserOptions: { sourceType: 'module', }, // 插件 plugins: ['import'], // 扩展配置 extends: [ 'plugin:vue/vue3-recommended', 'plugin:import/recommended', 'prettier', ], // 启用规则 rules: {}, // 全局变量 globals: { h: true, }, // 为指定文件指定处理器 overrides: [ { files: ['*.vue', '*.jsx'], parser: 'vue-eslint-parser', parserOptions: { ecmaVersion: 2018, }, rules: {} } ], }
ERROR: Parsing error: Unexpected token .
错误代码:
const isOpen = data?.form?.isOpen || false;
原来是无法识别可选链操作符( ?.
),但是扩展运算符没问题,看了eslint 的配置,发现是 ECMAScript 的版本设置了2018(ES9),而可选链操作符是 ES2020(如果没记错),修改配置就可以了
// .eslintrc.js module.exports = { parserOptions: { // ES版本,最新可设置 2022 or "latest",overrides 中配置了有需要也要同步修改 ecmaVersion: 2020, sourceType: 'module', } }
ERROR: Unable to resolve path to module
错误代码:
import Upload from '@/components/upload/index.vue'
路径引用错误??看起来没毛病, vite.config.js
中明明配置了短链
resolve: { alias: { '@': pathResolve('src'), } }
但 eslint 并不会自动读取 vite 的配置,因此 eslint 也要加上对应配置:
// .eslintrc.js module.exports = { settings: { 'import/resolver': { alias: { map: ['@': './src'] } } } }
另外引入 vue 文件需要加上后缀 .vue
,否则也会报相同错误。
ERROR: 'ref' is not defined
错误代码:
setup(){ const isOpen = ref(false); return { isOpen, } }
运行都没报错,怎么突然 undefined 了??
等等,因为偷懒,vue 的语法糖都是 unplugin-auto-import
每个文件自动引入的:
// vite.config.js import autoImport from 'unplugin-auto-import/vite'; autoImport({ imports: [ 'vue', 'vue-router', ] })
所以也要让 eslint 知道,先生成一个包含所有变量的文件:
// vite.config.js autoImport({ ...last, eslintrc: { // 已存在文件设置默认 false,需要更新时再打开,防止每次更新都重新生成 enabled: false, // 生成文件地址和名称 filepath: './.eslintrc-auto-import.json', globalsPropValue: true, } })
上面的 enabled
在生成文件后建议关闭,否则每次更新都会重新生成。
扩展到 eslint:
// .eslintrc.js module.exports = { extends: [ 'plugin:vue/vue3-recommended', 'plugin:import/recommended', 'prettier', './.eslintrc-auto-import.json' ], }
ERROR: vue/no-mutating-props
错误代码:
<!-- parent.vue --> <template> <Child v-model:open="openModal" /> </template> <script> export default{ setup(){ const openModal = ref(false); return { openModal, } } } </script> <!-- child.vue --> <template> <a-modal v-model:visible="open"></a-modal> </template> <script> export default{ props: { open: { type: Boolean, default: true, } }, } </script>
这是个低级错误,vue3支持多个参数双向绑定,但是子组件不能直接修改 props
,需要转换一下:
-
方法一:用
computed
代替<template> <a-modal v-model:visible="isOpen"></a-modal> </template> <script> export default{ props: { open: { type: Boolean, default: true, } }, setup(props, { emit }){ const isOpen = computed({ get: () => { return props.open; }, set: (value) => { emit('update:open', value); }, }); return { isOpen, } }, } </script>
-
方法二:用
watch
监听<template> <a-modal v-model:visible="isOpen"></a-modal> </template> <script> export default{ props: { open: { type: Boolean, default: true, } }, setup(props, { emit }){ const isOpen = ref(props.open); watch( () => isOpen.value, (value) => emit('update:open', value) ); return { isOpen, } }, } </script>
ERROR: no-console
错误代码:
console.log(data);
eslint 的规则设定了不能有 console
,当然可以改配置:
// .eslintrc.js rules: { 'no-console': 'off', // or: 'no-console': [2, { allow: ['warn', 'error'] }], // or: 'no-console': process.env.NODE_ENV === 'production' ? [2, { allow: ['warn', 'error'] }] : 'off' }
提这个错误是为了引入下面的问题,在某些地方需要打印但不希望 eslint 报错,可以让其忽略检查:
// 忽略整个文件在第一行加 /* eslint-disable */ // 忽略一段代码检查 /* eslint-disable */ ...this our codes; /* eslint-enable */ // 忽略一行代码检查 console.log(data); // eslint-disable-line // 忽略下一行代码检查 // eslint-disable-next-line console.log(data);
那么在 <template>
中呢?
<template> <!-- eslint-disable --> <div v-for="item in options">{{ item }}</div> </template>
然后发现不行,会报 vue/require-v-for-key
错误,注释失败。
找了各种文章最后发现是自己的锅Ծ‸Ծ,找不出问题的时候还是要看官方文档,在eslint-plugin-vue已有说明 vue/comment-directive
规则就是用于忽略代码检查,一看 eslint 的文件配置果然是关闭了:
// .eslintrc.js rules: { 'vue/comment-directive': 'off', }
改为 error
,完美؏؏☝ᖗ乛◡乛ᖘ☝؏؏
收工。
- 即刻报名!SegmentFault AIGC Hackathon 黑客马拉松全新出发!
- SegmentFault 2022 年社区周报 Vol.9
- 社区精选 | 不容错过的9个冷门css属性
- 2022最新版 Redis大厂面试题总结(附答案)
- 手写一个mini版本的React状态管理工具
- 【vue3源码】十三、认识Block
- 天翼云全场景业务无缝替换至国产原生操作系统CTyunOS!
- JavaScript 设计模式 —— 代理模式
- MobTech短信验证ApiCloud端SDK
- 以羊了个羊为例,浅谈小程序抓包与响应报文修改
- 这几种常见的 JVM 调优场景,你知道吗?
- 聊聊如何利用管道模式来进行业务编排(下篇)
- 通用ORM的设计与实现
- 如此狂妄,自称高性能队列的Disruptor有啥来头?
- 为什么要学习GoF设计模式?
- 827. 最大人工岛 : 简单「并查集 枚举」运用题
- 介绍 Preact Signals
- 手把手教你如何使用 Timestream 实现物联网时序数据存储和分析
- 850. 矩形面积 II : 扫描线模板题
- Java 并发编程解析 | 基于JDK源码解析Java领域中的并发锁,我们可以从中学习到什么内容?