浅谈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 相关文章推荐
json 入门基础教程 推荐
Oct 31 Javascript
javascript获取元素CSS样式代码示例
Nov 28 Javascript
给js文件传参数(详解)
Jul 13 Javascript
JS实现一个列表中包含上移下移删除等功能
Sep 24 Javascript
js的window.showModalDialog及window.open用法实例分析
Jan 29 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
jquery中ajax处理跨域的三大方式
Jan 05 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
JS实现根据数组对象的某一属性排序操作示例
Jan 14 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 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 zend解密软件绿色版测试可用
2008/04/14 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
js获取多个tagname的节点数组
2013/09/22 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
vue实现简单学生信息管理
2020/05/30 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
OpenCV实现人脸识别
2017/04/07 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
postman和python mock测试过程图解
2020/02/22 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
工作会议主持词
2014/03/17 职场文书
《老山界》教学反思
2014/04/08 职场文书
爱护花草树木的标语
2014/06/11 职场文书
党员志愿者活动总结
2014/06/26 职场文书
商场父亲节活动方案
2014/08/27 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
肖申克救赎观后感
2015/06/02 职场文书
好员工观后感
2015/06/17 职场文书
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技