我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue模板编译的原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue模板编译的原理是什么

这篇文章主要介绍了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模板编译的原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue模板编译的原理是什么

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

下载Word文档

猜你喜欢

vue模板编译的原理是什么

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

vue模板预编译是什么

当vue进行打包时,会直接把组件中的模板转换为render函数,这叫做模板预编译。模板预编译的好处:运行时不再需要编译模板,提高了运行效率;且打包结果中不再需要vue的编译代码,减少了打包体积。
2023-05-14

vue学习之聊聊模板编译原理

什么是模板编译?下面本篇文章带大家聊聊vue中的模板编译,探讨一下模板编译原理,希望对大家有所帮助!
2023-05-14

vue模板预编译有什么作用

今天小编给大家分享一下vue模板预编译有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。当vue进行打包时,会直接把组
2023-07-04

g++模板编译方法是什么

本篇内容介绍了“g++模板编译方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!机器版本 linux 2.4.30 ; g++
2023-06-10

golang编译的原理是什么

Golang的编译原理主要涉及以下几个步骤:词法分析:将源代码分解为一个个的词法单元,比如关键字、标识符、常量、运算符等。语法分析:根据词法单元构建抽象语法树(AST),表示源代码的结构和语义。语义分析:对AST进行语义分析,检查语法错误和
2023-10-25

golang的编译原理是什么

Golang(或Go)的编译原理是将Go源代码转换为机器码的过程。下面是Golang的编译过程的简要概述:词法分析(Lexical Analysis):将源代码分割为一系列的词法单元(tokens),如标识符、关键字、运算符等。语法分析(S
2023-10-22

golang反编译的原理是什么

Golang是一种静态编译的语言,它的原理是将Go代码编译成机器码,然后直接运行。因此,在Golang中进行反编译并不是一个常见的操作。通常情况下,反编译是指将已经编译的程序转换回源代码的过程。由于Golang编译后生成的是机器码,因此无
golang反编译的原理是什么
2024-02-29

kotlin编译器的原理是什么

Kotlin编译器的原理是将Kotlin源代码转换为可执行的目标代码。具体来说,Kotlin编译器分为三个主要的阶段:1. 词法分析(Lexical Analysis):将源代码分解为一个个的词法单元(tokens),如关键字、标识符、运算
2023-09-15

linux交叉编译的原理是什么

本篇内容主要讲解“linux交叉编译的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux交叉编译的原理是什么”吧!在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行
2023-06-30

PHP标签模板技术的原理是什么

PHP标签模板技术的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们在对PHP标签模板的理解上多少都会存在一些误区,因为它是一项比较难以掌握的技术。那么,我们希
2023-06-17

Vue中的MVVM模式原理是什么

这篇文章主要介绍“Vue中的MVVM模式原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中的MVVM模式原理是什么”文章能帮助大家解决问题。1. MVVM模式传统的组件是静态渲染,数据
2023-07-05

vue中的模板语法是什么

本文小编为大家详细介绍“vue中的模板语法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中的模板语法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、模板语法模板语法分为插值语法和指令语法两种
2023-06-29

linux编译内核的原因是什么

这篇文章主要讲解了“linux编译内核的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux编译内核的原因是什么”吧!原因:新的内核修订了旧内核的
2023-04-06

C++ 函数模板的底层实现原理是什么?

c++++ 函数模板通过部分特化根据不同的类型生成不同的函数代码,优化效率。每次调用模板时,编译器会实例化函数并生成特定于模板参数的特化代码。函数模板提供代码重用、灵活性和性能优化等优势。C++ 函数模板的底层实现原理函数模板是 C++
C++ 函数模板的底层实现原理是什么?
2024-04-24

linux要编译源码的原因是什么

本篇内容介绍了“linux要编译源码的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原因:1、Lin
2023-03-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录