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 相关文章推荐
jquery $.each()使用探讨
Sep 23 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
js实现拖拽效果
Feb 12 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
Mar 18 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
jQuery实现自动切换播放的经典滑动门效果
Sep 12 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
微信小程序 常用工具类详解及实例
Feb 15 Javascript
关于vue.js过渡css类名的理解(推荐)
Apr 10 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
Oct 20 Javascript
vue使用自定义指令实现拖拽
Jan 29 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模板类代码
2008/09/07 PHP
为PHP初学者的8点有效建议
2010/11/20 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Promise扫盲贴
2019/06/24 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python简单实现刷新智联简历
2016/03/30 Python
python基础教程之五种数据类型详解
2017/01/12 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
JAVA中的关键字有什么特点
2014/03/07 面试题
政风行风建设整改方案
2014/10/27 职场文书