vue插件发布到npm(消息弹窗插件)

51cto/2023/10/1 2:41:45

vue插件发布到npm(消息弹窗插件)

一、Demo描述

本次演示的是一个使用 vue 发布自己的插件——custom-message-song这是一个简单消息弹窗插件(为下一个重量级插件“自定义表单”插件发布做练习准备),这次就来小试牛刀,从插件的开发到发布npm,我都踩了哪些坑[流泪],让我们现在开始吧。

开发环境版本:

  • @vue/cli 4.5.14
  • Vue2.x (Vue3.x的发布后期更新)

所有代码都可以在我的GitHub custom-message-song 上查看,欢迎start…

话不多说,直接看效果:
请添加图片描述

二、插件使用

1、安装

npm i custom-message-song

2、使用

main.js中:

// main.js
import Vue from 'vue'
import App from './App.vue'
// 引入差劲、样式
import customMessageSong from 'custom-message-song'
import 'custom-message-song/lib/custom-message-song.css'
// 使用插件
Vue.use(customMessageSong)
Vue.config.productionTip = false
new Vue({render: h => h(App),
}).$mount('#app')

参数:

参数名说明类型可选值默认值
type弹窗类型Stringsuccess/warn/errorsuccess
message弹窗内容String
duration弹出时间Number2000

例子:

// 例子
this.$message({type: "success",message: "操作成功",duration: 2000,
});

三、插件开发

1、创建项目

vue create custom-message-song

2、修改项目目录

  • src 目录修改问 example ,用来做项目演示DEMO;
  • 新增 plugins 目录,用来存放插件源码;
  • 新增 vue.config.js 文件,新增代码如下:
// vue.config.js
const path = require('path')
module.exports = {// 修改 pages 入口pages: {index: {entry: 'examples/main.js', // 入口,因为我们刚刚修改了src文件,它是原本的入口,因此这里要修改为exampletemplate: 'public/index.html', // 模板filename: 'index.html' // 输出文件}},// 扩展 webpack 配置chainWebpack: config => {// @ 默认指向 src 目录// 新增一个 ~ 指向 pluginsconfig.resolve.alias.set('~', path.resolve('plugins'))// 把 plugins 加入编译,因为新增的文件默认是不被 webpack 处理的config.module.rule('js').include.add(/plugins/).end().use('babel').loader('babel-loader').tap(options => {// 修改它的选项...return options})}
}

请添加图片描述

3、插件源码开发

  • plugins中新建index.js (在这里提供插件的install方法)文件 和 messageMain.vue 文件(插件文件的具体开发就不多说啦,相信大家都有这个实力)
  • 我在install 方法中,仅使用了添加Vue实例的方法,通过把他们添加到 Vue.prototype 上,我们还可以添加:
    • 添加全局的方法、自定义组件Vue.component 或者property
    • 添加全局资源:自定义指令、过滤器、过渡等;
    • 通过全局混入来添加一些组件选项;
    • 以上方法混合使用,效果更佳!

index.js

import Vue from "vue"; // 引入Vue
import MessageMain from "./messageMain.vue"; // 引入上边定义好的message模板function initMsg(props) {let duration = props.duration ? props.duration : 2000;const vm = new Vue({// h => createElement   返回虚拟DOMrender: (h) => h(MessageMain, { props }),}).$mount();// 挂载到body上document.body.appendChild(vm.$el);const node = vm.$children[0];// 显示弹窗node.visible = true;// 定时器关闭弹窗setTimeout(() => {node.visible = false;setTimeout(() => {document.body.removeChild(vm.$el);vm.$destroy();}, 400);}, duration);return node;
}export default {install(Vue) {Vue.prototype.$message = initMsg;},
};

messageMain.vue

<template><div class="custom-message"><transition name="taataa"><!-- 使用fade淡入淡出动画,使用type变量来控制class类名,达到更改type值就可以修改样式的效果 --><div :class="['plugins-message-box', type]" v-if="visible"><!-- 使用iconClass来控制icon的类名,我使用的是阿里的字体图标库iconfont,可以根据个人爱好来更换 --><div :class="['message-icon', 'iconfont', iconClass]"></div><!-- 输出消息 --><div class="message-container">{{ message }}</div></div></transition></div>
</template><script>
// 定义每一个type对应的class类名
const typeClass = {success: "icon-success",error: "icon-error",warn: "icon-warn",
};
export default {name: "messageMain",// 定义的是默认数据,默认值data() {return {visible: false, // 控制DOM显示隐藏};},props: {type: {type: String,default: "success",},icon: {type: String,default: "",},message: {type: String,default: "",},duration: {type: Number,default: 2000,},},computed: {// 如果外部传入icon则使用外部的icon,如果没有。则使用type值对应的iconiconClass() {if (this.icon) {return this.icon;} else {return typeClass[this.type];}},},
};
</script>
<style scoped>// 样式省略...
</style>

到这里插件就开发完啦,开发完后,我需要在本项目(example)中对其进行测试,本地能正常运行后,再发布都npm中。

四、插件打包

1、配置packjson

修改packjson.js 如下:

