> 웹 프론트엔드 > View.js > Vue 학습에서 템플릿 컴파일 원칙에 대해 이야기합니다.

Vue 학습에서 템플릿 컴파일 원칙에 대해 이야기합니다.

青灯夜游
풀어 주다: 2023-03-07 19:01:00
앞으로
1513명이 탐색했습니다.

템플릿 편집이란 무엇인가요? 다음 기사에서는 Vue의 템플릿 컴파일에 대해 설명하고 템플릿 컴파일의 원칙에 대해 논의합니다. 도움이 되기를 바랍니다.

Vue 학습에서 템플릿 컴파일 원칙에 대해 이야기합니다.

vue는 <p>{{name}}</p> <p></p>와 같이 상태와 DOM 간의 바인딩 관계를 선언적으로 설명할 수 있는 템플릿 구문을 제공합니다. <p>{{name}}</p> <p></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: &#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;)
로그인 후 복사

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

템플릿 컴파일은 템플릿을 렌더링 함수로 컴파일하는 과정을 의미합니다. 렌더링 함수의 기능은 실행될 때마다 최신 상태를 기반으로 새로운 vnode를 생성하는 것입니다. 컴파일 프로세스는 다음과 같습니다. 입력으로서의 템플릿-> 템플릿 컴파일 단계->렌더링 기능 생성

인터뷰 질문

🎜🎜🎜템플릿을 렌더링 함수로 컴파일🎜🎜🎜< img src=" https://img.php.cn/upload/article/000/000/024/172657b2595ab9895c742e2770ca3e51-0.jpeg" alt="여기에 이미지 설명 삽입"/>🎜
  • 파서< /code>: 템플릿을 AST(추상 구문 트리)로 구문 분석합니다.</li><li><code>Optimizer: AST를 탐색하여 정적 노드를 표시합니다. 정적 노드는 변경할 수 없고 그럴 필요가 없기 때문입니다. 새 가상 노드를 생성하고 기존 가상 노드를 직접 복제하려면 정적 노드에 레이블을 지정합니다.
  • 코드 생성기: AST를 사용하여 렌더링 기능을 생성합니다. AST를 코드 문자열로 변환합니다. 코드 문자열을 렌더링 함수에 넣고 외부 세계에서 사용할 수 있도록 내보냅니다.

🎜🎜Case🎜

🎜여기에 이미지 설명 삽입🎜🎜🎜🎜1. 템플릿 확인🎜🎜🎜 el</을 사용하여 다음 코드를 가정합니다. 코드>, <code>템플릿, 렌더링, $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))
        ]
      )
    ]
  )
}
로그인 후 복사
로그인 후 복사
🎜여기에 그림 설명 삽입🎜🎜🎜1) 렌더링할 루트 노드🎜: el 속성이 있는지 확인하고, 그렇다면 가져오기 el 직접 루트 노드, 그렇지 않은 경우 $mount🎜🎜🎜 호출 시 루트 노드를 가져옵니다. 2) 루트 노드에 렌더링할 템플릿🎜: render 함수를 호출하고 템플릿을 전달할지 여부 render: h =&gt ; h(App) -> <App></App>🎜
관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