Maison > interface Web > Voir.js > le corps du texte

Vue Learning parle des principes de compilation de modèles

青灯夜游
Libérer: 2023-03-07 19:01:00
avant
1506 Les gens l'ont consulté

Qu'est-ce que la compilation de modèles ? L'article suivant parlera de la compilation de modèles dans Vue et discutera des principes de compilation de modèles. J'espère qu'il vous sera utile !

Vue Learning parle des principes de compilation de modèles

vue fournit une syntaxe de modèle qui nous permet de décrire de manière déclarative la relation de liaison entre l'état et le DOM, telle que <p>{{name}}</p> <p></p>. <p>{{name}}</p> <p></p>

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

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

面试题

  • vue的模板编译?
  • 模板编译Compiler中render讲解?
  • vue 模板编译的过程,每一个过程细说一下做了些什么
  • 模板编译,谁去解析AST树 【相关推荐:vuejs视频教程web前端开发

将模板编译成渲染函数

Vue Learning parle des principes de compilation de modèles

  • 解析器:将模板解析为AST(Abstract Syntax Tree 抽象语法树)
  • 优化器:遍历AST标记静态节点,因为静态节点不可变,不需要为打上标签的静态节点创建新的虚拟节点,直接克隆已有的虚拟节点。
  • 代码生成器:使用AST生成渲染函数。将AST转换成代码字符串。将代码字符串放入渲染函数中,导出被外界使用。

案例

Vue Learning parle des principes de compilation de modèles

1.模板确认

假设如下代码,有eltemplaterender$mount

//复杂案例
let vue = new Vue({
    el: &#39;#app&#39;,
    data() {
        return {
            a: 1,
            b: [1]
        }
    },
    render(h) {
        return h(&#39;div&#39;, { id: &#39;hhh&#39; }, &#39;hello&#39;)
    },
    template: `<div id=&#39;hhh&#39; style="aa:1;bb:2"><a>{{xxx}}{{ccc}}</a></div>`
}).$mount(&#39;#app&#39;)

console.log(vue)

//脚手架创建的案例
let vue = new Vue({
  render: h => h(App)
}).$mount(&#39;#app&#39;)
Copier après la connexion

Vue Learning parle des principes de compilation de modèles

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>
Copier après la connexion

将上述模板解析成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)"
      }]
    }
  ]
}
Copier après la connexion

解析器的工作原理

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

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

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

  • 开始标签的钩子函数中可以构建元素类型的节点
  • 文本钩子函数中可以构建文本类型的节点
  • 注释钩子函数中可以构建注释类型的节点
  • 结束标签钩子函数

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

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

La compilation de modèles fait référence au processus de compilation du modèle dans une fonction de rendu. La fonction de la fonction de rendu est de générer un nouveau vnode basé sur le dernier statut à chaque fois qu'il est exécuté. Le processus de compilation est : Modèle en entrée-> Étape de compilation du modèle->Générer une fonction de rendu

Questions d'entretien

🎜🎜🎜Compilez le modèle dans une fonction de rendu🎜🎜🎜< img src=" https://img.php.cn/upload/article/000/000/024/172657b2595ab9895c742e2770ca3e51-0.jpeg" alt="Insérer la description de l'image ici"/>🎜
  • Analyseur< /code> : analysez le modèle dans AST (Abstract Syntax Tree)</li><li><code>Optimiseur : parcourez l'AST pour marquer les nœuds statiques, car les nœuds statiques sont immuables et n'ont pas besoin de le faire. être marqué. Étiquetez les nœuds statiques pour créer de nouveaux nœuds virtuels et cloner directement les nœuds virtuels existants.
  • Générateur de code : utilisez AST pour générer des fonctions de rendu. Convertissez AST en chaîne de code. Mettez la chaîne de code dans la fonction de rendu et exportez-la pour qu'elle puisse être utilisée par le monde extérieur.

🎜🎜Cas🎜

🎜Insérer la description de l'image ici🎜🎜🎜🎜1. Confirmation du modèle 🎜🎜🎜 Supposons que le code suivant ait el</ code>, <code>modèle, render, $mount🎜
<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))
        ]
      )
    ]
  )
}
Copier après la connexion
Copier après la connexion
🎜Insérer la description de l'image ici🎜🎜🎜1) Vers quel nœud racine rendre🎜 : Déterminez s'il existe un attribut el, et si oui, obtenez le el directement le nœud racine, sinon, obtenez le nœud racine lors de l'appel de $mount🎜🎜🎜2) Quel modèle rendre au nœud racine🎜 : s'il faut appeler la fonction render et transmettre le modèle render : h =&gt ; h(App) -> <App></App>🎜
Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal