Vue.js插件開發(fā)[譯]

作者:Joshua Bemenderfer
原文地址: creating-custom-plugins
譯者:jeneser

Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。插件的用途很廣泛,從全局組件,到為應(yīng)用添加一些額外的功能、如路由(Vue Router),存儲(chǔ)在應(yīng)用程序里的不可變數(shù)據(jù)(Vuex)。

一般來說,Vue插件的開發(fā)是非常簡(jiǎn)單的。Vue插件僅僅是包含一個(gè)公開方法install的對(duì)象、這個(gè)方法有兩個(gè)參數(shù):Vue 構(gòu)造器和一個(gè)可選的選項(xiàng)對(duì)象。盡管,插件系統(tǒng)看起來十分簡(jiǎn)單,但其仍然可以產(chǎn)生相當(dāng)大的作用。

你的第一個(gè)插件

為了打開vue插件開發(fā)的大門,下面我們將先實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的插件。這個(gè)插件的功能是:當(dāng)組件被掛載到DOM后,控制臺(tái)輸出Mounted!。

// 這是你的插件對(duì)象。 它可以導(dǎo)出到任何地方使用。
const MyPlugin = {
  // install方法是必需的
  // 包含兩個(gè)參數(shù):Vue 構(gòu)造器,一個(gè)可選的選項(xiàng)對(duì)象
  install(Vue, options) {
      // 使用minxin將功能注入所有組件
    Vue.mixin({
      // 添加到mixin中的任何內(nèi)容將被注入到所有組件中。
      //在這個(gè)例子中, mounted() 方法將在組件被掛載到DOM后調(diào)用
      mounted() {
        console.log('Mounted!');
      }
    });
  }
};

export default MyPlugin;

現(xiàn)在,你的插件便可以使用了。你可以通過導(dǎo)入并用Vue.use來顯式調(diào)用你的插件:Vue.use(MyPlugin)

import Vue from 'vue'
import MyPlugin from './my-vue-plugin.js'
import App from './App.vue'

// 在這里顯式調(diào)用插件
Vue.use(MyPlugin)

new Vue({
  el: '#app',
  render: h => h(App)
});

你可能會(huì)奇怪,為什么我不能直接在main.js中調(diào)用Vue.mixin()來實(shí)現(xiàn)這一點(diǎn)呢?其原因就是:我們向Vue添加全局功能,而沒有直接修改應(yīng)用邏輯。拆分模塊這種做法總是極好的,你可以隨時(shí)添加或移除一個(gè)單獨(dú)的模塊。同時(shí),這也使得插件非常容易分發(fā)。

添加一些其他的功能

安裝應(yīng)用范圍的組件和指令

如果你想把組件或指令打包為一個(gè)插件來進(jìn)行分發(fā),可以這樣寫:

import MyComponent from './components/MyComponent.vue';
import MyDirective from './directives/MyDirective.js';

const MyPlugin {
  install(Vue, options) {
    Vue.component(MyComponent.name, MyComponent)
    Vue.directive(MyDirective.name, MyDirective)
  }
};

export default MyPlugin;

修改Vue構(gòu)造器

你可以在插件中以你期待的方式來修改Vue構(gòu)造器(全局Vue對(duì)象)。下面的代碼在Vue構(gòu)造器中添加了一個(gè)屬性myAddedProperty和一個(gè)方法myAddedMethod。

const MyPlugin {
  install(Vue, options) {
    Vue.myAddedProperty = 'Example Property'
    Vue.myAddedMethod = function() {
      return Vue.myAddedProperty
    }
  }
};

export default MyPlugin;

修改Vue實(shí)例

不需要任何注入機(jī)制便可以將屬性或方法直接添加到組件實(shí)例,你可以這樣來修改Vue構(gòu)造器的prototype

const MyPlugin {
  install(Vue, options) {
    Vue.prototype.$myAddedProperty = 'Example Property'
    Vue.prototype.$myAddedMethod = function() {
      return Vue.myAddedProperty
    }
  }
};

export default MyPlugin;

這些屬性將會(huì)被加到所有的組件和Vue實(shí)例中。

社區(qū)里公認(rèn)的做法是:添加在Vue prototype里的任何屬性都要以美元符$作為其前綴

添加組件的生命周期鉤子或?qū)傩?/strong>

如上文中“你的第一個(gè)插件”示例所示,你可以通過Mixin添加生命周期鉤子對(duì)Vue組件進(jìn)行修改。

const MyPlugin = {
  install(Vue, options) {

    Vue.mixin({
      mounted() {
        console.log('Mounted!');
      }
    });

  }
};

export default MyPlugin;

Mixin是一個(gè)相當(dāng)重要的話題,但不在本文的討論范圍之內(nèi)。目前,可以肯定的是,Mixin是一種靈活的分布式復(fù)用 Vue 組件的方式,Mixin可以包含任意組件選項(xiàng)并可以混合進(jìn)其他組件之中。

自動(dòng)安裝插件

對(duì)于那些沒有在應(yīng)用中使用模塊化系統(tǒng)的用戶,他們往往將通過<script>標(biāo)簽引用你的插件,并期待插件無需調(diào)用Vue.use()便會(huì)自動(dòng)安裝 。你可以在插件最后添加如下幾行代碼來實(shí)現(xiàn)自動(dòng)安裝:

// 如果Vue是全局對(duì)象自動(dòng)安裝插件
if (typeof window !== 'undefined' && window.Vue) {
  window.Vue.use(MyPlugin)
}

發(fā)布你的插件

如果你已經(jīng)寫了一個(gè)插件,并準(zhǔn)備將其分享到社區(qū),下面是一些常用的幫助別人發(fā)現(xiàn)你的插件的方法,如果你還不熟悉這些流程的話。

  • 選擇一個(gè)合適的開源協(xié)議,然后將源碼發(fā)布到NPMGitHub。

  • Awesome-Vue提交PR。很多人會(huì)來這里尋找插件。

  • (其他) Vue論壇,Vue Gitter Channel,或者在Twitter上@ #vuejs

趕快去開發(fā)一些插件吧!

End

作者:Joshua Bemenderfer
原文地址:creating-custom-plugins

譯者:jeneser
譯者GitHub:https://github.com/jeneser

版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,177評(píng)論 0 29
  • 1.安裝 可以簡(jiǎn)單地在頁面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,298評(píng)論 4 129
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,372評(píng)論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,563評(píng)論 19 139
  • 在無數(shù)個(gè)夜里 溫柔 寒冷 粗礪 我的夢(mèng)春天一樣繁榮 無意識(shí)地瘋長(zhǎng) 除非強(qiáng)迫自己醒來 無法將其左右 文字是另一種夢(mèng) ...
    海月配音閱讀 198評(píng)論 0 0

友情鏈接更多精彩內(nèi)容