vue-cli3自定義插件并發(fā)布到npm

主要是記錄體驗(yàn)使用Vue CLI3自定義插件并發(fā)布到npm,然后在項(xiàng)目里下載使用的一個(gè)過程霎桅。

大綱

  1. 寫一個(gè)簡單的插件(寫插件注意事項(xiàng))
  2. 打包庫的相關(guān)配置
  3. 注冊(cè)npm遇革,登錄npm
  4. 發(fā)布流程
  5. 刪除已上傳包(短時(shí)間內(nèi)上傳的包)
  6. 刪除已上傳較長時(shí)間的包
npm unpublish --force //強(qiáng)制刪除锻霎,這個(gè)是撤銷24小時(shí)發(fā)布的包旋恼,有些包發(fā)布久了冰更,這個(gè)方法不會(huì)再管用了舟铜。
npx force-unpublish package-name '原因描述' //是刪除已經(jīng)發(fā)布好的包
  1. 版本更新發(fā)布時(shí)操作。
  2. 發(fā)布成功下載使用時(shí)樣式丟失問題归斤。

一痊夭、寫一個(gè)簡單的插件

官方文檔是這么說的:
Vue.js的插件應(yīng)該暴露一個(gè)install方法。這個(gè)方法的第一個(gè)參數(shù)是Vue構(gòu)造器脏里,第二個(gè)參數(shù)是一個(gè)可選的選項(xiàng)對(duì)象她我。

MyPlugin.install = function(Vue){
  //1. 添加全局方法
  Vue.myGlobalMethod = function(){
    //邏輯...
  }
  //2. 添加全局資源
  Vue.directive('my-directive',{
    bind(el,binding,vnode,oldVnode){
      //邏輯...
    }
  })
  //3. 注入組件選項(xiàng)
  Vue.mixin({
    created:function(){
      //邏輯...
    }
  })
  //4. 添加實(shí)例方法
  Vue.prototype.$myMethod = function(){
    //邏輯
  }
}

然后就在上面幾種創(chuàng)建插件的方法中根據(jù)需求寫一個(gè)插件。
需求:寫一個(gè)提示框當(dāng)點(diǎn)擊按鈕時(shí)給一個(gè)提示狀態(tài)膝宁,之后會(huì)自動(dòng)隱藏鸦难。
預(yù)覽:


toast插件

本插件使用vue-cli3腳手架搭建:

項(xiàng)目結(jié)構(gòu)圖

將腳手架自動(dòng)生成的多余代碼去掉,在src中新建lib文件夾员淫,

然后在lib文件夾下創(chuàng)建 .vue .js .css文件。

//vue-leilei-toast
<template>
  <div>
    <transition name="fade">
      <div v-show="show" class="toast">{{message}}</div>
    </transition>
  </div>
</template>
<script>
export default {
  name: "leilei-toast",
  components: {},
  data() {
    return {
      message: "hello world",
      show: false
    };
  },

  computed: {},

  watch: {},

  methods: {
  },

  created() {},

  mounted() {}
};
</script>
<style lang='scss'>
@import url("index.css");
</style>
//index.js
import Toast from './vue-leilei-toast.vue';

var ToastPlugin = {};

ToastPlugin.install = function(Vue,options){
    var ToastConstructor = Vue.extend(Toast);
    var ToastInstance = new (ToastConstructor);
    var div = document.createElement('div');
    ToastInstance.$mount(div);
    document.body.appendChild(ToastInstance.$el);

    Vue.prototype.$toast = function(msg,duration=2000){
        ToastInstance.message = msg;
        ToastInstance.show = true;
        setTimeout(()=>{
            ToastInstance.show = false
        },duration)
    }
}
export default ToastPlugin
/* css */
.toast{
    position: fixed;
    top: 50%;
    left: 50%;
    background: rgba(0,0,0,.5);
    padding: 10px 40px;
    border-radius: 8px;
    color: #fff;
    transform: translateX(-50%);
}
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity: 0;
}

此時(shí)可以在本地測(cè)試一下。
main.js中引入并使用

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

App.vue中測(cè)試使用

<template>
  <div id="app">
    <button @click="opentoast()">我是個(gè)按鈕</button>
  </div>
</template>
<script>
export default {
  methods:{
    opentoast(){
       this.$toast("hello world",1000)
    }
  }
}
</script>

點(diǎn)擊按鈕測(cè)試使用 em...沒問題关面。

二缩抡、打包組件

vue 打包組件相關(guān)配置文檔:構(gòu)建目標(biāo)-庫
在package.json中做相關(guān)配置

主要配置有四個(gè)參數(shù):

  1. target:默認(rèn)為構(gòu)建應(yīng)用榴都,改為lib即可啟用構(gòu)建庫模式
  2. name:輸出文件名
  3. dist:輸出目錄春瞬,默認(rèn)為dist萄涯,可以修改我們改為lib
  4. entry:入口文件路徑燃逻,默認(rèn)為src/App.vue,我們修改為src/lib/index.js
//package.json
{
  "scripts":{
    "lib":"vue-cli-service build --target lib --name leilei-toast --dest lib src/lib/index.js"
  }
}

