Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

用vue cli2 新建2个项目,一个使用runtime-compiler,一个使用runtime-only,创建时选项:

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 

创建后的项目对比main.js文件之间的区别:

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 runtime-compiler方式生成的文件main.js中有模板和注册组件。

runtime-only方式生成的文件main.js中模板。

 

1.runtime-compiler的Vue程序运行链条:

vm.options.template ------parse----> ast---------compile------------>vm.options.render(functions)-------render------->virtual Dom(虚拟Dom)--------update(diff and patch)------>UI

原理:如果vue中有模板template,vue则会将其解析成ast(抽象语法树),然后在将ast编译后给到render渲染函数,渲染成虚拟DOM,最后更新到UI页面。

 

2.runtime-only的模式,vue程序运行链条:

vm.options.render(functions)-------render------->virtual Dom(虚拟Dom)--------update(diff and patch)------>UI

 

render: h=>h(App)是箭头函数,相当于

render: function(h){

  return h(App)

}

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 3. h实际上是一个createElement函数,它可以创建页面DOM

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 

 1 new Vue({
 2   el: '#app',
 3   // components: { App },
 4   // template: '<App/>'
 5   render:function(createElement){
 6     // 1.createElement('标签',{标签属性},[标签内容,子标签])
 7     return createElement('h2',{class:'box'},['hello render'])
 8 
 9   }
10 })

以上代码就是取代(覆盖)了index.html页面默认的<div id='app'></div>,而改成<h2>hello render</h2>

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 4.在h2标签内部还可以创建字标签button

 1 new Vue({
 2   el: '#app',
 3   // components: { App },
 4   // template: '<App/>'
 5   render:function(createElement){
 6     // 1.createElement('标签',{标签属性},[标签内容,子标签])
 7     return createElement(
 8       'h2',
 9       {class:'box'},
10       ['hello render',
11         createElement('button',['按钮'])
12       ]
13     )
14   }
15 })

 

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 

由此论证,render:h=>h(App)是不需要在main.js中使用模板的。

 

5.除了以上方式还有另一种方式,即定义组件后,直接放置到render函数中,来创建组件。

 1 // The Vue build version to load with the `import` command
 2 // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
 3 import Vue from 'vue'
 4 import App from './App'
 5 
 6 Vue.config.productionTip = false
 7 const cpn = {
 8   template:`
 9   <div>我是组件:{{message}}</div>
10   `,
11   data(){
12     return{
13       message:"我是CPN"
14     }
15   }
16 }
17 
18 /* eslint-disable no-new */
19 new Vue({
20   el: '#app',
21   // 方式0:
22   // components: { App },
23   // template: '<App/>'
24   // 方式1:使用render函数
25   render:function(createElement){
26     // 1.createElement('标签',{标签属性},[标签内容,子标签])
27     // return createElement(
28     //   'h2',
29     //   {class:'box'},
30     //   ['hello render',
31     //     createElement('button',['按钮'])
32     //   ]
33     // )
34     // 方式2:使用组件方式
35     return createElement(cpn)
36   }
37 })

同样可以渲染成前端UI

Vuejs学习笔记(三)-10.runtime-compiler,runtime-only的区别

 

 

因此,在这一步中就没有template需要编译了。

 

6.对于runtime-compiler能解析template的底层支撑是安装了组件:

vue-template-compiler

npm install vue-loader vue-template-compiler --save-dev 

 

上一篇:iOS:runtime 消息传递 方法查找


下一篇:Go的runtime.GOMAXPROCS