vue插件開發(fā)與發(fā)布

寫在前面


本次演示的是開發(fā)一個 vue手機虛擬支付鍵盤插件
主要講解的是如何快速開發(fā)一個vue插件并發(fā)布到npm上

源碼地址

所有代碼都可以在我的GitHub vue-pay-keyboard 上查看,歡迎start..

demo演示地址

請用手機或者電腦仿真查看 vuepayboard

關(guān)于vue插件


插件一般都有如下幾種形式導入

ES6
import vuePayKeyboard from 'vue-pay-keyboard'

//  通過require 導入
var vuePayKeyboard = require('vuePayKeyboard')

// 通過use掛載
Vue.use(vuePayKeyboard)

// 或者直接導入js文件
<script src="./dist/vue-pay-keyboard.js"></script>

無論是那種方式,都可以非常方便的在我們的項目當中使用,那么vue的插件應(yīng)該如何寫并發(fā)布到npm上供大家使用呢 其實非常的簡單.

vue插件的規(guī)范


vue官網(wǎng)有給出明確的文檔 vue插件開發(fā) ,我們需要有一個公開方法 install,里面來包含我們要處理的業(yè)務(wù)。這個方法的第一個參數(shù)是 Vue 構(gòu)造器 , 第二個參數(shù)是一個可選的選項對象:

// plug.js 
const plug = {  //  定義一個對象
    install (Vue, options) {  // 需要擁有一個 install 方法
    }
}
// 導出這個對象
export default plug

那么此時我們就可以通過 use的方式來使用

import plug from  'plug'
Vue.use(plug)

此時plup暴露給我們的 就是 install 函數(shù)定義的方法及屬性

廢話不多說,直接開始我們的插件開發(fā),本次將直接使用vue簡化版腳手架.至于為什么不從0開始搭建webpack,原因大致是因為網(wǎng)上太多諸如此類的博客了硝拧,就沒必要再嚼別人的口香糖了橱鹏,其次為了照顧那些不懂 webpack 配置的童鞋們以及達到快速開發(fā)的目的.

初始化項目

vue init webpack-simple vue-pay-keyboard

一切都基于這個腳手架來改造,只需要稍微改動就可以變成我們的東西,當然其中重要的配置 會相對應(yīng)的解釋

這里我選擇了使用sass 因為后面我會用到 大家可以自行選擇

初始化項目

OK 一切先用默認的,等會我們再改, 啟動項目之后糠悼,我們把自帶的多余的東西全刪掉届榄,然后在src下面新建一個 lib文件 用于存放我們的源碼
并新建 index.js 用于作為我們的插件入口
新建一個 vue-pay-keyboard.vue 存放我們的開發(fā)的組件
至此 文件目錄如下:

.
├── src                            // 源碼目錄
│   ├── lib                        // 源碼
│   │   ├── index.js               // 插件入口
│   │   ├── vue-pay-keyboard.vue   // 組件
│   ├── App.vue                    // 頁面入口文件
│   ├── main.js                    // 程序入口文件,加載各種公共組件
├── index.html                     // 入口html文件
.

非常簡潔倔喂,然后開始寫我們的index.js
我們需要導入.vue組件铝条,并按照vue插件規(guī)范開發(fā)并且導出,這里我們用全局組件的方式作為插件,其他類型的插件調(diào)用方式也都大同小異

import vuePayKeyboard from './vue-pay-keyboard.vue' // 導入組件
const paykeyboard = {
    install (Vue, options) {
        Vue.component(vuePayKeyboard.name, vuePayKeyboard)  // vuePayKeyboard.name 組件的name屬性
       // 類似通過 this.$xxx 方式調(diào)用插件的 其實只是掛載到原型上而已
       // Vue.prototype.$xxx  // 最終可以在任何地方通過 this.$xxx 調(diào)用
       // 雖然沒有明確規(guī)定用$開頭  但是大家都默認遵守這個規(guī)定
    }
}
export default paykeyboard // 導出..

