iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue parseHTML函数源码分析AST
  • 926
分享到

vue parseHTML函数源码分析AST

2023-07-02 17:07:51 926人浏览 独家记忆
摘要

这篇“Vue parsehtml函数源码分析AST”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue 

这篇“Vue parsehtml函数源码分析AST”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue parseHTML函数源码分析AST”文章吧。

正文

在正式扎进Vue parse源码之前,我们先了解下他周边的工具函数, 这能帮我们快速的去理解阅读。

还记得我们在上章节讲的element元素节点的描述对象吗?

var element = {type: 1,tag: tag,parent: null,attrsList: attrs,children: []}

在源码中定义了一个createASTElement函数,用来创建一个元素的描述对象。

createASTElement函数

function createASTElement(tag, attrs, parent) {return {type: 1,tag: tag,attrsList: attrs,attrsMap: makeAttrsMap(attrs),parent: parent,children: []}}

解析指令所用正则

var onRE = /^@|^v-on:/;var dirRE = /^v-|^@|^:/;var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;var stripParensRE = /^\(|\)$/g;var argRE = /:(.*)$/;var bindRE = /^:|^v-bind:/;var modifierRE = /\.[^.]+/g;

在解析开始标签的时候你遇到的不仅有属性,还有一些Vue 自定义的指令。下面一起来分析下解析指令会有用哪些正则。

onRE

var onRE = /^@|^v-on:/;

匹配以字符 @ 或 v-on: 开头的字符串,主要作用是检测标签属性名是否是监听事件的指令。

dirRE

var const dirRE = /^v-|^@|^:/

匹配以字符 v- 或 @ 或 : 开头的字符串,主要作用是检测标签属性名是否是指令。在Vue中所有以 v- 开头的属性都被认为是指令,另外@字符是 v-on 的缩写,: 字符是 v-bind 的缩写。

forAliasRE

var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;

匹配 v-for 属性的值,并捕获 in 或 of 前后的字符串。都是正则大神就不解释怎么捕获的了。

forIteratorRE

var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;

