Vue.js 和 Vue.runtime.js

2,884 阅读3分钟

Vue官方中文文档:

Vue文档

Vue有两个版本

  • 完整版:vue.jsvue.min.js(运行时版+编译器)(编译器:将模板字符串编译成为JS渲染函数的代码)
  • 运行时版:vue.runtime.jsvue.runtime.min.js(用来创建 Vue 实例、渲染并处理虚拟 DOM 等的代码)
  1. vue-cli 创建的 vue 项目,默认的配置是 vue.runtime.js 版本
  2. 后缀为.min.js的是生产版

完整版(vue.js)和运行时版(vue.runtime.js)的区别:

比较项 vue.js vue.runtime.js 评价
特点 有编译器(compiler) 无编译器 编译器占40%的体积
视图 写在HTML里或者写在template里 写在render函数里,用h创建标签 h是vue内置的回调函数
CDN引入 vue.js vue.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

  • template
  1. 类型:string
  2. 详细: 一个字符串模板作为 Vue 实例的标识使用。模板将会替换挂载的元素。挂载元素的内容都将被忽略,除非模板的内容有分发插槽。
  3. 其他:只适用于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
  }
})

单文件组件

我们有一种两全其美的方法:

使用 webpack 的 vue-loader。(注意:我们在使用 vue-cli 时,它已经帮我们配置好了这个加载器。)

我们在写组件的时候,在 build 时这个加载器会自动帮我们编译为 render 函数的方法来构造。

这样,用户下载产品时只需要下载体积小的非完整版,而开发人员编写代码时,也不需要使用 render 方法去构造元素。

↓↓↓以下代码用单文件组件的方法实现点一下“+1”按钮数字+1的功能↓↓↓:

html

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

创建一个vue文件。

Demo.vue

<template>
  <div class="demo">
    {{n}}
    <button @click="add">+1</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      n: 0
    };
  },
  methods: {
    add() {
      this.n += 1;
    }
  }
};
</script>

<style scoped>
.demo{
    color:blue;
}
</style>

在 template 中写 视图相关,在 script 中写 视图之外的所有内容,在 style 中写 CSS相关。

vue-loader 就可以把这些变为一个对象。

在js中引入:

main.js

import Vue from 'vue'
import Demo from './Demo.vue'

new Vue({
  render(h) {
    return h(Demo)
  }
}).$mount('#app')

这样 class为"demo" 的 div 就替换掉了 id为"app"的 div。并且 div 里有 n 和 button。

这也叫做 Vue 单文件组件。

在codesandbox中使用Vue

  1. 地址:codesandbox.io
  2. 点击右上角create sandbox
  3. 创建 Vue (选中vue-cli)
  4. 保存
  5. 选择 File > Export to ZIP,即可导出代码到 zip 压缩文件