vue插件开发以及发布到npm流程——消息提示插件

2023-11-17

最近有兴趣学习了一下vue插件开发,以及发布到npm上,项目里可以直接使用自己开发的插件,以下文章以开发一个消息提示的组件为例,记录一下开发的流程。


一、vue项目创建配置

创建vue项目的指令不多说,直接以下指令,这里我选择的vue2进行开发

vue create [项目名称]

创建好项目之后,把文件结构整理一下

-- my-toast-plugin 
	-- public
	-- node_moudules
	-- src 
		-- assets
		-- components 
			-- tip-message
				-- index.js
				-- index.vue
		-- icon
		-- index.js
		-- index.vue

vue项目创建之后默认的入口文件是main.js,这里个人习惯改成index.js,这样的话需要在vue.config.js文件里面配置一下webpack的入口,配置如下;配置好了之后在index.js里引入src/index.vue作为初始化实例。

my-toast-plugin/vue.config.js
module.exports = defineConfig({
  chainWebpack: (config) => {
    config.entryPoints.clear(); //清空默认入口配置
    config.entry("main").add("./src/index.js"); //增加一个main入口,指向文件index.js
   }
});
/src/index.js
import Vue from "vue";
import App from "./index.vue";
new Vue({
  render: (h) => h(App),
}).$mount("#app");
二、组件设计

组件大概的设计的时候暂定四种类型的消息提示——success、error、warning、info,以及一个config方法,支持自定义配置,如下图所示,配色自己看着顺眼就好了。先来看看成品。
在这里插入图片描述

整个组件的显示就包含了三个元素,一个带边框的容器,一个icon图标还有一行消息提示文本,具体的样式开发不展开说,说一下怎么引入需要的icon。

三、icon引入

icon引入使用iconfont,这是阿里的矢量图标库,官网地址:阿里矢量图标库

在图标库里搜索找到自己需要的图标,鼠标悬浮可以看到有个购物车图标,把所需的图标全部添加到购物车中,点开购物车->点击添加到项目->新建项目,然后进入项目,选择font-class,点击下载到本地。
打开购物车且添加到项目
下载代码到本地
把解压得到的文件夹放入项目,这里我把文件夹下的所有文件都放入了src/icon文件夹,并且把iconfont.css文件复制了一份,后缀改为.scss,这里是为了统一全局样式都使用sass开发,最后在项目入口文件src/index.js引入样式,也可以在组件文件tip-message/index.vue引入。
解压的文件夹下所有文件

import "../../icon/iconfont.scss";
//使用icon,这里的icon名称看自己iconfont上的项目,可自定义,例如icon-success
<i class="iconfont [icon名称]"/>
四、toast组件开发

第一步骤中的配置可以依照个人习惯配置,组件开发主要在component文件夹下进行开发,新建一个名为tip-message的文件夹,文件夹下包含两个文件,index.vue和index.js,index.vue用于组件模板、逻辑、样式开发,index.js文件用于暴露install方法,在install方法里添加实例方法,直接先看index.vue里代码

tip-message/index.vue
//模板和js代码
<template>
  <div class="toast">
    <div
      v-if="visible"
      :class="`toast-box toast-box-${options.type}`"
      :style="`animationDuration: ${this.options.duration}s`"
    >
      <i :class="`iconfont icon-${options.type} tip-icon ${options.type}`"></i>
      <span :class="`text-area ${options.type}`">{{ options.message }}</span>
    </div>
  </div>
</template>

<script>
import "../../icon/iconfont.scss";
export default {
  name: "App",
  data() {
    return {
      visible: false,
      defaultOptions: {
        type: "info",
        message: "",
        duration: 3,
      },//默认配置项,在调用实例内的方法时候,默认使用该配置项内的选项,若有需要自定义的直接重写属性覆盖即可
      options: {
        type: "",
        message: "",
        duration: 3,
      },//显示配置项
    };
  },
  methods: {},
};
</script>

代码定义了一个options属性,该属性是支持插件用户配置的属性,由于只是一个demo,暂定只有三个可配置项,在使用插件的时候传入options.message或options对象,如:

this.$tMessage.info("这是一条测试的提示")
or 
this.$tMessage.config({ message:"这是一条自定义配置的提示", duration: 1 })

options对象包含三个属性,如下表,不传则取默认值。

属性 描述 默认值
type 消息提示的类型,传入info、success、error或warning info
message 消息提示的内容 -
duration 消息提示显示的持续时长 3s