这个也是匹配v-for的属性值,不过比之前要稍微复杂点:列表渲染 v-for(https://cn.vuejs.org/v2/guide/list.html)需要先了解下这个。

//示例:1<div v-for="(value, name) in object">  {{ name }}: {{ value }}</div>//示例:2 <div v-for="(value, name, index) in object">  {{ index }}. {{ name }}: {{ value }}</div>

没错就是用来捕获,示例1中的:'obj , index' 示例2中的:'value, key, index' 。

stripParensRE

var stripParensRE = /^\(|\)$/g;

这个捕获组用来捕获要么以字符 ( 开头,要么以字符 ) 结尾的字符串,或者两者都满足。那么这个正则的作用是什么呢?我们在讲解正则 forIteratorRE 时有个细节不知道大家注意到了没有,就是 forIteratorRE 正则所匹配的字符串是 'obj, index' ,而不是 '(obj, index)' ,这两个字符串的区别就在于第二个字符串拥有左右括号,所以在使用 forIteratorRE 正则之前,需要使用 stripParensRE 正则去掉字符串 '(obj, index)' 中的左右括号,实现方式很简单:

"(obj, index)".replace(stripParensRE, "")

argRE

var argRE = /:(.*)$/;

argRE正则用来匹配指令编写中的参数,并且拥有一个捕获组,用来捕获参数的名字。

示例:

<div v-on:click.item="handle"></div>

其中 v-on 为指令,click为传递给 v-on 指令的参数,stop 为修饰符。

bindRE

var bindRE = /^:|^v-bind:/;

该正则用来匹配以字符:或字符串 v-bind: 开头的字符串,主要用来检测一个标签的属性是否是绑定(v-bind)。

modifierRE

var modifierRE = /\.[^.]+/g;

该正则用来匹配修饰符的,但是并没有捕获任何东西,但你可以用match、exec等方法获取与当前正则匹配成功的信息。

parse 函数中的变量

在讲解 parse 函数直接我们还需要先了解下它内部所定义的一些变量以及用途。

function parse(template, options) {warn$2 = options.warn || baseWarn;platfORMIsPreTag = options.isPreTag || no;platformMustUseProp = options.mustUseProp || no;platformGetTagNamespace = options.getTagNamespace || no;transforms = pluckModuleFunction(options.modules, 'transformnode');preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');delimiters = options.delimiters;var stack = [];var preserveWhitespace = options.preserveWhitespace !== false;var root;var currentParent;var inVPre = false;var inPre = false;var warned = false;function warnOnce(msg) {        //...}function closeElement(element) {       //...}parseHTML(template, {warn: warn$2,expectHTML: options.expectHTML,isUnaryTag: options.isUnaryTag,canBeLeftOpenTag: options.canBeLeftOpenTag,shouldDecodeNewlines: options.shouldDecodeNewlines,shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,shouldKeepComment: options.comments,start: function start(tag, attrs, unary) {},end: function end() {},chars: function chars(text) {},comment: function comment(text) {},});return root}

我们先来看下针对WEB平台初始化的一些变量。

warn$2 = options.warn || baseWarn;platformIsPreTag = options.isPreTag || no;platformMustUseProp = options.mustUseProp || no;platformGetTagNamespace = options.getTagNamespace || no;transforms = pluckModuleFunction(options.modules, 'transformNode');preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');delimiters = options.delimiters;
  • warn$2 函数 毋庸置疑它作用是用来打印警告信息的

  • platformIsPreTag 函数是一个编译器选项,其作用是通过给定的标签名字判断该标签是否是 pre 标签。

  • platformMustUseProp 该函数也是一个编译器选项,其作用是用来检测一个属性在标签中是否要使用元素对象原生的 prop 进行绑定。

  • platformGetTagNamespace 该函数是一个编译器选项,其作用是用来获取元素(标签)的命名空间。

  • transforms 、preTransforms 、postTransforms 还没讲到它们的上下文,暂时不解释它们的作用。

  • delimiters 它的值为 options.delimiters 属性,它的值就是在创建 Vue 实例对象时所传递的 delimiters 选项。

继续往下看:

var stack = [];var preserveWhitespace = options.preserveWhitespace !== false;var root;var currentParent;var inVPre = false;var inPre = false;var warned = false;
  • stack 初始值是一个空数组,作用在上个章节我们讲到,回退操作为了让子元素描述对象的parent属性能够正确指向其父元素。

  • preserveWhitespace 是一个布尔值并且它的值与编译器选项中的options.preserveWhitespace选项有关,只要 options.preserveWhitespace 的值不为false,那么 preserveWhitespace 的值就为真。其中 options.preserveWhitespace 选项用来告诉编译器在编译 html 字符串时是否放弃标签之间的空格,如果为 true 则代表放弃。

  • root 存储最终生成的AST。

  • currentParent 通过上章节了解到,该变量维护元素描述对象之间的父子关系。

  • inVPre 初始值:false。标识当前解析的标签是否在拥有 v-pre (跳过这个元素和它的子元素的编译过程。)的标签之内。

  • inPre 初始值:false。标识当前正在解析的标签是否在 <pre></pre> 标签之内。

  • warned 初始值:false。用来打印警告信息的函数,只不过 warnOnce 函数就如它的名字一样,只会打印一次警告信息,并且 warnOnce 函数也是通过调用 warn 函数来实现的。

以上就是关于“vue parseHTML函数源码分析AST”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: vue parseHTML函数源码分析AST

本文链接: https://www.lsjlt.com/news/343484.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue parseHTML函数源码分析AST
    这篇“vue parseHTML函数源码分析AST”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue ...
    99+
    2023-07-02
  • vue parseHTML 函数源码解析AST基本形成
    目录AST(抽象语法树)?子节点Vue中是如何把html(template)字符串编译解析成AST解析html代码重新改造接着解析 html (template)字符串解析divAS...
    99+
    2022-09-27
  • vue parseHTML函数源码分析
    本文小编为大家详细介绍“vue parseHTML函数源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue parseHTML函数源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-02
  • vue parseHTML 函数源码解析
    目录正文函数开头定义的一些常量和变量while 循环textEnd ===0parseStartTag 函数解析开始标签总结:正文 接上篇: Vue编译器源码分析AST 抽象语法树 ...
    99+
    2022-09-27
  • vue parseHTML函数源码分析start钩子函数
    这篇文章主要讲解了“vue parseHTML函数源码分析start钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue parseHTML函数源码分析start...
    99+
    2023-07-02
  • vue parseHTML函数源码解析start钩子函数
    目录正文platformGetTagNamespace 源码 isForbiddenTag 函数addIfCondition是什么processIfConditions 源...
    99+
    2022-09-27
  • vue parseHTML源码解析hars end comment钩子函数
    目录引言chars源码:parseTextend 源码closeElement 源码comment 注释节点描述对象引言 接上文  parseHTML 函数源码解析&nbs...
    99+
    2022-11-13
  • Vue中AST源码解析的示例分析
    这篇文章主要介绍Vue中AST源码解析的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!从这个函数开始的:// Line-3924  Vue.prototy...
    99+
    2022-10-19
  • vue parseHTML 函数拿到返回值后的处理源码解析
    目录引言parseStartTag函数返回值handleStartTag源码tagName 及unarySlash调用parser钩子函数引言 继上篇文章: parseHTML 函数...
    99+
    2022-09-27
  • vueparseHTML函数源码解析AST预备知识
    目录正文createASTElement函数解析指令所用正则parse 函数中的变量正文 接上章节:parseHTML 函数源码解析AST 基本形成 在正式扎进Vue parse源码...
    99+
    2022-09-27
  • Vue编译器AST抽象语法树源码分析
    目录引言baseCompile主要核心代码如何写一个程序来识别 Tokenparse 函数解析模板字符串引言 接上篇  Vue编译器源码分析compile 解析 baseC...
    99+
    2022-09-27
  • FilenameUtils.getName 函数源码分析
    目录一、背景二、源码分析2.1 问题1:为什么需要 NonNul 检查 ?2.1.1 怎么检查的?2.1.2 为什么要做这个检查呢?2.2 问题2: 为什么不根据当前系统类型来获取分...
    99+
    2022-11-13
  • vue parseHTML函数解析器遇到结束标签
    目录引言match函数匹配正则endTag关键 parseEndTag 函数代码总结parseEndTag 函数作用handleStartTag函数后续最后更新 stack 栈以及 ...
    99+
    2022-09-27
  • Vue八大生命周期钩子函数源码分析
    本篇内容主要讲解“Vue八大生命周期钩子函数源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue八大生命周期钩子函数源码分析”吧!一.速识概念:我们把一个对象从生成(new)到被销毁(d...
    99+
    2023-07-05
  • vue使用源码分析
    本篇内容主要讲解“vue使用源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue使用源码分析”吧!生命周期0版本1.哪些生命周期接口initCreatedbeforeCompileCom...
    99+
    2023-07-04
  • vue parseHTML函数解析器遇到结束标签会怎么样
    今天小编给大家分享一下vue parseHTML函数解析器遇到结束标签会怎么样的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-07-02
  • Immutable.js到Redux函数式编程源码分析
    这篇文章主要介绍了Immutable.js到Redux函数式编程源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Immutable.js到Redux函数式编程源码分析文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Vue中render函数调用时机与执行细节源码分析
    目录背景解析从$mount方法开始mountCompenent发生了什么?render函数的调用细节第一个参数:vm._renderProxy第二个参数:vm.$createElem...
    99+
    2022-11-13
  • Vue编译器optimize源码分析
    目录引言optimize 源码之旅markStatic$1源码isStatic源码复杂点的回归到markStatic$1markStaticRoots 源码引言 接上文 p...
    99+
    2022-11-13
  • Vue编译器分析compile源码
    这篇文章主要介绍“Vue编译器分析compile源码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue编译器分析compile源码”文章能帮助大家解决问题。引言在 compileToFunctio...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作