接著運(yùn)行npm run lib命令打包組件

打包后的文件結(jié)構(gòu)圖


打包后文件結(jié)構(gòu)圖

打包后控制臺(tái)輸出


控制臺(tái)輸出

然后在package.json中配置組件信息

name:包名,該名不能和npm上已有包重名,如何驗(yàn)證自己的包名是否會(huì)和npm上的包沖突?直接去npm上搜想定義的包名。
version:版本號(hào),不能和歷史版本號(hào)相同挽荡。
description:簡介
main:入口文件
keyword:關(guān)鍵字株依,以空格分隔
author:作者
private:是否私有吗坚,需修改為false,否則發(fā)布失敗
license:開源協(xié)議

package.json配置如下

{
  "name": "vue-mstian-toast", //給自己的包起一個(gè)響亮的名字 哈哈
  "version": "0.1.0", //版本號(hào)這塊可以專門搜搜一些文章看看
  "description": "vue-mstian-toast test", //描述
  "main": "lib/leilei-toast.umd.min.js", //入口文件需要選擇能支持模塊化的文件具體可以查看打包后的文件后綴然后查閱相關(guān)資料
  "keyword": "leilei vue toast test",
  "author": "Mstian",
  "private": false,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "lib": "vue-cli-service build --target lib --name leilei-toast --dest lib src/lib/index.js" //構(gòu)建庫的命令
  },
}

三总寻、注冊(cè) 登錄npm賬號(hào)

如果已有npm賬號(hào)可以忽略這一步
https://www.npmjs.com/
官網(wǎng)注冊(cè)即可祟印。
登錄注冊(cè)成功后點(diǎn)擊右上角頭像下拉菜單有個(gè)Packages選項(xiàng)站蝠,當(dāng)然如果沒有上傳過npm包的時(shí)候當(dāng)然是0 packages.

四、發(fā)布

如果修改過npm的鏡像地址比如使用了淘寶鏡像,就先改回來稚失,npm config set registry http://registry.npmjs.org

  1. cmd打開項(xiàng)目所在目錄句各,輸入登錄命令 npm login
  2. 根據(jù)提示信息輸入用戶名初厚,密碼亚情,郵箱站故。(注意:輸入密碼的時(shí)候命令面板不提示也沒有占位符,感覺好像沒有輸入東西一樣辜梳,其實(shí)已經(jīng)輸入了粱甫,接著輸入完整密碼下一步即可)
  3. 登陸成功后會(huì)有提示
    Logged in as name on http://registry.npmjs.org,此時(shí)可以使用npm whoami查看當(dāng)前操作用戶
    npm登陸成功
  4. 一切準(zhǔn)備就緒作瞄,準(zhǔn)備發(fā)包茶宵,
    當(dāng)確認(rèn)項(xiàng)目已經(jīng)編譯成功(npm run lib成功)輸入npm publish
  5. 不出意外這種操作是可以發(fā)布成功的宗挥。如果發(fā)布成功會(huì)在命令行顯示+ 包名@版本號(hào)乌庶,然后注冊(cè)的郵箱也會(huì)受到一條郵件。
  6. 發(fā)布成功之后就可以去npm官網(wǎng)查看自己發(fā)布的包契耿,如果是第一次發(fā)包瞒大,那么Packages下會(huì)有一個(gè)包。
  7. 使用包
    跟使用npm上的包流程一樣先安裝宵喂,再在main.js中引入糠赦,使用Vue.use()方法使用。之后就可以愉快的使用此插件啦锅棕。
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
import toast from './lib/index.js';
Vue.use(toast);
new Vue({
  render: h => h(App)
}).$mount('#app')

在組件中使用

this.$toast("hello world",1000)拙泽。

五、 六裸燎、 刪除包

刪除近期上傳的包

npm unpublish --force //強(qiáng)制刪除顾瞻,npm會(huì)根據(jù)package.json的version刪除該version的包版本。這個(gè)是撤銷24小時(shí)發(fā)布的包德绿,有些包發(fā)布久了荷荤,這個(gè)方法不會(huì)再管用了退渗。

刪除存在線上比較久的包

npx force-unpublish package-name '原因描述' //是刪除已經(jīng)發(fā)布好的包

使用此方法刪除包之后,包還會(huì)存在Packages列表中蕴纳,不過點(diǎn)擊進(jìn)去會(huì)有提示会油。


已刪除的包

如果刪除了包重新上傳之前的包的時(shí)候可能會(huì)失敗,這個(gè)時(shí)候改一下包名試試古毛。

七翻翩、更新迭代版本操作

在命令行輸入npm version patch命令改變版本號(hào)。然后再npm publish稻薇。
具體的版本號(hào)管理參考文章如何更新自己寫的npm包(模塊)嫂冻,假設(shè)已經(jīng)在npm中發(fā)布了一個(gè)1.0.0版本的包

八、下載安裝包使用時(shí)樣式丟失問題

通過查找資料發(fā)現(xiàn)有的說將.vue文件中的style標(biāo)簽中的scoped刪除掉就好了塞椎,可以試試桨仿,我也出現(xiàn)樣式丟失問題了,這么操作不好使案狠。

