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 相关文章推荐
不错的一个日期输入 动态
Nov 06 Javascript
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
Jan 13 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
Sep 04 Javascript
基于jQuery实现的QQ表情插件
Aug 25 Javascript
CSS中position属性之fixed实现div居中
Dec 14 Javascript
js实现网页收藏功能
Dec 17 Javascript
对象转换为原始值的实现方法
Jun 06 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
Node登录权限验证token验证实现的方法示例
May 25 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
正则表达式语法
2006/10/09 Javascript
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
google地图的路线实现代码
2009/08/20 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
Python交换变量
2008/09/06 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
用python写爬虫简单吗
2020/07/28 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书