vue完整版和runtime版本,render和template对比

923 阅读4分钟

vue完整版和runtime版本

完整版

  1. 对应的文件名为vue.js或vue.min.js。
  2. 完整版 = 运行时版+编译器(编译器:将模板字符串编译成为JS渲染函数的代码)
  3. 该版本有编译器,占用代码体积,所以比runtime版大40%的体积。
  4. 使用该版本,可直接将内容写在HTML中查看视图效果,或用template 渲染到 HTML。
  5. webpack引入,需要配置alias,@vue/cli 引入也需要额外配置。
// html
<div id="app"></div>

// main.js
new Vue({
  el: "#app", // 模版字符串插入的位置
  template: `
    <div>{{ value }}</div>
  `,  // 模版字符串
  data: {
    value: 0
  }, // 替换的数据,即{{ value }} 被替换为0
})

最后获得的html

<div id="app">0</div>

运行版

  1. 是只包含运行时的版本,没有编译器,CDN引入所对应的文件名为vue.runtime.js或vue.runtime.min.js。
  2. 因该版本无编译器,故占用代码体积小,但无法直接实现页面渲染,需要利用 render 里的 h 函数来创建 HTML 节点。h就是vue.runtime.js提供的函数,它接收模版字符串中的参数,返回渲染好的原始的html。
  3. vue.js的webpack引入和@vue/cli 引入都默认使用此版本。
new Vue({
  el: "#app",
  data: {
    value: 0
  },
  render(h) {
    return h('div', this.n)
  },
})

在实际开发中,由于h函数的参数比较复杂,实际开发中通过使用webpack的vue-loader插件能将vue单文件组件(以.vue结尾的文件)转换为h函数所需要的参数。

  • 如将vue.js错引用为vue.runtime.js,则无法将HTML编译为视图;
  • 如将vue.runtime.js错引用为vue.js,代码体积会变大
比较项vue.jsvue.runtime.js评价
特点有编译器(compiler)无编译器编译器占40%的体积
视图写在HTML里或者写在template里写在render函数里,用h创建标签h是vue内置的回调函数
CDN引入vue.jsvue.runtime.js文件名不同,生产环境后缀都为.min.js (vue.min.js/vue.runtime.min.js)
webpack引入需配置alias默认使用此版本vue作者配置的
@vue/cli引入需要额外配置默认使用此版本vue作者配置的

总结

  1. 完整版可直接将内容写在HTML中查看视图效果,或用template渲染到HTML。
  2. 运行时版无法直接实现页面渲染,需要利用 render 里的 h 函数来创建 HTML 节点,vue.js的webpack引入和@vue/cli 引入都默认使用此版本。
  3. 运行时版最大的意义就在于体积小。
  4. 单文件组件:由于h函数的参数比较复杂,可以使用vue-loader把vue文件里的HTML转为h函数。

template 和 render

参考:www.cnblogs.com/wuqilang/p/…

  • template----html的方式做渲染

  • render----js的方式做渲染

  • render(提供)是一种编译方式: render里有一个函数h,这个h的作用是将单文件组件进行虚拟DOM的创建,然后再通过render进行解析。

  • h就是createElement()方法:createElement(标签名称,属性配置,children)

  • template也是一种编译方式,但是template最终还是要通过render的方式再次进行编译。

区别

  1. render渲染方式可以让我们将js发挥到极致,因为render的方式其实是通过createElement()进行虚拟DOM的创建。逻辑性比较强,适合复杂的组件封装。
  2. template是类似于html一样的模板来进行组件的封装。
  3. render的性能比template的性能好很多。
  4. render函数优先级大于template。

template

  1. 类型:string
  2. 详细: 一个字符串模板作为 Vue 实例的标识使用。模板将会替换挂载的元素。挂载元素的43. 内容都将被忽略,除非模板的内容有分发插槽。 其他:只适用于vue的完整版中,与el属性配合使用。

用template在页面中显示一个0

index.html

<body>
  <div id="app"></div>
  <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
</body>

main.js

new Vue({
  // 元素 element
  el: '#app',
  template: `
    <div>{{n}}</div>
  `,
  data: {
    n: 0
  }
})

render

  1. 类型:function
  2. 详细: 接收一个回调函数h(h为vue中内置的回调函数),h包含两个参数。第一个参数为渲染的dom对象名(字符串),第二个参数为dom内的内容。例如:render(h){ h('div','hello vue') }

用render在页面中显示一个0

index.html

<body>
  <div id="app"></div>
</body>

main.js

new Vue({
  // 元素 element
  el: '#app',
  render(h){
      // 创建一个div 里面是 n
    return h('div', this.n)
  },
  data: {
    n: 0
  }
})