# codegen
编译的最后一步就是把优化后的 AST 树转换成可执行的代码,这部分内容也比较多,我并不打算把所有的细节都讲了,了解整体流程即可。部分细节我们会在之后的章节配合一个具体 case 去详细讲。
为了方便理解,我们还是用之前的例子:
<ul :class="bindCls" class="list" v-if="isShow">
<li v-for="(item,index) in data" @click="clickItem(index)">{{item}}:{{index}}</li>
</ul>
@前端进阶之旅: 代码已经复制到剪贴板
它经过编译,执行 const code = generate(ast, options),生成的 render 代码串如下:
with(this){
return (isShow) ?
_c('ul', {
staticClass: "list",
class: bindCls
},
_l((data), function(item, index) {
return _c('li', {
on: {
"click": function($event) {
clickItem(index)
}
}
},
[_v(_s(item) + ":" + _s(index))])
})
) : _e()
}
@前端进阶之旅: 代码已经复制到剪贴板
这里的 _c 函数定义在 src/core/instance/render.js 中。
vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
@前端进阶之旅: 代码已经复制到剪贴板
而 _l、_v 定义在 src/core/instance/render-helpers/index.js 中:
export function installRenderHelpers (target: any) {
target.