Vue3 封装组件库并发布到npm仓库

一、创建 Vue3 + TS + Vite 项目

输入项目名称,并依次选择需要安装的依赖项

npm create vue@latest

项目目录结构截图如下:

二、编写组件代码、配置项和本地打包测试组件

在项目根目录新建 package 文件夹用于存放组件 (以customVideo为例,其他类似)

在项目根目录中的 vite.config.ts 中写入相关配置项:

import { defineConfig } from 'vite'
import path, { join } from 'path';
import setupPlugins from "./vite/plugins";
import dts from "vite-plugin-dts"export default defineConfig(({ command, mode }) => {const isBuild = command == 'build'return {publicPath:"/",plugins: [...setupPlugins(isBuild),//生成ts声明文件dts({include:"./package"})],//设置别名resolve: {alias: {"@/package": join(__dirname, './package/')},extensions: [".vue",'.js', '.json', '.ts', '.tsx'],//使用别名省略的后缀名},build: {outDir: "lib", //输出文件名称lib: {entry: join(__dirname, './package/index.ts'), //指定组件编译入口文件name: 'vue3VideoH',fileName: (format) => `index.${format}.js` // 打包后的文件名}, //库编译模式配置rollupOptions: {// 确保外部化处理那些你不想打包进库的依赖external: ["vue"],output: {// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量globals: {vue: "Vue",},},}, // rollup打包配置}}})

组件封装好之后需要在 customVideo/index.ts 中导出组件

import "./assets/font/iconfont.css"
import "./assets/css/base.less"
import customVideo from "./src/customVideo.vue"export default customVideo

然后还需要在 packages/index.ts 文件中对整个组件库进行导出

import CustomVideo from "./customVideo"
import {App} from "vue";
let comps = [CustomVideo]
const install = (Vue:App) =>{comps.map((component:any)=>{Vue.component(component.__name as string, component);})
}
//使用import.meta.globEager遍历获取文件,会丢失icon图标和style样式
//获取文件
// const components:any = import.meta.globEager('./**/*.vue');
// const install = (Vue:any) =>{
//     for(let i in components) {
//         let component = components[i].default;
//         //注册组件
//         Vue.component(component.__name, component);
//     }
// }let windowObj = window as any
/* 支持使用标签的方式引入 */
if (typeof windowObj !== 'undefined' && windowObj.Vue) {const vm = windowObj.Vue.createApp({})install(vm)
}export default install

在编写组件代码和配置项之后进行本地打包测试组件,在 src/main.ts 中导入刚创建的组件,检测是否正常可用

打包命令 npm run build

import { createApp } from 'vue';
import App from './App.vue';
import './style.css'
import customVideo from "@/package/index";const app = createApp(App);
app.use(customVideo); //全局注册
app.mount('#app');

三、 编写package.json、.npmignore 和 README.md 文件

编写package.json 配置文件

{"name": "vue3-video-h","version": "0.0.3","description": "vue3自定义视频播放器","main": "lib/index.umd.js","module": "lib/index.es.js","style": "lib/style.css","types": "lib/index.d.ts","files": ["lib"],"scripts": {"dev": "vite","build": "vue-tsc --noEmit && vite build","preview": "vite preview"},"dependencies": {"less": "^4.1.3","less-loader": "^11.1.3","loader": "^2.1.1","path": "^0.12.7","vite-plugin-compression": "^0.5.1","vite-plugin-dts": "1.4.1","vue": "^3.2.47","vue3-video-h": "^0.0.2"},"devDependencies": {"@types/node": "^20.3.3","@vitejs/plugin-vue": "^4.1.0","typescript": "^5.0.2","vite": "^4.3.9","vue-tsc": "^1.4.2"},"directories": {"lib": "lib"},"keywords": ["vue-video","vue3-video-h","vue3","vue3-video"],"author": "Huang","license": "MIT","homepage": "","repository": "https://gitee.com/Huangxianlong11/vue-plugin/tree/master/customVideo"
}

name : 包名,该名字是唯一的。可在 npm 官网搜索名字,不可重复。

version: 版本号,每次发布至 npm 需要修改版本号,不能和历史版本号相同。

description: 关于包的描述。

main: 入口文件,需指向最终编译后的包文件。

keywords:关键字,以空格分离希望用户最终搜索的词。

author:作者

license: 开源协议

在项目根目录创建 .npmignore 文件,设置忽略发布的文件,类似 .gitignore 文件

# 忽略目录
.idea
.vscode
scripts/
packages/
public/
node_modules/
src/
types/
vite/
yarn.lock# 忽略指定文件
vite.config.ts
tsconfig.json
.gitignore
*.map

编写 README.md 文件

# vue3-video-h> A HTML5 video player component for Vue3## Installation
```bashnpm i vue3-video-h --save```## Usagemain.ts
```
// script
import { createApp } from 'vue';
import App from './App.vue';
import customVideo from "vue3-video-h"
import "vue3-video-h/lib/style.css";//引入样式const app = createApp(App);
app.use(customVideo); //全局注册
app.mount('#app');
```App.vue```
<template><div class="app-container"><customVideo :config="config" /></div>
</template><script setup lang="ts">
import {ref} from "vue";let config = ref({src:"", //视频poster: "", // 初始化占位图片volume: 20,//声音themeColor:"#19accc",//主体颜色activeColor:"red",//选中颜色width:"500px",//宽度height:"300px",//高度
})
</script>
```

四、发布组件到 npm

登录 npm

如果没有 npm 账号,可以去 npm官网 注册一个账号,注册成功后在本地查看 npm 镜像

npm config get registry

输出:http://registry.npmjs.org 即可,如果不是则需要设置为npm镜像

npm config set registry https://registry.npmjs.org

切换为npm镜像之后进行登录

npm login

依次输入用户名,密码,邮箱,输出Logged in as…即可

发布组件到 npm

npm publish

发布成功后即可在npm官网搜索到该组件,如下图

并可以通过 npm install vue3-video-h(或 yarn add vue3-video-h )进行安装

五、npm组件使用

在要使用的项目中安装并注册插件:

yarn add vue3-video-h
# or
npm install vue3-video-h

然后在 main.ts 文件中引入并注册:

import { createApp } from 'vue';
import App from './App.vue';
import customVideo from "vue3-video-h"
import "vue3-video-h/lib/style.css";//引入样式const app = createApp(App);
app.use(customVideo); //全局注册
app.mount('#app');

在要使用组件的页面直接使用即可:

<template></template><div class="app-container"><customVideo :config="config" /></div>
</template><script setup lang="ts">
import {ref} from "vue";let config = ref({src:"", //视频poster: "", // 初始化占位图片volume: 20,//声音themeColor:"#19accc",//主体颜色activeColor:"red",//选中颜色width:"500px",//宽度height:"300px",//高度
})
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Python实现顺序栈

1 问题 在常用的数据结构中&#xff0c;有一批结构被称为容器——栈与队列。那该怎么利用Python学习栈这种结构的特性并用Python实现其相关操作呢&#xff1f; 2 方法 栈相对于是一个容器&#xff0c;而这个容器里包含的是一些元素。同时&#xff0c;栈是保证元素后进先出关系的…

系列十六、Spring IOC容器的扩展点

一、概述 Spring IOC容器的扩展点是指在IOC加载的过程中&#xff0c;如何对即将要创建的bean进行扩展。 二、扩展点 2.1、BeanDefinitionRegistryPostProcessor 2.1.1、概述 BeanDefinitionRegistryPostProcessor是bean定义的后置处理器&#xff0c;在BeanDefinition加载后&a…

C++知识点总结(7):玩转高精度除法

一、复习高低精度 一个数分为两种类型&#xff1a; 1. 高精度数&#xff0c;即一个长度特别长的数&#xff0c;使用 long long 也无法存储的一类数字。 2. 低精度数&#xff0c;即一个普通的数&#xff0c;可以使用 long long 来存储。 由于高精度除法比较简单&#xff0c;…

卸载11.3的cuda,安装11.8的cuda及cudnn

linux查看cudnn版本_linux查看cudnn版本命令_在学习的王哈哈的博客-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞6次&#xff0c;收藏6次。英伟达官方文档查看cuda版本cat /usr/local/cuda/version.txt或者nvcc --version 或者 nvcc -V查看cudnn版本网上都是这个但是不行cat /u…

【超强笔记软件】Obsidian实现免费无限流量无套路云同步

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f; 目录 一、简介 软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步 1 安装并设置Synology Drive套件 2 局域网内同步文件测试 三、内网穿透群…

Stable-Diffusion——Windows部署教程

Windows 参考文章&#xff1a;从零开始&#xff0c;手把手教你本地部署Stable Diffusion Webui AI绘画(非最新版) 一键脚本安装 默认环境安装在项目路径的venv下 conda create -n df_env python3.10安装pytorch&#xff1a;&#xff08;正常用国内网就行&#xff09; python -…

【Python篇】详细讲解正则表达式

文章目录 &#x1f339;什么是正则表达式&#x1f354;语法字符类别重复次数组合模式 ✨例子 &#x1f339;什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为正则或正则表达式&#xff0c;是一种用于匹配、查找和操作文本字符串的工…

Linux:docker基础操作(3)

docker的介绍 Linux&#xff1a;Docker的介绍&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/134146721?spm1001.2014.3001.5502 通过yum安装docker Linux&#xff1a;Docker-yum安装&#xff08;2&#xff09;-CSDN博客https://blog.…

华为OD机试2023年最新题库(Python、JAVA、C++、JS)

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2023年11月份开始&#xff0c;考的都是OD统一考试&#xff08;C卷&#xff09;&#xff0c;题库已经整…

mysql使用--存储程序

1.概述 存储程序可以封装一些语句&#xff0c;为用户提供一种简单的方式来调用这个存储程序&#xff0c;从而间接执行其封装的语句。 根据调用方式的不同&#xff0c;可把存储程序分为存储例程、触发器、事件几种类型。其中&#xff0c;存储例程又可被细分为存储函数和存储过程…

openssl+ ECC + linux 签名校验开发实例(C++)

文章目录 ECC签名过程&#xff08;ECDSA签名&#xff09;ECC验证过程&#xff08;ECDSA验证&#xff09;C示例代码 ECC&#xff08;Elliptic Curve Cryptography&#xff09;是一种基于椭圆曲线数学结构的密码学技术。在ECC中&#xff0c;签名和验证过程使用的是数字签名算法&a…

力扣.NO88 合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…

2 时间序列预测入门:GRU

0 论文地址 GRU 原论文&#xff1a;https://arxiv.org/pdf/1406.1078v3.pdf GRU&#xff08;Gate Recurrent Unit&#xff09;是循环神经网络&#xff08;RNN&#xff09;的一种&#xff0c;可以解决RNN中不能长期记忆和反向传播中的梯度等问题&#xff0c;与LSTM的作用类似&a…

C语言第三十弹---打印一个整数的每一位数

C语言实现打印整数的每一位数 逆序打印整数 思路&#xff1a;通过n%10可以获得整数的个位&#xff0c;获得个位后&#xff0c;整数/10就看去掉个位&#xff0c;得到新的一个数。循环即可获得所有数。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>void print(i…

设计模式-开篇

什么是设计模式 设计模式是一种被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式不是可直接转化为代码的完成解决方案&#xff0c;而是描述了如何解决一个问题的经过&#xf…

图论——二部图及其算法

什么是二部图 二部图的判定 例子1 任选一个节点染成红色 红色的邻居染成蓝色 蓝色邻居染成红色 例子2 这个不是二部图 无权二部图的最大匹配

Jacobi迭代与SOR迭代求解希尔伯特矩阵

给出线性方程组 Hn*x b&#xff0c;其中系数矩阵Hn为希尔伯特矩阵&#xff1a; 假设 x ∗ (1, 1, . . . , 1)T&#xff0c;b Hnx ∗。若取 n 6,8, 10&#xff0c;分别用 Jacobi 迭代法及 SOR迭代&#xff08;ω 1, 1:25,1:5&#xff09;求解&#xff0c;比较计算结果。…

leetcode做题笔记1457. 二叉树中的伪回文路径

给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例 1&#xff1a; 输…

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Error PostCSS plugin autoprefixer requires PostCSS 8

文章目录 一、情况一二、情况二三、总结 在启动 vue项目时&#xff0c;突然控制台报错&#xff1a; Error: PostCSS plugin autoprefixer requires PostCSS 8。然后依次出现下面几种情况&#xff0c;依次解决完&#xff0c;项目就可以正常启动了 一、情况一 error in ./src/…