浅谈vue中.vue文件解析流程


Posted in Javascript onApril 24, 2018

我们平时写的 .vue 文件称为 SFC(Single File Components),本文介绍将 SFC 解析为 descriptor 这一过程在 vue 中是如何执行的。

vue 提供了一个 compiler.parseComponent(file, [options]) 方法,来将 .vue 文件解析成一个 descriptor:

// an object format describing a single-file component.
declare type SFCDescriptor = {
  template: ?SFCBlock;
  script: ?SFCBlock;
  styles: Array<SFCBlock>;
  customBlocks: Array<SFCBlock>;
};

文件入口

解析 sfc 文件的入口在 src/sfc/parser.js 中,该文件 export 了 parseComponent 方法, parseComponent 方法用来对单文件组件进行编译。

接下来我们看看 parseComponent 方法都做了哪些事情。

parseComponent 方法

function start(tag, attrs, unary, start, end,){
}

function end(tag, start, end){
}

parseHTML(content, {
  start,
  end
})

parseComponent 方法中定义了 start``end 两个函数,之后调用了 parseHTML 方法来对 .vue 文件内容践行编译。

那么这个 parseHTML 方法是做啥的呢?

parseHTML 方法

该方法看名字就知道是一个 html-parser,可以简单理解为,解析到每个起始标签时,调用 option 中的 start;每个标签结束时,调用 option 中的 end。

对应到这里,就是分别调用 parseComponent 方法中定义的 start 和 end 函数。

在 parseComponent 中维护一个 depth 变量,在 start 中将 depth++ ,在 end 中 depth-- 。那么,每个 depth === 0 的标签就是我们需要获取的信息,包含 template、script、style 以及一些自定义标签。

start

每当遇到一个起始标签时,执行 start 函数。

1、记录下 currentBlock。

每个 currentBlock 包含以下内容:

declare type SFCBlock = {
  type: string;
  content: string;
  start?: number;
  end?: number;
  lang?: string;
  src?: string;
  scoped?: boolean;
  module?: string | boolean;
};

2、根据 tag 名称,将 currentBlock 对象在返回结果对象中。

返回结果对象定义为 sfc,如果tag不是 script,style,template 中的任一个,就放在 sfc.customBlocks 中。如果是style,就放在 sfc.styles 中。script 和 template 则直接放在 sfc 下。

if (isSpecialTag(tag)) {
  checkAttrs(currentBlock, attrs)
  if (tag === 'style') {
    sfc.styles.push(currentBlock)
  } else {
    sfc[tag] = currentBlock
  }
} else { // custom blocks
  sfc.customBlocks.push(currentBlock)
}

end

每当遇到一个结束标签时,执行 end 函数。

1、如果当前是第一层标签(depth === 1),并且 currentBlock 变量存在,那么取出这部分text,放在 currentBlock.content 中。

if (depth === 1 && currentBlock) {
 currentBlock.end = start
 let text = deindent(content.slice(currentBlock.start, currentBlock.end))
 // pad content so that linters and pre-processors can output correct
 // line numbers in errors and warnings
 if (currentBlock.type !== 'template' && options.pad) {
  text = padContent(currentBlock, options.pad) + text
 }
 currentBlock.content = text
 currentBlock = null
}

2、depth-- 。

得到 descriptor

在将 .vue 整个遍历一遍后,得到的 sfc 对象即为我们需要的结果。

生成 .js ?

compiler.parseComponent(file, [options]) 得到的只是一个组件的 SFCDescriptor ,最终编译成.js 文件是交给 vue-loader 等库来做的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
javascript学习笔记(十一) 正则表达式介绍
Jun 20 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
Apr 23 Javascript
Node.js使用gm拼装sprite图片
Jul 04 Javascript
Vue.js 动态为img的src赋值方法
Mar 14 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
Jun 19 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
Sep 05 Javascript
JavaScript Dom 绑定事件操作实例详解
Oct 02 Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 Javascript
vue-cli2.9.3 详细教程
Apr 23 #Javascript
vue.js数据绑定操作详解
Apr 23 #Javascript
jQuery+ajax实现动态添加表格tr td功能示例
Apr 23 #jQuery
再谈Angular4 脏值检测(性能优化)
Apr 23 #Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
Apr 23 #Javascript
vue.js中实现登录控制的方法示例
Apr 23 #Javascript
JS中获取 DOM 元素的绝对位置实例详解
Apr 23 #Javascript
You might like
学习php设计模式 php实现状态模式
2015/12/07 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
在python中用url_for构造URL的方法
2019/07/25 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
应届毕业生求职信范文
2013/12/18 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
小学教师培训感言
2014/02/11 职场文书
协议书模板
2014/04/23 职场文书
求职信的正确写法
2014/07/10 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
社团活动总结格式
2014/08/29 职场文书
个人委托书范本汇总
2014/10/01 职场文书
教师思想工作总结2015
2015/05/13 职场文书
z-index不起作用
2021/03/31 HTML / CSS
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python