千家信息网

vue中.vue文件解析的示例分析

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章将为大家详细讲解有关vue中.vue文件解析的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。vue 提供了一个 compiler.parseComp
千家信息网最后更新 2024年11月24日vue中.vue文件解析的示例分析

这篇文章将为大家详细讲解有关vue中.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;  customBlocks: Array;};

文件入口

解析 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 等库来做的。

关于"vue中.vue文件解析的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

方法 文件 标签 函数 对象 内容 篇文章 结果 编译 示例 分析 入口 变量 就是 更多 组件 起始 不错 实用 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何统一服务器日志管理 网络安全软件图标名字 软件开发代表人物 计算机网络技术基础出版年 速达转移数据库 卫健委网络安全培训 潞州区这份网络安全秘笈请查收 杨浦区技术软件开发报价方案 ftp xp服务器 ps4黑色行动4怎么选择服务器 数据库减少了数据冗余 迪动网络技术有限公司 bms软件开发用什么语言 大学图书馆数据库有什么用 眼镜行业软件开发怎么办 虚拟服务器管理软件提供商 网络安全王传河武汉出版社 java手机软件开发库 杭州支付软件开发有什么用 一般服务器的cpu使用率多少 网络安全风险防范与自查报告 国内软件开发语言使用情况 速达转移数据库 数据库中间件怎样删除 软件开发功能点换算工作量 配置现有数据库 网络安全王传河武汉出版社 浙江服务器维修技术云主机 如何避免游戏开服时服务器爆炸 成人自考计算机网络技术
0