vue-cli3自定义插件并发布到npm

主要是记录体验使用Vue CLI3自定义插件并发布到npm,然后在项目里下载使用的一个过程。

大纲

  1. 写一个简单的插件(写插件注意事项)
  2. 打包库的相关配置
  3. 注册npm,登录npm
  4. 发布流程
  5. 删除已上传包(短时间内上传的包)
  6. 删除已上传较长时间的包
npm unpublish --force //强制删除,这个是撤销24小时发布的包,有些包发布久了,这个方法不会再管用了。
npx force-unpublish package-name '原因描述' //是删除已经发布好的包
  1. 版本更新发布时操作。
  2. 发布成功下载使用时样式丢失问题。

一、写一个简单的插件

官方文档是这么说的:
Vue.js的插件应该暴露一个install方法。这个方法的第一个参数是Vue构造器,第二个参数是一个可选的选项对象。

MyPlugin.install = function(Vue){
  //1. 添加全局方法
  Vue.myGlobalMethod = function(){
    //逻辑...
  }
  //2. 添加全局资源
  Vue.directive('my-directive',{
    bind(el,binding,vnode,oldVnode){
      //逻辑...
    }
  })
  //3. 注入组件选项
  Vue.mixin({
    created:function(){
      //逻辑...
    }
  })
  //4. 添加实例方法
  Vue.prototype.$myMethod = function(){
    //逻辑
  }
}

然后就在上面几种创建插件的方法中根据需求写一个插件。
需求:写一个提示框当点击按钮时给一个提示状态,之后会自动隐藏。
预览:


toast插件

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

项目结构图

将脚手架自动生成的多余代码去掉,在src中新建lib文件夹,

然后在lib文件夹下创建 .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;
}

此时可以在本地测试一下。
main.js中引入并使用

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

App.vue中测试使用

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

点击按钮测试使用 em...没问题。

二、打包组件

vue 打包组件相关配置文档:构建目标-库
在package.json中做相关配置

主要配置有四个参数:

  1. target:默认为构建应用,改为lib即可启用构建库模式
  2. name:输出文件名
  3. dist:输出目录,默认为dist,可以修改我们改为lib
  4. entry:入口文件路径,默认为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"
  }
}

接着运行npm run lib命令打包组件

打包后的文件结构图


打包后文件结构图

打包后控制台输出


控制台输出

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

name:包名,该名不能和npm上已有包重名,如何验证自己的包名是否会和npm上的包冲突?直接去npm上搜想定义的包名。
version:版本号,不能和历史版本号相同。
description:简介
main:入口文件
keyword:关键字,以空格分隔
author:作者
private:是否私有,需修改为false,否则发布失败
license:开源协议

package.json配置如下

{
  "name": "vue-mstian-toast", //给自己的包起一个响亮的名字 哈哈
  "version": "0.1.0", //版本号这块可以专门搜搜一些文章看看
  "description": "vue-mstian-toast test", //描述
  "main": "lib/leilei-toast.umd.min.js", //入口文件需要选择能支持模块化的文件具体可以查看打包后的文件后缀然后查阅相关资料
  "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" //构建库的命令
  },
}

三、注册 登录npm账号

如果已有npm账号可以忽略这一步
https://www.npmjs.com/
官网注册即可。
登录注册成功后点击右上角头像下拉菜单有个Packages选项,当然如果没有上传过npm包的时候当然是0 packages.

四、发布

如果修改过npm的镜像地址比如使用了淘宝镜像,就先改回来,npm config set registry http://registry.npmjs.org

  1. cmd打开项目所在目录,输入登录命令 npm login
  2. 根据提示信息输入用户名,密码,邮箱。(注意:输入密码的时候命令面板不提示也没有占位符,感觉好像没有输入东西一样,其实已经输入了,接着输入完整密码下一步即可)
  3. 登陆成功后会有提示
    Logged in as name on http://registry.npmjs.org,此时可以使用npm whoami查看当前操作用户
    npm登陆成功
  4. 一切准备就绪,准备发包,
    当确认项目已经编译成功(npm run lib成功)输入npm publish
  5. 不出意外这种操作是可以发布成功的。如果发布成功会在命令行显示+ 包名@版本号,然后注册的邮箱也会受到一条邮件。
  6. 发布成功之后就可以去npm官网查看自己发布的包,如果是第一次发包,那么Packages下会有一个包。
  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 //强制删除,npm会根据package.json的version删除该version的包版本。这个是撤销24小时发布的包,有些包发布久了,这个方法不会再管用了。

删除存在线上比较久的包

npx force-unpublish package-name '原因描述' //是删除已经发布好的包

使用此方法删除包之后,包还会存在Packages列表中,不过点击进去会有提示。


已删除的包

如果删除了包重新上传之前的包的时候可能会失败,这个时候改一下包名试试。

七、更新迭代版本操作

在命令行输入npm version patch命令改变版本号。然后再npm publish
具体的版本号管理参考文章如何更新自己写的npm包(模块),假设已经在npm中发布了一个1.0.0版本的包

八、下载安装包使用时样式丢失问题

通过查找资料发现有的说将.vue文件中的style标签中的scoped删除掉就好了,可以试试,我也出现样式丢失问题了,这么操作不好使。

我默认将css样式写在了.vue文件style标签里面,然后样式丢失,之后我又将样式拿出来放在一个.css文件里。然后在vue.config.js做了如下配置。强制内联css。有人知道原因的话可以在评论区留言交流。

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

这样再打包上传之后就有样式了,具体原因不详,官网有一段说明,没咋理解。


css强制内联

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

2020-04-30 23:42


最近在负责平台公共组件的管理,将某些包抽象发布到npm,因为需要不断更新,所以对版本号要经常修改,特此记录版本号有关内容。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新

  1. 如果只是修复bug,需要更新Z位。
  2. 如果是新增了功能,但是向下兼容,需要更新Y位。
  3. 如果有大变动,向下不兼容,需要更新X位。

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

2020-11-18 15:28


感叹时间过得真快呀,上次写三月份总结的时候给自己定了几个目标,现在看一下,没完成多少,哎真是哈哈(苦笑)。

四月份主要做了一些事情
1.上线博客第一版
2.学习巩固js原生一些知识(比如闭包,原型,继承,手写bind等)
3.对vue更深入的学习了一些。(本来大言不惭的说四月份学vue全家桶以及源码呢)
4.一共在简书发布十篇文章,当然都只是简单的学习记录,想要写好文章得自己先有知识储备,还得花时间酝酿。

五月份计划(不一定五月干,能想到还有一些需要做的事情)

1.深入学习vue全家桶(哈哈哈)
2.学习小程序。(将域名升级为https)
3.学习react。
4.做一个自己的小程序(功能简单,主要体验小程序流程)
5.使用react技术栈做一个移动web版博客,并解析一个m.的子域名并上线。
6.学习一些云开发知识。
7.补充一些博客有趣的功能。(加一些必要的接口)
8.博客后台管理系统。

五一假期到了,想到再补充吧,好好休息,好好学习。

2020-05-01 00:01


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容