接下来看index.js文件,该文件引入模板,并且暴露install方法,具体的install方法的使用可以参考vue官网:插件开发
其中也用到extend来构造子类,挂载到模板上,使用参考extend方法

tip-message/index.js
import tipMessage from "./index.vue";//引入组件文件
//install方法支持两个参数(Vue,options),其中Vue是构造器,options是可选的参数
tipMessage.install = (Vue) => {
  const tipMessageConstructor = Vue.extend(tipMessage);//extend是构造子类的方法
  let $vm = new tipMessageConstructor();//创建实例
  let $el = $vm.$mount().$el;//实例渲染完成后,获取元素
  document.querySelector("body").appendChild($el);//dom元素挂载到body元素的子元素
  //实例的显示隐藏方法,通过定时器控制duration*1000ms后隐藏
  $vm.visibleFn = () => {
    $vm.visible = true;
    setTimeout(() => {
      $vm.visible = false;
    }, $vm.options.duration * 1000);
  };
  //遍历创建五种类型的实例提示方法,给实例的显示配置属性赋值
  ["config", "warning", "success", "error", "info"].forEach((_option) => {
    if (_option === "config") {
      $vm[_option] = (options) => {
        $vm.options = { ...$vm.defaultOptions, ...options };
        $vm.visibleFn();
      };
    } else {
      $vm[_option] = (options) => {
        $vm.options.type = _option;
        $vm.options.message = options;
        $vm.options.duration = $vm.defaultOptions.duration;
        $vm.visibleFn();
      };
    }
  });
  Vue.prototype.$tMessage = $vm;//实例注册到原型
};
export default tipMessage;

到此为止,组件的开发已经完成。

五、发布到NPM

回到第一步骤中我们配置了webpack入口文件是src/index.js文件,因此我们在发布到npm上之前先在src/index.js里引入组件并且暴露,以及package.json文件里配置我们的插件名称以及版本。
src/index.js

import tMessage from "./components/tip-message/index.js";
export { tMessage };

package.json

{
  "name": "tip-message-plugin",
  "version": "0.1.2",
  "private": false,
}

然后可以直接发布到npm上

//登录npm
npm login 
//切换镜像
npm config set registry https://registry.npmjs.org/
//发布
npm publish

发布结束之后就可以在npm官网看到自己的插件啦~如果需要版本迭代的话需要在package.json里吧version改一下,同一版本会发布失败,整个流程大致就是这样

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue插件开发以及发布到npm流程——消息提示插件 的相关文章