ok 可以說基本的開發(fā)環(huán)境我們已經(jīng)搭建完成了...你們信嗎?
接下來我們寫鍵盤的業(yè)務(wù)邏輯 會相對復雜席噩,這里根于不同的業(yè)務(wù)需求班缰,會有不同的解決方案,但是有些東西都是相通的.

如何寫好一個組件


我認為通常一個好的插件 首要的是解決用戶的問題,其次在有必要的情況下再進行個別案例的解決,通常需要如下:

  • 通用性 // 能夠滿足大部分用戶需求
  • 可訂制性 // 能夠滿足用戶針對不同業(yè)務(wù)環(huán)境進行訂制
  • 可擴展性 // 能夠滿足用戶對其他方面的拓展

我們先簡單的寫下樣式 我盡量寫的像支付寶的樣式哈悼枢。埠忘。。
同時對外開放幾個屬性和方法

可傳屬性

Property Description type default
highlightColor 點擊時高亮的顏色 String #000
pasDigits 密碼的位數(shù) Number 6
isPay 是否顯示支付鍵盤 Boolean false
payTitle 支付標題 String 請輸入支付密碼

事件

Function Name Description
pasEnd 密碼輸入完畢
close 關(guān)閉鍵盤

好了 我們的靜態(tài)頁面大致完成了, 輸完6位號碼自動驗證 進行下一步動作

這里移動端的1px用了我之前寫的一個十分簡單的class萧芙,至于其他邏輯可看源碼,由于時間緊迫,代碼方面我們往后再說给梅,至此 我們基本完成開發(fā) 開始效果調(diào)試

在app.vue中寫一個簡單的按鈕用于喚起支付鍵盤
并且在main.js中導入vuePayKeyboard 插件
我們先暫時這么寫 因為還未發(fā)布到npm

import vuePayKeyboard from './lib/index.js'
Vue.use(vuePayKeyboard)

在app.vue中注冊事件并使用插件

<button @click="payShow()">點擊支付</button>
// 直接使用
<vue-pay-keyboard :isPay='isPay' @pasEnd='pasEnd' @close='isPay=false'></vue-pay-keyboard>

可以看到演示效果如下:


demo.gif

呼 ~ 至此 我們所有開發(fā)都完成了 前面都是大家熟悉的 現(xiàn)在進入打包以及發(fā)布 也都是幾分鐘的事情.
修改 weppack.config.js 部分配置

