浅谈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 相关文章推荐
使用js修改客户端注册表的方法
Aug 09 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
JavaScript中的6种运算符总结
Oct 16 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
详解AngularJS ng-class样式切换
Jun 27 Javascript
使用Vue自定义指令实现Select组件
May 24 Javascript
Vue 莹石摄像头直播视频实例代码
Aug 31 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
Mar 19 Javascript
vue实现移动端返回顶部
Oct 12 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按行读取文件时删除换行符的3种方法
2014/05/04 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python二分查找详解
2015/09/13 Python
Python之os操作方法(详解)
2017/06/15 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
django数据库自动重连的方法实例
2019/07/21 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
python str字符串转uuid实例
2020/03/03 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
幼儿园春游活动方案
2014/01/19 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
考博专家推荐信
2014/05/10 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
建房合同协议书
2016/03/21 职场文书