模板渲染是一个前端的基础概念,每个框架都有自己的实现方式:
```mermaid
flowchart TD
A[解析模板] --> B[生成AST]
B --> C[优化编译]
C --> D[生成渲染函数]
D --> E[创建虚拟DOM]
E --> F[渲染真实DOM]
F --> G[更新视图]
A1[将模板字符串解析成标记tokens] --> A
B1[构建抽象语法树<br/>描述模板结构] --> B
C1[静态节点提升<br/>事件缓存<br/>条件优化] --> C
D1[生成可执行的<br/>JavaScript函数] --> D
E1[构建虚拟节点树<br/>进行DOM Diff] --> E
F1[操作浏览器DOM API<br/>更新真实节点] --> F
G1[触发重绘/重排<br/>完成视图更新] --> G
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#bbf,stroke:#333,stroke-width:2px
style C fill:#ddf,stroke:#333,stroke-width:2px
style D fill:#fbb,stroke:#333,stroke-width:2px
style E fill:#bfb,stroke:#333,stroke-width:2px
style F fill:#fbf,stroke:#333,stroke-width:2px
style G fill:#ff9,stroke:#333,stroke-width:2px
```
## 通用的渲染概念
```Java
// 1. 模板解析
Template -> AST(抽象语法树)
// 2. 编译优化
AST -> 优化 -> 渲染函数
// 3. 虚拟DOM
VNode {
type: String | Component
props: Object
children: Array | String
}
// 4. DOM操作
diff算法 -> 最小化DOM更新
```
## [Vue3@](
[email protected])的模版渲染
```vue
<!-- 声明式渲染 -->
<template>
<div class="user">
Hello, {{ user.name }}!
</div>
</template>
<!-- 编译后的渲染函数 -->
function render() {
return h('div', { class: 'user' }, [
'Hello, ' + user.name + '!'
])
}
```