返回顶部
首页 > 资讯 > 精选 >vue模板编译的原理是什么
  • 565
分享到

vue模板编译的原理是什么

2023-07-05 10:07:39 565人浏览 安东尼
摘要

这篇文章主要介绍了Vue模板编译的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue模板编译的原理是什么文章都会有所收获,下面我们一起来看看吧。vue提供了模板语法,允许我们声明式地描述状态和DOM

这篇文章主要介绍了Vue模板编译的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue模板编译的原理是什么文章都会有所收获,下面我们一起来看看吧。

vue提供了模板语法,允许我们声明式地描述状态和DOM之间的绑定关系,比如<p>{{name}}<p>

模板编译指的是模板将编译成render函数的过程,渲染函数的作用是每次执行时,会根据最新状态生成新的vnode

编译的过程是:模板作为输入 -> 模板编译 阶段->生成 渲染函数

面试题

  • vue的模板编译?

  • 模板编译Compiler中render讲解?

  • vue 模板编译的过程,每一个过程细说一下做了些什么

  • 模板编译,谁去解析AST树 【相关推荐:vuejs视频教程WEB前端开发

将模板编译成渲染函数

vue模板编译的原理是什么

  • 解析器:将模板解析为AST(Abstract Syntax Tree 抽象语法树)

  • 优化:遍历AST标记静态节点,因为静态节点不可变,不需要为打上标签的静态节点创建新的虚拟节点,直接克隆已有的虚拟节点。

  • 代码生成器:使用AST生成渲染函数。将AST转换成代码字符串。将代码字符串放入渲染函数中,导出被外界使用。

案例

vue模板编译的原理是什么

1.模板确认

假设如下代码,有eltemplaterender$mount

//复杂案例let vue = new Vue({    el: '#app',    data() {        return {            a: 1,            b: [1]        }    },    render(h) {        return h('div', { id: 'hhh' }, 'hello')    },    template: `<div id='hhh' style="aa:1;bb:2"><a>{{xxx}}{{ccc}}</a></div>`}).$mount('#app')console.log(vue)//脚手架创建的案例let vue = new Vue({  render: h => h(App)}).$mount('#app')

vue模板编译的原理是什么

1)渲染到哪个根节点上:判断有无el属性,有的话直接获取el根节点,没有的话调用$mount时去获取根节点

2)渲染哪个模板到根节点上去:是否调用render 函数传入了模板 render: h => h(App) -> <App></App>

  • 有render:这时候优先执行render函数,render优先级 > template

  • 无render:

    • 有template:template解析成render函数的所需格式-代码字符串,并使用调用render函数渲染

    • 无template:el根节点的outerhtml解析成render函数的所需格式-代码字符串,并使用调用render函数渲染
      3.渲染的方式:无论什么情况,最后都统一是要使用render函数渲染

2.解析器-将模板解析成AST

解析器-将模板解析成AST

<div>  <p>{{name}}</p></div>

将上述模板解析成AST后,AST抽象语法树就是使用JS中的对象来描述一个节点,一个对象表示一个节点。