{"name": "custom-message-song","version": "0.1.13",			"private": false,"main": "./lib/custom-message-song.umd.min.js","license": "MIT","author": "linzisong","scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","lib": "vue-cli-service build --target lib --name custom-message-song --dest lib plugins/index.js","lint": "vue-cli-service lint"},"repository": {"type": "git","url": "https://github.com/Linzsong/custom-message-song"},.........
}

配置说明:

字段描述
name项目名称
version版本
private是否私有化,这里要设置成false,否则无法发布
license开源协议
author作者署名
main访问的插件的入口文件(打包后)
libnpm 的一种打包方式
repositorygit仓库信息

2、打包

npm run lib

打包后,目录如下:

请添加图片描述

五、发布npm

1、注册

npm 官网 :https://www.npmjs.com/

2、登录

npm login
Username: 账号
Password: 密码
Email: (this IS public): 邮箱
Enter one-time password from your authenticator app: 邮箱验证

3、发布

npm publish

当你收到了npm给你发来贺电时,说明你已经发布成功啦!

最后,记得 install 一下自己发布的插件,检查一下是否有问题,至此,我们就成功发布了自己的插件。

六、注意事项

1、npm 路径源不正确

  • npm登录时,需要切换镜像,我们经常会把npm的镜像切换成淘宝镜像,需要切换回来,不然没办法登录;

2、插件名和版本号

  • 插件名成不能过于简单,也不能重复,否则会报错(package.json --> name);
  • 版本号每次发布的时候记得更新(package.json --> version);

3、插件发布后样式丢失

​ 这个问题困扰了我一段时间,在打包——>安装——>引用后,项目中可以使用,发现插件的js功能可以正常运行,而样式丢失,但在打包中的包中,是有样式文件的。我一遍又一遍的检查打包的问题,还是发现不了问题。原本我以为不需要引入样式,在.umd.js 文件中会帮我们引入,最后发现并没有。还是老老实实的引入样式。

import 'custom-message-song/lib/custom-message-song.css'

http://www.ngui.cc/51cto/show-117.html

相关文章

mote: voice commenting for Google Docs-谷歌文档实时共享语音协作工具

mote: voice commenting for Google Docs-谷歌文档实时共享语音协作工具-小白学堂

Redhat7.3安装wget及yum命令方法

1、Wget安装 Redhat7.3最小安装wget命令也需要自己安装一下&#xff0c;wget下载地址&#xff1a;http://mirrors.163.com/centos/7/os/x86_64/Packages/wget-1.14-18.el7_6.1.x86_64.rpm 下载到/usr/local/soft目录后&#xff0c;执行rpm -ivh wget-1.14-18.el7_6.1.x86_64.…

王垠 40行代码

文章摘录自&#xff1a; 王垠的40行代码,究竟diao在哪里-阿里云开发者社区 王垠是谁? 不用我说了吧!!! 别傻谈,亮码瞧! ;; A simple CPS transformer which does proper tail-call and does not;; duplicate contexts for if-expressions.;; author: Yin Wang (yw21cs.indi…

10分钟教你写出 坦克大战【无敌版】

导读 最近读到一位大佬的游戏文章之后&#xff0c;手痒难耐就想自己也写一个小游戏。苦于没有游戏素材在网上搜也都是付费的&#xff0c;我就随便写了一点点来给自己解解馋。&#x1f617; 好了废话不多说我们现在先试一下游戏效果。不好玩也不要说出来&#xff0c;嘻嘻嘻。后…

Nginx反向代理中使用proxy_redirect重定向url

在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改!!语法:proxy_redirect [ default|off|redirect replacement ];默认:proxy_…

FLINK-CDC之sql方式的应用(mysql篇)

1、mysql中创建表,注意,mysql要开启binlog,否则报错 CREATE TABLE `cdc_user` ( `id` BIGINT(11) NOT NULL, `name` VARCHAR(50) NULL DEFAULT NULL COLLATE utf8mb4_bin, `type` VARCHAR(50) NULL DEFAULT NULL COLLATE utf8mb4_bin, `desc` TEXT NULL DEF…

Golang:channel管道与goroutine协程

channel管道与goroutine协程 一.goroutine协程 一.概述 Go协程的特点 有独立的栈空间共享程序堆空间调度是由程序员(用户)控制协程是轻量级的线程 在go语言中&#xff0c;有一种模式叫做MPG,M表示内核线程&#xff0c;也可以称为一个工作线程,P代表执行一个go代码片段的基础…

17seqnet

摘要 人员搜索旨在共同解决人员检测和人员再识别(re-ID)问题。现有的工作已经设计了基于Faster R-CNN的端到端网络。但是&#xff0c;由于Faster R-CNN的并行结构&#xff0c;所提取的特征来自于区域提议网络产生的低质量提议&#xff0c;而不是检测到的高质量包围盒。人员搜索…

分治算法.

1. 分治算法介绍 分治法是一种很重要的算法。字面上的解释是“分而治之”&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。这个技…

使用iconfont阿里多色矢量图标

一、问题与解决方法 问题&#xff1a;虽然unicode和font-class很好&#xff0c;但你会发现都不支持多色模式。 解决&#xff1a;引用方法名symbol来解决。 通过mini-program-iconfont-cli 把iconfont图标批量换成多个平台小程序的组件。不依赖字体&#xff0c;支持多色彩。 特…