我默認(rèn)將css樣式寫在了.vue文件style標(biāo)簽里面服傍,然后樣式丟失,之后我又將樣式拿出來放在一個(gè).css文件里莺戒。然后在vue.config.js做了如下配置伴嗡。強(qiáng)制內(nèi)聯(lián)css。有人知道原因的話可以在評(píng)論區(qū)留言交流从铲。

module.exports = {
    css:{
        extract:false
    }
}

這樣再打包上傳之后就有樣式了瘪校,具體原因不詳,官網(wǎng)有一段說明名段,沒咋理解阱扬。


css強(qiáng)制內(nèi)聯(lián)

The End
我寫的插件源碼:https://github.com/Mstian/vue-plugin

2020-04-30 23:42


最近在負(fù)責(zé)平臺(tái)公共組件的管理,將某些包抽象發(fā)布到npm伸辟,因?yàn)樾枰粩喔侣榛蹋詫?duì)版本號(hào)要經(jīng)常修改,特此記錄版本號(hào)有關(guān)內(nèi)容信夫。

語義版本號(hào)分為X.Y.Z三位窃蹋,分別代表主版本號(hào)、次版本號(hào)和補(bǔ)丁版本號(hào)静稻。當(dāng)代碼變更時(shí)警没,版本號(hào)按以下原則更新

  1. 如果只是修復(fù)bug,需要更新Z位振湾。
  2. 如果是新增了功能杀迹,但是向下兼容,需要更新Y位押搪。
  3. 如果有大變動(dòng)树酪,向下不兼容浅碾,需要更新X位。

參考:https://www.cnblogs.com/xd502djj/p/7985633.html

2020-11-18 15:28


感嘆時(shí)間過得真快呀续语,上次寫三月份總結(jié)的時(shí)候給自己定了幾個(gè)目標(biāo)垂谢,現(xiàn)在看一下,沒完成多少疮茄,哎真是哈哈(苦笑)埂陆。

四月份主要做了一些事情
1.上線博客第一版
2.學(xué)習(xí)鞏固js原生一些知識(shí)(比如閉包,原型娃豹,繼承,手寫bind等)
3.對(duì)vue更深入的學(xué)習(xí)了一些购裙。(本來大言不慚的說四月份學(xué)vue全家桶以及源碼呢)
4.一共在簡書發(fā)布十篇文章懂版,當(dāng)然都只是簡單的學(xué)習(xí)記錄,想要寫好文章得自己先有知識(shí)儲(chǔ)備躏率,還得花時(shí)間醞釀躯畴。

五月份計(jì)劃(不一定五月干,能想到還有一些需要做的事情)

1.深入學(xué)習(xí)vue全家桶(哈哈哈)
2.學(xué)習(xí)小程序薇芝。(將域名升級(jí)為https)
3.學(xué)習(xí)react蓬抄。
4.做一個(gè)自己的小程序(功能簡單,主要體驗(yàn)小程序流程)
5.使用react技術(shù)棧做一個(gè)移動(dòng)web版博客夯到,并解析一個(gè)m.的子域名并上線嚷缭。
6.學(xué)習(xí)一些云開發(fā)知識(shí)。
7.補(bǔ)充一些博客有趣的功能耍贾。(加一些必要的接口)
8.博客后臺(tái)管理系統(tǒng)阅爽。

五一假期到了,想到再補(bǔ)充吧荐开,好好休息付翁,好好學(xué)習(xí)。

2020-05-01 00:01


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晃听,一起剝皮案震驚了整個(gè)濱河市百侧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌能扒,老刑警劉巖佣渴,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赫粥,居然都是意外死亡观话,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門越平,熙熙樓的掌柜王于貴愁眉苦臉地迎上來频蛔,“玉大人灵迫,你說我怎么就攤上這事』尴” “怎么了瀑粥?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長三圆。 經(jīng)常有香客問我狞换,道長,這世上最難降的妖魔是什么舟肉? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任修噪,我火速辦了婚禮,結(jié)果婚禮上路媚,老公的妹妹穿的比我還像新娘黄琼。我一直安慰自己,他們只是感情好整慎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布脏款。 她就那樣靜靜地躺著,像睡著了一般裤园。 火紅的嫁衣襯著肌膚如雪撤师。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天拧揽,我揣著相機(jī)與錄音剃盾,去河邊找鬼。 笑死强法,一個(gè)胖子當(dāng)著我的面吹牛万俗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饮怯,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼闰歪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蓖墅?” 一聲冷哼從身側(cè)響起库倘,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论矾,沒想到半個(gè)月后教翩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贪壳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年饱亿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彪笼,死狀恐怖钻注,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配猫,我是刑警寧澤幅恋,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站泵肄,受9級(jí)特大地震影響捆交,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腐巢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一品追、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冯丙,春花似錦诵盼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洁墙。三九已至蛹疯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間热监,已是汗流浹背捺弦。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孝扛,地道東北人列吼。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像苦始,于是被迫代替她去往敵國和親寞钥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容