Vue.use源碼學(xué)習(xí)小結(jié)
由于最近在做一些前端的項(xiàng)目,并且接手了Weex的項(xiàng)目,所以難免和Vue打起了交道,js也是從入門到學(xué)習(xí)中。項(xiàng)目里用到了Vue的插件機(jī)制,所以看了看Vue.use的源碼,還是比較簡單的,適合新手閱讀,所以記錄下來以免遺忘。
感謝
本文最后一章節(jié)[結(jié)合實(shí)際場(chǎng)景]是參考了eros 這個(gè)開源項(xiàng)目的,感謝eros項(xiàng)目組的開發(fā)。
什么是Vue插件
關(guān)于什么是Vue插件大家可以去看官網(wǎng)的解釋 ,總得來說就是提供一個(gè)全局注冊(cè)/調(diào)用的能力。
怎么用
我們以Weex為例。
首先有一個(gè)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)
很簡單,就是定義了一個(gè)Toast對(duì)面,然后給Toast對(duì)象創(chuàng)建一個(gè)install方法,方法里給Vue的prototype創(chuàng)建了一個(gè)$toast方法,該方法就是調(diào)用modal去彈一個(gè)toast,最后使用Vue.use方法去注冊(cè)這個(gè)Toast插件。
然后我們還有一個(gè)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>
在其中調(diào)用了this.$toast去使用插件的方法。
由此我們可以知道,Vue的插件機(jī)制就是通過Vue.use方法去注冊(cè)的。
源碼分析
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:判斷該插件是否已經(jīng)注冊(cè),如果已經(jīng)注冊(cè)就直接return,防止重復(fù)注冊(cè)。
0x02:然后通過toArray方法將Arguments這個(gè)類數(shù)組轉(zhuǎn)換成真正的數(shù)據(jù),并且去掉第一個(gè)元素。
0x03:將this,也就是Vue實(shí)例添加到toArray生成的args數(shù)組中。
0x04:判斷use的入?yún)lugin是install是否是一個(gè)方法,如果是則直接調(diào)用該方法。
0x05:如果第四步是false,則判斷plugun本身是不是一個(gè)方法,如果是方法,則用它本身代替install去執(zhí)行。
0x06:將plugin的installed標(biāo)記位設(shè)置為true。
就這么簡單的6步,use方法就分析完了,其實(shí)就是為了去執(zhí)行插件的install方法,而結(jié)合上面的例子我們知道,install中就把$toast賦值給了Vue的prototype,在其他地方就可以使用的。
結(jié)合實(shí)際場(chǎng)景
學(xué)習(xí)了Vue的插件機(jī)制,那么這個(gè)機(jī)制我們能用來做什么呢?我們結(jié)合Weex來看。
首先我們知道,Weex是把bundle下發(fā)到客戶端并渲染,所以一個(gè)頁面的加載時(shí)間取決于兩部分:bundle下載時(shí)間,bundle渲染時(shí)間。在不考慮本地緩存的情況下,bundle的大小直接決定了它的下載時(shí)間,以及用戶所消耗的流量,所以我們需要有一種方式去盡可能的減小這個(gè)bundle的體積。這里Vue的插件機(jī)制就可以排上用場(chǎng)了。
首先我們把一部分共用,不太會(huì)改動(dòng)的基礎(chǔ)的代碼放在客戶端,這樣bundle里的內(nèi)容就應(yīng)該是純業(yè)務(wù)相關(guān)的代碼,在把bundle下載下來之后手動(dòng)將客戶端的基礎(chǔ)js拼接到bundle上,這樣就能有效地減小bundle的體積,而想要使用這種方式,就必須把基礎(chǔ)js通過Vue的插件機(jī)制注冊(cè),業(yè)務(wù)js中全局調(diào)用,不然是無法拼接的(除非你的基礎(chǔ)js不通過webpack打包),畢竟webpack打包之后所有的代碼都是封閉的,無法互相調(diào)用。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
移動(dòng)端底部導(dǎo)航固定配合vue-router實(shí)現(xiàn)組件切換功能
經(jīng)常遇到這樣的需求,移動(dòng)端中的導(dǎo)航并不是在頂部也不是在底部,而是在最底部且是固定的,當(dāng)我們點(diǎn)擊該導(dǎo)航項(xiàng)時(shí)會(huì)切換到對(duì)應(yīng)的組件。這篇文章主要介紹了移動(dòng)端底部導(dǎo)航固定配合vue-router實(shí)現(xiàn)組件切換功能,需要的朋友可以參考下2019-06-06
詳解vue3?defineModel如何實(shí)現(xiàn)雙向綁定
隨著?Vue?3.3?引入的?defineModel?宏,開發(fā)者可以更加簡潔地實(shí)現(xiàn)組件內(nèi)部的雙向數(shù)據(jù)綁定,下面就跟隨小編一起來學(xué)習(xí)一下如何使用defineModel實(shí)現(xiàn)雙向綁定吧2024-12-12
Vue使用lodash進(jìn)行防抖節(jié)流的實(shí)現(xiàn)
本文主要介紹了Vue使用lodash進(jìn)行防抖節(jié)流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
vue實(shí)現(xiàn)虛擬列表組件解決長列表性能問題
這篇文章主要介紹了在vue中實(shí)現(xiàn)虛擬列表組件,解決長列表性能問題,本文給大家分享實(shí)現(xiàn)思路及實(shí)例代碼,需要的朋友可以參考下2022-07-07
vuejs+element-ui+laravel5.4上傳文件的示例代碼
本篇文章主要介紹了vuejs+element-ui+laravel5.4上傳文件的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
element ui循環(huán)調(diào)用this.$alert 消息提示只顯示最后一個(gè)
這篇文章主要介紹了element ui循環(huán)調(diào)用this.$alert 消息提示只顯示最后一個(gè),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Vue中調(diào)用組件使用kebab-case短橫線命名法和使用大駝峰的區(qū)別詳解
這篇文章主要介紹了Vue中調(diào)用組件使用kebab-case(短橫線)命名法和使用大駝峰的區(qū)別,通過實(shí)例可以看出如果是在html中使用組件,那么就不能用大駝峰式寫法,如果是在.vue?文件中就可以,需要的朋友可以參考下2023-10-10
vuex中this.$store.commit和this.$store.dispatch的基本用法實(shí)例
在vue的項(xiàng)目里常常會(huì)遇到父子組件間需要進(jìn)行數(shù)據(jù)傳遞的情況,下面這篇文章主要給大家介紹了關(guān)于vuex中this.$store.commit和this.$store.dispatch的基本用法的相關(guān)資料,需要的朋友可以參考下2023-01-01