module.exports = {
 // entry: './src/main.js',  // 項目入口 我們通過npm run dev 就是從這里進去的 我們通過run build 打包編譯也是
  // 因為我們要打包的插件在lib里面 所以稍稍改一下
   entry: './src/lib/index.js', // 注釋掉原有的 注意 我們打包的時候一定不要把vue也打包進去
  output: {
    path: path.resolve(__dirname, './dist'), 
    publicPath: '/dist/',
   // filename: 'build.js' // 打包后輸出的文件名
    filename: 'vue-pay-keyboard.js' // 我們可不想打包后叫build.js 多l(xiāng)ow啊 起一個與項目相對應(yīng)的
    library: 'PayKeyboard', // library指定的就是你使用require時的模塊名,這里便是require("PayKeyboard")
    libraryTarget: 'umd', //libraryTarget會生成不同umd的代碼,可以只是commonjs標準的双揪,也可以是指amd標準的动羽,也可以只是通過script標簽引入的。
    umdNamedDefine: true // 會對 UMD 的構(gòu)建過程中的 AMD 模塊進行命名渔期。否則就使用匿名的 define运吓。
  },

ok 通過 npm run build 打包一次
此時可以看到生成了一個dist文件里面并且有兩個文件 一個vue-pay-keyboard.js與一個map文件
我們已經(jīng)打包完成 先在index.html試一試是否可以通過直接導入script標簽的方式使用
此時我們需要先把index.html里面默認導入build.js文件改成我們打包之后的文件名稱 并且需要導入vue
此時并沒有我們想象的那么順利 報錯了..

image.png

報錯的原因是我們并沒注入vue-pay-keyboard 因為直接用標簽的方式 我們并不可能使用use

修改index.js文件

...
// 新增
if (typeof window !== 'undefined' && window.Vue) {
    window.Vue.use(paykeyboard);
}
...

再次打包 可以看到已經(jīng)成功了
最后發(fā)布npm 最重要的是我們需要先修改package.json文件

private:false, // 默認是true 私人的 需要改為false 不然發(fā)不上去 你可以試試..
"license": "MIT", // 許可證
 "main": "dist/vue-pay-keyboard.js", // 這個超級重要 決定了你 import xxx from “vue-pay-keyboard” 它默認就會去找 dist下的vue-pay-keyboard 文件
 "files": [  // 用于發(fā)布忽略 當我們的包夠復雜的時候 我們總不能把所有本地開發(fā)或者測試的組件全部都發(fā)布上去 這個時候我們開啟這個選項 意為只發(fā)布這兩個文件 當然我們這個包比較簡單 就不開啟了
    "dist",
    "src"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/yucccc/vue-pay-keyboard"
  }, // 配置這個地址存放你項目在github上的位置 也尤為重要

OK 一切搞定 發(fā)布npm吧 哦 記得寫一下readme
注冊好npm后 添加用戶

npm adduser 
Username: your name
Password: your password
Email: yourmail[@gmail](/user/gmail).com

因為我這邊已經(jīng)添加過了 沒辦法演示 接著

npm whoami // 看一看你是誰.. 

沒問題

npm login // 登陸 
npm publish // 發(fā)布

這里需要注意的是 如果你使用了淘寶的鏡像源,也會導致發(fā)布失敗疯趟,需要切換到npm鏡像 推薦使用nrm 這里不展開

image.png

報了一個錯,說了這么久 我自己卻忘了把私人改為 false.

image.png

OK 我們發(fā)布成功.試一試能不能下載并且引用先.(有時候可能會存在延時或者緩存)
然后再嘗試通過 npm 下載來看看否使用吧 ~~

我們通過安裝依賴

npm install vue-pay-keyboard -S 

正常導入之后可能會發(fā)現(xiàn)找不到vue-pay-keyboard 這個模塊.
原因是我們的忽略文件默認忽略了 dist 文件
修改 .gitignore 去掉忽略dist
這里注意 每次上到npm上需要更改版本號拘哨,不然也會錯誤

總結(jié):

vue插件的大致思路其實都是這樣.
你也趕快來開發(fā)屬于你的第一個vue插件吧.
如果覺得對你有幫助 希望能給我一個小小的start vue-pay-keyboard
如有錯誤與紕漏,十分感謝您的指出
至于插件的更加可用性,后期有時間會修改.
感謝您看到最后!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末信峻,一起剝皮案震驚了整個濱河市倦青,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盹舞,老刑警劉巖产镐,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘庄,死亡現(xiàn)場離奇詭異,居然都是意外死亡癣亚,警方通過查閱死者的電腦和手機丑掺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來述雾,“玉大人街州,你說我怎么就攤上這事〔C希” “怎么了唆缴?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長取募。 經(jīng)常有香客問我琐谤,道長,這世上最難降的妖魔是什么玩敏? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任斗忌,我火速辦了婚禮,結(jié)果婚禮上旺聚,老公的妹妹穿的比我還像新娘织阳。我一直安慰自己,他們只是感情好砰粹,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布唧躲。 她就那樣靜靜地躺著,像睡著了一般碱璃。 火紅的嫁衣襯著肌膚如雪弄痹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天嵌器,我揣著相機與錄音肛真,去河邊找鬼。 笑死爽航,一個胖子當著我的面吹牛蚓让,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讥珍,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼历极,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衷佃?” 一聲冷哼從身側(cè)響起趟卸,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锄列,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體新蟆,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年右蕊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吮螺。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饶囚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸠补,到底是詐尸還是另有隱情萝风,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布紫岩,位于F島的核電站规惰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泉蝌。R本人自食惡果不足惜歇万,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勋陪。 院中可真熱鬧贪磺,春花似錦、人聲如沸诅愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违孝。三九已至刹前,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雌桑,已是汗流浹背喇喉。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筹燕,地道東北人轧飞。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像撒踪,于是被迫代替她去往敵國和親过咬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359