Vue.use源码学习小结


Posted in Javascript onJune 20, 2018

由于最近在做一些前端的项目,并且接手了Weex的项目,所以难免和Vue打起了交道,js也是从入门到学习中。项目里用到了Vue的插件机制,所以看了看Vue.use的源码,还是比较简单的,适合新手阅读,所以记录下来以免遗忘。

感谢

本文最后一章节[结合实际场景]是参考了eros 这个开源项目的,感谢eros项目组的开发。

什么是Vue插件

关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。

怎么用

我们以Weex为例。

首先有一个toast.js

const Toast = {}
Toast.install = (Vue, options) => {
  Vue.prototype.$toast = (msg, duration = 0.8) => {
    const modal = weex.requireModule('modal')
    modal.toast({
      message: msg,
      duration: 0.8
    })
  }
}
Vue.use(Toast)

很简单,就是定义了一个Toast对面,然后给Toast对象创建一个install方法,方法里给Vue的prototype创建了一个$toast方法,该方法就是调用modal去弹一个toast,最后使用Vue.use方法去注册这个Toast插件。

然后我们还有一个index.vue:

<template>
 <div>
 <div class="box" @click="onclick" @longpress="onlongpress" @appear="onappear" @disappear="ondisappear"></div>
  </div>
</template>

<script>
 const modal = weex.requireModule('modal')

 export default {
   methods: {
     onclick (event) {
       this.$toast("aaa", 0.8)
     },
     onlongpress (event) {
       console.log('onlongpress:', event)
       modal.toast({
         message: 'onlongpress',
         duration: 0.8
       })
     },
     onappear (event) {
       console.log('onappear:', event)
       modal.toast({
         message: 'onappear',
          duration: 0.8
        })
      },
      ondisappear (event) {
        console.log('ondisappear:', event)
        modal.toast({
          message: 'ondisappear',
          duration: 0.8
        })
      }
   }
 }
</script>

<style scoped>
.box {
  border-width: 2px;
  border-style: solid;
  border-color: #BBB;
  width: 250px;
  height: 250px;
  margin-top: 250px;
  margin-left: 250px;
  background-color: #EEE;
}
</style>

在其中调用了this.$toast去使用插件的方法。

由此我们可以知道,Vue的插件机制就是通过Vue.use方法去注册的。

源码分析

Vue.use = function (plugin) {
  if (plugin.installed) {
    return
  }
  var args = toArray(arguments, 1);
  args.unshift(this);
  if (typeof plugin.install === 'function') {
    plugin.install.apply(plugin, args);
  } else if (typeof plugin === 'function') {
    plugin.apply(null, args);
  }
  plugin.installed = true;
  return this
};

function toArray (list, start) {
 start = start || 0;
 var i = list.length - start;
 var ret = new Array(i);
 while (i--) {
  ret[i] = list[i + start];
 }
 return ret
}

use方法非常简单:

0x01:判断该插件是否已经注册,如果已经注册就直接return,防止重复注册。

0x02:然后通过toArray方法将Arguments这个类数组转换成真正的数据,并且去掉第一个元素。

0x03:将this,也就是Vue实例添加到toArray生成的args数组中。

0x04:判断use的入参plugin是install是否是一个方法,如果是则直接调用该方法。

0x05:如果第四步是false,则判断plugun本身是不是一个方法,如果是方法,则用它本身代替install去执行。

0x06:将plugin的installed标记位设置为true。

就这么简单的6步,use方法就分析完了,其实就是为了去执行插件的install方法,而结合上面的例子我们知道,install中就把$toast赋值给了Vue的prototype,在其他地方就可以使用的。

结合实际场景

学习了Vue的插件机制,那么这个机制我们能用来做什么呢?我们结合Weex来看。

首先我们知道,Weex是把bundle下发到客户端并渲染,所以一个页面的加载时间取决于两部分:bundle下载时间,bundle渲染时间。在不考虑本地缓存的情况下,bundle的大小直接决定了它的下载时间,以及用户所消耗的流量,所以我们需要有一种方式去尽可能的减小这个bundle的体积。这里Vue的插件机制就可以排上用场了。

首先我们把一部分共用,不太会改动的基础的代码放在客户端,这样bundle里的内容就应该是纯业务相关的代码,在把bundle下载下来之后手动将客户端的基础js拼接到bundle上,这样就能有效地减小bundle的体积,而想要使用这种方式,就必须把基础js通过Vue的插件机制注册,业务js中全局调用,不然是无法拼接的(除非你的基础js不通过webpack打包),毕竟webpack打包之后所有的代码都是封闭的,无法互相调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
给Javascript数组插入一条记录的代码
Aug 30 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
javascript从image转换为base64位编码的String
Jul 29 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
使用JQuery在线制作ppt并在线演示源码特效
Sep 08 Javascript
JS实现的最简Table选项卡效果
Oct 14 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
Nov 10 Javascript
Vuex入门到上手教程
Jun 20 #Javascript
JavaScript 中的 this 工作原理
Jun 20 #Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 #Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 #Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 #Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 #Javascript
JS中call和apply函数用法实例分析
Jun 20 #Javascript
You might like
php 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
PHP return语句的另一个作用
2014/07/30 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
python输出100以内的质数与合数实例代码
2018/07/08 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
python 将Excel转Word的示例
2021/03/02 Python
毕业生就业协议书
2014/04/11 职场文书
保研推荐信
2014/05/09 职场文书
针对吵架老公保证书
2015/05/08 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
讲解MySQL增删改操作
2022/05/06 MySQL