runtimecompiler
main函数中的代码

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  components: { App },
  template: '<App/>'
})

运行过程
template->ast->render->vdom->rdom
template模板-(解析)>抽象语法树-(编译)>render函数->虚拟DOM->真实DOM

runtimeonly
main函数中的代码

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  render: h => h(App)
})

运行过程
render->vdom->rdom
render函数->虚拟DOM->真实DOM
区别
通过上面的运行过程不难看出runtimecompiler的运行步骤更多,因此相比来说runtimeonly的性能更高,实现的代码量也更少
疑问
查看runtimeonly的App.vue代码

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

不难发现其中也是有template标签的,那么这里的template为什么没有经过解析到ast的步骤呢?
其实在webpack对Vue进行的配置的时候我们我们安装了两个loader,一个是vue.loader,用来加载Vue文件,而另一个则是Vue-template-compiler,用来将.Vue文件的template转化为render函数。所以在main.js引用App时,引用的不是.Vue文件,而是已经被解析过的App对象。