{  tag: "div"  type: 1, //节点类型  staticRoot: false,  static: false,  plain: true,  parent: undefined, //存放父节点  attrsList: [],  attrsMap: {},  children: [ //存放孩子节点      {      tag: "p"      type: 1,      staticRoot: false,      static: false,      plain: true,      parent: {tag: "div", ...},      attrsList: [],      attrsMap: {},      children: [{          type: 2,          text: "{{name}}",          static: false,          expression: "_s(name)"      }]    }  ]}

解析器的工作原理

解析器的原理的是一小段一小段地截取模板字符串,每截取一小段字符串,就会根据截取出来的字符串类型触发不同的钩子函数,直到模板字符串截空停止。然后使用栈来确定层级关系

解析器内部分也分几个子解析器,如HTML解析器、文本解析器等。

HTML解析器的作用是解析HTML,在解析HTML的过程中不断触发各种钩子函数,

  • 开始标签的钩子函数中可以构建元素类型的节点

  • 文本钩子函数中可以构建文本类型的节点

  • 注释钩子函数中可以构建注释类型的节点

  • 结束标签钩子函数

文本解析器是对HTML解析出来的文本进行二次加工,比如插值语法{{}}

如何确定DOM之间的层级关系?使用栈
在触发开始标签的钩子函数时,如果当前标签不是自闭合标签,就pushstack
在触发结束标签的钩子函数时,就从栈中pop出战

3.优化器-标记AST中的静态节点

标记静态子树的好处

  • 每次重新渲染时,不需要为静态子树创建新虚拟子树,克隆已存在的静态子树

  • 在虚拟DOM中打补丁(patching)的过程可以跳过 ,静态子树是不可变的

优化器的内部实现主要分两步递归的方式将所有节点添加 static 属性,true表示是静态的,false表示不是静态的。

  • 在AST中找出所有静态节点并打上标记
    静态节点:DOM不会发生变化的节点
    通过递归的方式从上向下标记静态节点,如果一个节点被标记为静态节点,但它的子节点却被标记为动态节点,就说明该节点不是静态节点,可以将它改为动态节点。静态节点的特征是它的子节点也必须是静态的。

静态根节点也是静态节点

  • **在AST中找出所有静态根节点并打上标记 **
    静态根节点:子节点全是静态节点的节点
    使用递归从上向下寻找,在寻找的过程中遇见的第一个静态节点就为静态根节点,同时不继续往下找。

如果一个静态根节点的子节点只有一个文本节点或没有子节点,那么不会标记成静态根节点,即使他们是,因为优化成本大于收益

怎么判断是否静态节点?
在将模板字符串解析成AST的时候,会根据不同的文本类型设置一个 type

type说明是否时静态节点
1元素节点进行一些排除
2带遍历的动态文本节点不是
3不带遍历的纯文本节点

4.代码生成器-将AST转化成渲染函数中的代码字符串

代码生成器的作用:将AST转化成渲染函数中的代码字符串

<div>  <p>{{name}}</p></div>//生成的render渲染函数{  render: `with(this){return _c('div',[_c('p',[_v(_s(name))])])}`}//格式化后with(this){  return _c(    'div',    [      _c(        'p',        [          _v(_s(name))        ]      )    ]  )}

生成代码字符串是一个递归的过程,从顶向下依次处理每一个AST节点。
节点有三种类型,分别对应三种不同的创建方法与别名。

类型创建方法别名
元素节点createElement_c
文本节点createTextVnode_v
注释节点createEmptyVNode_e

渲染函数可以生成VNode的原因:渲染函数其实是执行了createElement,而createElement可以创建VNode。

代码字符串的拼接过程

递归AST来生成字符串,最先生成根节点,然后在子节点字符串生成后,将其拼接在根节点的参数中,子节点的子节点拼接在子节点的参数中,一层层拼接。

关于“vue模板编译的原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“vue模板编译的原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: vue模板编译的原理是什么

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

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

猜你喜欢
  • vue模板编译的原理是什么
    这篇文章主要介绍了vue模板编译的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue模板编译的原理是什么文章都会有所收获,下面我们一起来看看吧。vue提供了模板语法,允许我们声明式地描述状态和DOM...
    99+
    2023-07-05
  • vue模板预编译是什么
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。模板预编译当使用 DOM 内模板或 JavaScript 内的字符串模板时,模板会在运行时被编译为渲染函数。通常情况下这个过程已经足够快了,但对性能敏感的应用还是最好避免...
    99+
    2023-05-14
    Vue
  • vue学习之聊聊模板编译原理
    **在AST中找出所有静态根节点并打上标记 ** 静态根节点:子节点全是静态节点的节点 使用递归从上向下寻找,在寻找的过程中遇见的第一个静态节点就为静态根节点,同时不继续往下找。如果一个静态根节点的子节点只有一个文本节点或没有子节点,那么不...
    99+
    2023-05-14
    模板编译 Vue
  • vue模板预编译有什么作用
    今天小编给大家分享一下vue模板预编译有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。当vue进行打包时,会直接把组...
    99+
    2023-07-04
  • g++模板编译方法是什么
    本篇内容介绍了“g++模板编译方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!机器版本 linux 2.4.30  ;&n...
    99+
    2023-06-10
  • golang编译的原理是什么
    Golang的编译原理主要涉及以下几个步骤: 词法分析:将源代码分解为一个个的词法单元,比如关键字、标识符、常量、运算符等。 ...
    99+
    2023-10-25
    golang
  • golang的编译原理是什么
    Golang(或Go)的编译原理是将Go源代码转换为机器码的过程。下面是Golang的编译过程的简要概述: 词法分析(Lexic...
    99+
    2023-10-22
    golang
  • JavaScript编译原理是什么
    本篇内容介绍了“JavaScript编译原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.分词/...
    99+
    2024-04-02
  • kotlin编译器的原理是什么
    Kotlin编译器的原理是将Kotlin源代码转换为可执行的目标代码。具体来说,Kotlin编译器分为三个主要的阶段:1. 词法分析...
    99+
    2023-09-15
    kotlin
  • golang反编译的原理是什么
    Golang是一种静态编译的语言,它的原理是将Go代码编译成机器码,然后直接运行。因此,在Golang中进行反编译并不是一个常见的操...
    99+
    2024-02-29
    golang
  • Golang中编译器的原理是什么
    本篇文章给大家分享的是有关Golang中编译器的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先先来认识以下go的代码源文件分类&...
    99+
    2024-04-02
  • linux交叉编译的原理是什么
    本篇内容主要讲解“linux交叉编译的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux交叉编译的原理是什么”吧!在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行...
    99+
    2023-06-30
  • vue中template模板编译的过程全面剖析
    目录简述过程vue的渲染过程parseparse过程总结generate生成render函数简述过程 vue template模板编译的过程经过parse()生成ast(抽象语法树)...
    99+
    2024-04-02
  • PHP标签模板技术的原理是什么
    PHP标签模板技术的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们在对PHP标签模板的理解上多少都会存在一些误区,因为它是一项比较难以掌握的技术。那么,我们希...
    99+
    2023-06-17
  • Django模板系统的工作原理是什么
    Django模板系统的工作原理是将模板和数据结合在一起,生成最终的HTML页面。当一个请求到达Django应用程序时,Django会...
    99+
    2024-04-02
  • Vue中的MVVM模式原理是什么
    这篇文章主要介绍“Vue中的MVVM模式原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中的MVVM模式原理是什么”文章能帮助大家解决问题。1. MVVM模式传统的组件是静态渲染,数据...
    99+
    2023-07-05
  • vue中的模板语法是什么
    本文小编为大家详细介绍“vue中的模板语法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中的模板语法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、模板语法模板语法分为插值语法和指令语法两种...
    99+
    2023-06-29
  • linux编译内核的原因是什么
    这篇文章主要讲解了“linux编译内核的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux编译内核的原因是什么”吧! ...
    99+
    2023-04-06
    linux
  • JS模板编译的实现详情
    目录前言模板编译的简单实现模板编译1、构建模板生成函数2、正则替换前言 编译是一种格式变成另一种格式的过程。编译会导致好的结果,比如书写简单的代码,编译出来复杂的代码;或者提高代码的...
    99+
    2024-04-02
  • C++ 函数模板的底层实现原理是什么?
    c++++ 函数模板通过部分特化根据不同的类型生成不同的函数代码,优化效率。每次调用模板时,编译器会实例化函数并生成特定于模板参数的特化代码。函数模板提供代码重用、灵活性和性能优化等优势...
    99+
    2024-04-24
    c++ 函数模板
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作