ESLint 是如何检查 .vue 文件的


Posted in Vue.js onNovember 30, 2020

近期要做一个类似的内容,学习了一下 Vue 是如何做的。

ESLint 中的扩展机制

首先需要了解一下如何才能扩展 ESLint 的功能。ESLint 扩展机制主要有 Rules、Plugins、Formatters、Parsers,Formatters 目前不需要用到,因此着重看一下其他三种方式。

Parser

用于自定义的解析文件内容,返回 AST 给后续步骤使用。

Rules

用于定义校验规则。

Plugins

plugin 是多种功能的一个集合,可以定义以下内容:

  • Rules:校验规则。
  • Environments:环境变量。
  • Processors:处理文件前后的钩子函数。preprocess、postprocess。
  • Configs:一些预置的配置,可以让用户指定使用。

Vue 相关代码库

用于 .vue 文件的 eslint 代码库有两个:eslint-plugin-vue 和 vue-eslint-parser。

eslint-plugin-vue 用于提供 Rules。

vue-eslint-parser 用于解析 .vue 文件,尤其是 template 部分。

eslint-plugin-vue

入口文件为 lib/index.js,其中设置了三部分内容,rules、configs 和 processors。

rules

rules 部分对应着非常多的校验规则,放在 rules 目录下。rules 中关于 template 部分的校验,处理的是 vue-eslint-parser 中生成的 AST,这个 AST 的格式定义可以在这里查看:https://github.com/vuejs/vue-eslint-parser/blob/master/docs/ast.md

configs

configs 部分预置了很多配置选项,不同选项的区别主要在于 rules 的开关设置不同,我们不需要关心。这里我们主要看 base 配置中的 parser 部分:

ESLint 是如何检查 .vue 文件的

parser 制定为了 vue-eslint-parser,这就是为什么我们不用手动装 vue-eslint-parser,而只需要安装 eslint-plugin-vue 的原因。

processors

最后一部分是 processors,他是一个对象:

ESLint 是如何检查 .vue 文件的

其中 preprocess 没有做任何事情,直接将 code 返回了。

有时文件中会有一些注释来开启关闭某些 rules,而 postprocess 所做的内容是根据这些注释对 messages 做一个过滤。

vue-eslint-parser

vue-eslint-parser 的入口文件是 src/index.ts,该文件暴露出了 parseForESLint 和 parse 方法,这两个方法做的事情是一样的:输入原始代码,返回解析后的 AST。

ESLint 是如何检查 .vue 文件的

由于配置 parser 后,所有文件都会经过 vue-eslint-parser,因此需要判断是否是 .vue 文件,如果不是的话,使用 espree (ESLint 默认的 JS 解析器) 或用户自定义的其他 parser 来处理 js 文件内容。

如果判断是 vue 文件,那么会对 HTMLParser 来解析 .vue 文件内容,获取到 script 和 template 部分。script 部分使用 espree 或用户自定义的其他 parser 来处理 js 内容,template 部分则已经由 HTMLParser 解析过了,直接使用即可。

总体流程

最后是总体的流程:

ESLint 是如何检查 .vue 文件的

以上就是ESLint 是如何检查 .vue 文件的的详细内容,更多关于ESLint 检测.vue文件的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
Vue $attrs & inheritAttr实现button禁用效果案例
Dec 07 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 #Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 #Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 #Vue.js
vuex的数据渲染与修改浅析
Nov 26 #Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 #Vue.js
vue单元格多列合并的实现
Nov 26 #Vue.js
VUE项目实现主题切换的多种方法
Nov 26 #Vue.js
You might like
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
js对象的比较
2011/02/26 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
优纳科技软件测试面试题
2012/05/15 面试题
银行实习自我鉴定
2013/10/12 职场文书
2013年保送生自荐信格式
2013/11/20 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
解除同居协议书
2015/01/29 职场文书
2015入党个人自传范文
2015/06/26 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书