导航
一般开发js框架、js库不会用到 webpack 打包


let vm = new Vue({
el: '#app', // 3
render(createElement) {
return createElement('h1')
}, // 1
template: `` // 2
});
先看 options API 中是否有 render,没有再看 template,什么都没有就看 html 文件中的 el 了
template -> 【模板编译】 -> 形成真实 DOM
源代码的抽象语法的树状描述
把代码形成树状结构,然后对这个结构做分析、优化、处理,最终再把它转化为所需内容
说白了就是字符串解析、拼接、再解析、再拼接...
对源代码的数据结构化
模板中有 v-show 、v-if 、v-model 这些指令等其他内容,而这些内容是不能存在于 虚拟DOM 的,因为真实html不需要它们,它们是框架所需的,类似这种东西全部都得转为 AST 后做处理,把这些多余的(相对真实html)属性都解析成对应功能并最终删除它们。例如
</div> => 添加上 or 给警告<div 认为是个标签,删除id="app" 认为是 div 的一个属性,添加进 attrs ,又删除<div id="app" style="color: red;font-size: 20px;">
hello
<h1>{{ name }}</h1>
<ul>
<li style="color: green">{{ age }}</li>
<li>{{ info.job }}</li>
</ul>
</div>
转为 👇🏻
{
tag: "div",
type: 1, // 1代表标签
attrs: [
{
name: 'id',
value 'app'
},
{
name: 'style',
value: {
'color': 'red',
'font-size': '20px'
}
}
],
children: [
{
type: 3, // 3代表文本
text: 'hello'
},
{
type: 1,
tag: 'h1',
attr: null,
children: [
{
type: 3,
text: '{{name}}'
}
]
}
]
}
这不是虚拟DOM,虚拟DOM是描述DOM对象(节点)的,最终是要变成真实DOM

Vue.component('anchored-heading', {
render: function (createElement) {
return createElement(
'h' + this.level, // 标签名称
this.$slots.default // 子节点数组
)
},
props: {
level: {
type: Number,
required: true
}
}
})






通过对比 抽象出来的 JS 对象,来减少不必要的页面渲染与改动
{{ name }} 在转完之后还不会替换成真正的数据)// Vue2
new Vue({
// render: h => h(App), // 简写
render(h) {
return h(App)
}
}).$mount('#app');
// Vue3
import { createApp, h } from 'vue';
import App from './App.vue';
const app = createApp({
render() {
return h(App);
}
});
createElement