Skip to content

Vue 中,提供了 template 选项。

它允许我们像书写 HTML 结构一样,编写基础的 Vue 模板语法。

除此以外,template 模板还支持属性绑定事件绑定指令等等。

核心代码

js
export const createCompiler = createCompilerCreator(function baseCompile(
  template: string,
  options: CompilerOptions
): CompiledResult {
  const ast = parse(template.trim(), options)
  if (options.optimize !== false) {
    optimize(ast, options)
  }
  const code = generate(ast, options)
  return {
    ast,
    render: code.render,
    staticRenderFns: code.staticRenderFns
  }
})

编译流程

事实上,template 并非 HTML,它其实是 render 函数的变种,Vue 以一种可见的方式呈现在我们面前

`template` 模板字符串

`parse` (解析) → `AST`

`optimize` (优化) → 优化后的 `AST`,标记静态节点

`codegen` (代码生成) → `render` 字符串

`to-function` (转换函数) → `render` 函数

通用编译

另外,本节中的 compiler通用编译,也就是说这是一套基础库,它不会涉及到具体平台中的属性处理,但它预留了配置,供跨平台自调用

举例说明,假设 template 结构如下:

js
export const template = `<div
  class="container"
  style="color: red"
  v-if="isShow"
  :class="className"
  :style="style"
  :[dynamic]="dynamic"
  @click="handleClick"
  @confirm.stop.prevent="handleConfirm"
  @[event]="handleEvent"
  v-model="value"
  v-html="html"
>
  <span>static</span>
  <span>{{ name }}</span>
  <span>{{ msg | convert }}</span>
</div>`

那么单独compiler 解析之后(baseOptions 为空对象时)会存在如下 AST 结构:

Vueplatform 中专门划分了 web 平台,当我们传入 web 平台定义的编译 baseOptions,执行结果如下:

在此例中对比,可以发现,web compiler 结果比 compiler 结果中多了 modelstaticClassstaticStyleclassBinding 以及 styleBinding