随机推荐

  • vue 如何在一个页面上调用另一个页面的方法

    vue 如何在一个页面上调用另一个页面的方法 首先同一个vue实例来调用两个方法 所以可以建立一个中转站 建立 util js 中转站文件 任意位置 我是在 assets js util js import Vue from vue exp
  • MySQL基础知识每日总结(5)

    regexp检查总是返回0 没有匹配 或者1 匹配 一 CASE表达式 1 两种写法 简单case表达式 case sex when 1 then 男 when 2 then 女 else 其他 end 搜索case表达式 case whe
  • .sh 文件 注释

    usr bin env bash 不需要寻找程序在系统中的位置 只要程序在 PATH中 根据环境寻找并运行默认的版本 set e exit the script if an error happens MODEL TAR depparse
  • 华为校招机试 - 单词重量(Java)

    题目描述 每个句子由多个单词组成 句子中的每个单词的长度都可能不一样 我们假设每个单词的长度Ni为该单词的重量 你需要做的就是给出整个句子的平均重量V 输入描述 无 输出描述 无 用例 输入 Who Love Solo 输出 3 67 说明
  • 计算机组成原理期末考试题

    计算机组成原理期末考试试题及答案 一 选择题 1 完整的计算机系统应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B RO
  • 交换机端口安全

    文章目录 一 802 1X认证 1 定义和起源 2 认证方式 本地认证 远程集中认证 3 端口接入控制方式 基于端口认证 基于MAC地址认证 二 端口隔离技术 1 隔离组 2 隔离原理 3 应用场景 首先可以看下思维导图 以便更好的理解接下
  • MinIO文件服务器快速部署和案例演示

    MinIO文件服务器 文章目录 前言 服务器部署 依赖配置 SpringBoot配置 方法模板类 方法使用示例 易错点和注意点 MinIO的文件上传时文件类型设置的坑 前言 这个MinIO服务用起来比较简单 配置和使用都非常快 1 博客案例
  • css设置滚动条样式

    废话不多说 直接上代码 1 设置全局滚动条样式 webkit scrollbar 滚动条整体样式 width 4px 高宽分别对应横竖滚动条的尺寸 height 1px webkit scrollbar thumb 滚动条里面小方块 bor
  • 传智书城项目修改(修改图片、文本),使用eclipse修改, 以及解决出现的乱码问题

    在开始本教程先 请确保已经导入项目并能在网页中显示 导入项目参考http t csdn cn Bl0JX 一 修改首页顶部 首页效果如下 在项目文件中找到head jsp文件 在右侧的布局文件代码中修改首页的文字和首页logo 修改logo
  • weston设置

    weston设置 屏幕旋转180度方法 修改标题栏位置 启动配置文件 屏幕旋转180度方法 编辑 etc xdg weston weston ini文件 增加如下语句 output name DSI 1 transform 180 其中na
  • buuctf-Web1

    在登陆界面用sql注入的各种手段都没用 注册进去看看 抓包后发现数据包有点像xss 也能使它弹窗 但是好像没什么用 用标题1 会有关于sql语句的弹窗 但是如果抓包就不会出现 也能说明是单引号闭合 1 就不行 能知道是sql注入也不容易 闭
  • 用Python制作一个随机抽奖小工具

    大家好 我是才哥 最近在工作中面向社群玩家组织了一场活动 需要进行随机抽奖 参考之前小明大佬的案例 再结合自己的需求 做了一个简单的随机抽奖小工具 今天我就来顺便介绍一下这个小工具的制作过程吧 先看效果 1 核心功能设计 针对随机抽奖的小工
  • 自动控制原理知识点梳理——1. 自动控制的一般概念 & 2. 控制系统的数学模型

    目录 1 自动控制的一般概念 1 1知识梳理 逻辑图 2 控制系统的数学模型 2 1知识梳理 逻辑图 2 2补充内容 2 2 1传递函数的零点和极点 2 2 2典型环节及其传递函数 2 2 3相同的特征多项式和开环传递函数定义 2 2 4由
  • minecraft正版多人服务器,我的世界:“服务器的潜规则”,有的保护玩家,也有的打破平衡...

    多人联机 陪伴多数玩家的青春 点点滴滴 都是付出的时间与精力 如今 MC的 服务器 玩法愈来愈丰富 规则越来越多 那么 服务器内究竟有何潜规则呢 服务器控制台权限 gt OP权限 多数玩家都有这样的认为 OP权限在服务器中处在顶尖地位 那到
  • 税务大比武网络攻防复习(完整版)

    目录 信息化建设与管理 计算机终端设备 通信与网络 数据管理与应用 软件开发 计算与存储 基础设施保障 网络安全 网络安全基础 网络安全管理 密码学 软件开发安全 主机 数据库 中间件安全 网络与通信安全 网络攻击 信息收集 口令攻击和软件
  • uniapp小程序练手项目并上线

    如题 做一个自己的小程序 并在各大小程序开发者平台上线 背景 因没有小程序开发经验 且前端知识掌握得不好 作为一个小程序爱好者 总想有一款自己的小程序 同时也想有一款自己的app 虽然目前还没有实现 在整体难度上来说 小程序的实现比app的
  • 对数器的使用----bug测试,文章中含有测试源码

    当我们选择排序没有出现问题时 我们可以发现一个随机数组是有序的 会打印出 选择排序没有毛病 说明此时选择排序没有毛病 package cn Text public class LogarithmicDetector TODO 选择排序 pu
  • 2023省赛 飞机降落(dfs)

    看数据量 fact 10 3628800 直接暴力dfs include
  • firefly 搭建

    基本内容在http blog csdn net wangqiuyun article details 11150503里都有 在此仅记录搭建工程中遇到的问题及实际项目添加的工具 mysql安装 最好用5 6 服务启动不成功 基本是配置的问题
  • vue插件开发以及发布到npm流程——消息提示插件

    最近有兴趣学习了一下vue插件开发 以及发布到npm上 项目里可以直接使用自己开发的插件 以下文章以开发一个消息提示的组件为例 记录一下开发的流程 一 vue项目创建配置 创建vue项目的指令不多说 直接以下指令 这里我选择的vue2进行开