浅谈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 相关文章推荐
推荐20家国外的脚本下载网站
Apr 28 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
Dec 11 Javascript
jQuery实现6位数字密码输入框
Dec 29 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
jQuery动画_动力节点节点Java学院整理
Jul 04 jQuery
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
Jan 08 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
关于Js中new操作符的作用详解
Feb 21 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中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
一个JS翻页效果
2007/07/23 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
pandas数据处理之绘图的实现
2020/06/15 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
计算机软件个人的自荐信范文
2013/12/01 职场文书
职工运动会邀请函
2014/01/19 职场文书
留学自荐信写作方法
2014/01/27 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
部队万能检讨书
2014/02/20 职场文书
求职信范文大全
2014/05/26 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript