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实现的分页函数
Feb 07 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
浅析Javascript匿名函数与自执行函数
Feb 06 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
Dec 01 Javascript
vue小图标favicon不显示的解决方案
Sep 19 Javascript
详解Webpack + ES6 最新环境搭建与配置
Jun 04 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
Feb 04 jQuery
JavaScript实现简单的弹窗效果
May 19 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
php相当简单的分页类
2008/10/02 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
Python内置模块logging用法实例分析
2018/02/12 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
大学生毕业求职简历的自我评价
2013/10/24 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
C++程序员求职信范文
2014/04/14 职场文书
搞笑爱情保证书
2014/04/29 职场文书
护士节活动总结
2014/08/29 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
消防演习感想
2015/08/10 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
Javascript webpack动态import
2022/04/19 Javascript
Python读取和写入Excel数据
2022/04/20 Python