1. 准备组件

1.1 创建一个 Vue 组件

假设我们要创建一个简单的按钮组件:

src/MyButton.vue

<template><button class="my-btn" @click="$emit('click')"><slot /></button>
</template><script setup lang="ts">// 可以在这里加 props
</script><style scoped>
.my-btn {padding: 8px 16px;background: #42b983;color: white;border-radius: 4px;cursor: pointer;
}
</style>

2. 项目结构和 package.json 配置

2.1 项目结构

my-button-component/
├─ src/
│  └─ MyButton.vue
├─ dist/              # 打包后的文件(发布到 npm 后包含的文件)
├─ package.json       # npm 包配置
├─ vite.config.ts     # Vite 配置(用来打包组件)
├─ .npmignore         # 发布时忽略不需要的文件
└─ README.md          # 组件说明

2.2 package.json 配置

你需要配置 package.json,确保别人能够正确安装和使用组件。最重要的是配置好 入口文件类型声明

{"name": "@your-username/my-button",  // 组件的 npm 包名(如果是私有发布需要用组织名)"version": "1.0.0","main": "dist/index.cjs.js",         // CommonJS 入口"module": "dist/index.esm.js",       // ES Module 入口"types": "dist/index.d.ts",          // 类型声明"scripts": {"build": "vite build"              // 构建命令},"peerDependencies": {"vue": "^3.0.0"                    // 依赖 Vue},"devDependencies": {"vite": "^3.0.0",                  // 构建工具"typescript": "^4.0.0",            // TypeScript 支持"@vitejs/plugin-vue": "^3.0.0"     // Vue 插件},"keywords": ["vue", "component", "button"],"author": "Your Name","license": "MIT"
}

2.3 .npmignore 文件

你需要确保不把 src/node_modules/ 和一些不必要的文件(例如测试文件、文档等)发布到 npm 上。你可以在 .npmignore 中指定这些文件。

.npmignore

src/            # 源代码文件夹
node_modules/   # 不需要发布 node_modules
example/        # 示例文件夹
.vscode/         # 编辑器配置
.git/           # Git 配置
tests/          # 测试文件
README.md       # 可选,通常 README 会发布到 npm

3. 配置构建工具(Vite)

为了让 Vue 组件能够正确地打包成 npm 包,你可以使用 Vite 来打包它。

3.1 安装 Vite 和相关依赖

首先安装 Vite 和 Vue 插件,便于构建和打包 Vue 组件。

npm install vite @vitejs/plugin-vue --save-dev

3.2 配置 vite.config.ts

在根目录下创建 vite.config.ts 来配置 Vite 打包,确保它正确打包 Vue 组件并生成类型声明文件。

vite.config.ts

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import dts from "vite-plugin-dts";  // 用来生成类型声明文件export default defineConfig({plugins: [vue(), dts()],build: {lib: {entry: "src/index.ts",   // 入口文件name: "MyButton",        // 全局变量名(UMD格式)fileName: "index",       // 输出的文件名},rollupOptions: {external: ["vue"],       // 确保 Vue 作为外部依赖,不打包进来output: {globals: {vue: "Vue",           // UMD 格式时,全局变量名称},},},},
});

3.3 创建 src/index.ts 文件

src/index.ts

import MyButton from "./MyButton.vue";// 作为模块导出
export { MyButton };// 或者提供一个 install 方法以支持全局注册
import type { App } from "vue";
export default {install(app: App) {app.component("MyButton", MyButton);},
};

4. 本地测试

在发布之前,你可以通过本地测试来验证组件是否能够正常工作。

4.1 创建一个本地测试项目(可选)

在本地创建一个简单的 Vue 项目,然后从你的组件库中导入并测试:

cd example
npm install ../my-button-component
<template><MyButton @click="handleClick">点击我</MyButton>
</template><script setup>
import { MyButton } from "@your-username/my-button";const handleClick = () => {console.log("按钮被点击了");
};
</script>

4.2 运行本地测试

在本地测试是否一切正常。如果都可以正常使用,就可以继续发布。


5. 发布到 npm

5.1 登录 npm

如果你还没有登录 npm,你需要先执行登录命令:

npm login

5.2 打包并发布

运行以下命令进行打包,并发布到 npm:

npm run build
npm publish --access public

如果是私有包,可以改成:

npm publish --access restricted

6. 其他建议

  • 版本管理:每次修改组件时,需要更新 package.json 中的 version,遵循语义化版本(SemVer)规则:major.minor.patch
  • README.md:在 README.md 中写好文档,描述组件的用法、安装方式、配置选项等。
  • CI/CD:可以设置 CI/CD 来自动化打包和发布,比如使用 GitHub Actions 或 GitLab CI 来实现。

7. 使用

发布成功后,别人就可以通过 npm 安装并使用你的组件了:

npm install @your-username/my-button

然后就可以在 Vue 项目中这样使用:

<template><MyButton @click="handleClick">点击我</MyButton>
</template><script setup>
import { MyButton } from "@your-username/my-button";const handleClick = () => {console.log("按钮被点击了");
};
</script>

这样,整个 发布到 npm 的流程就完成了!你可以根据需要随时更新和发布新版本。

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

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

相关文章

MySQL入门基础指南

目录 一、什么是数据库&#xff1f; 仅依靠文件存储数据存在以下几个明显缺点&#xff1a; 数据库的存储介质通常包括&#xff1a; 二、主流数据库介绍 三、客户端 VS 服务器 四、推荐看的MySQL安装技术博客 五、数据库的存储介质 数据库的存储介质主要分为以下两类&am…

【实战中提升自己完结篇】分支篇之分支之无线、内网安全与QOS部署(完结)

1 1拓扑 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支无线部署 说明&#xff1a;分支无线用瘦AP部署&#xff0c;通过VPN直接注册到总部的AC上面&#xff0c;实现无线的业务提供&…

带你了解STM32:GPIO通用输入输出口

目录 3.1 GPIO简介 3.2 GPIO基本结构 3.3 GPIO位结构 输入部分&#xff1a; 二极管的保护作用&#xff1a; 施密特触发器&#xff1a; 片上外设端口 输出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉输入 3.4.2 模拟输入 3.4.3 开漏/推挽输出 3.4.…

Http(自写)

作为一个程序员&#xff0c;假设我们要在a电脑的进程里发一段数据到b电脑&#xff0c;一般使用socket编程&#xff0c;可选项也就tcp&#xff0c;udp二选一socket本质上就是一个代码库tcp有粘包问题&#xff08;字节流&#xff09;&#xff0c;纯裸tcp不能之际拿来使用所以我们…

C#使用OpenVinoSharp和PP-Human进行行人检测

效果 项目依赖 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代码 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向对象:类、对象与伴生关系

在前几节中&#xff0c;我们学习了 Scala 的基础语法和流程控制。现在&#xff0c;我们将深入探索 Scala 作为一门纯粹的面向对象语言的核心。在 Scala 中&#xff0c;万物皆对象&#xff0c;没有像 Java 那样的原始类型和静态成员的区分。本节将重点介绍如何定义对象的蓝图&am…

【大语言模型 58】分布式文件系统:训练数据高效存储

分布式文件系统&#xff1a;训练数据高效存储 关键词&#xff1a;分布式文件系统、HDFS、Lustre、GlusterFS、数据本地性、I/O优化、存储架构、大数据存储、训练数据管理、存储性能调优 摘要&#xff1a;本文深入探讨大语言模型训练中的分布式文件系统技术&#xff0c;从存储架…

【科研绘图系列】R语言绘制散点图以及线性回归拟合曲线图

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 数据下载 函数 导入数据 数据预处理 画图 总结 系统信息 介绍 数据导入 代码的开始部分涉及多个数据集的导入,这些数据集涵盖了不同类型的生态学数据,包括实验室培养…

SQL 数据库操作语言详解

1. SQL 语言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理关系型数据库的标准语言&#xff0c;主要分为以下几个子语言&#xff1a;- DQL&#xff08;数据查询语言&#xff09;&#xff1a;SELECT - 用于数据查询 - DML&#xff08;数据操作语言&#x…

积分变换的前世今生

积分变换常应用于解微分方程微分方程的解法&#xff1a;时域经典法&#xff1b;频域变换法&#xff1b;“积分变换”最初并不是为了解微分方程&#xff0c;而是出于更“纯粹”的数学动机——理解函数的结构、求解代数或几何问题&#xff0c;以及简化复杂的积分运算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一个由 Google 开发的命令行参数解析库&#xff0c;主要用于在 C&#xff08;也支持其他语言&#xff09;程序中便捷地处理命令行参数。它的核心作用是帮助开发者快速定义、解析和使用命令行选项&#xff0c;避免手动编写繁琐的参数解析…

编译器的前端中端和后端

前面说的词法分析和语法分析&#xff0c;确实是编译器前端 (Front End) 最核心的两个部分。但前端的工作还没有结束。编译器各阶段划分 一个完整的编译器通常可以分为三个部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心职责: 理解源代码。…

黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02

黑马Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;并发和并行&#xff0c;笔记02 一、并发和并行 并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 二、为什么有…

20250908 背包DP总结

引子 ~ 我们都有一个家&#xff0c;名字叫背包 ~ 背包DP 顾名思义&#xff0c;背包DP是用来解决背包最值问题的。题目会给出背包的容量&#xff0c;以及几个物品的属性&#xff0c;比如重量&#xff0c;价值&#xff0c;限额等等&#xff0c;具体是什么看题目。 01背包 01…

Redis持久化之RDB:快照机制原理、配置与最佳实践

Redis持久化之RDB&#xff1a;快照机制原理、配置与最佳实践 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默认持久化方式&#xff0c;它在指定的时间间隔内生成数据集的快照&#xff08;snapshot&#xff09;&#xff0c;并将快照保…

daily notes[44]

文章目录基础references基础 hello,world是几乎所有编程语言的第一例子&#xff0c;rust也不例外。但和其它语言不一样&#xff0c;Rust的源码最好拥有自己的项目目录。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代码文件名为main.rs&#xff0c;内容如…

JavaScript对象创建方式完全指南:从原始到现代的演进之路

前言 作为一名前端开发者&#xff0c;JavaScript中对象创建是很重要。在JavaScript这门基于原型的语言中&#xff0c;对象几乎无处不在。今天&#xff0c;我将带领大家回顾JavaScript对象创建的7种方式&#xff0c;从最原始的字面量到现代的ES6 class&#xff0c;每一步演进都解…

基于单片机的无线水塔监控系统设计(论文+源码)

本设计为基于单片机的无线水塔监控系统设计&#xff0c;主要由以下几部分组成&#xff1a;均采用STC89C52RC单片机为主控&#xff1b;主机&#xff1a;NRF24L01无线通讯模块&#xff0c;1602LCD液晶显示屏。从机&#xff1a;NRF24L01无线通讯模块&#xff0c;水位传感器&#x…

凌晨0-3点不睡,你熬的不是夜,是人生!

“熬夜”这个词&#xff0c;早已成为现代生活的常态。有人为了工作加班到深夜&#xff0c;有人为了娱乐刷剧到天明&#xff0c;但你知道吗&#xff1f;熬夜最“要命”的时间段&#xff0c;其实是凌晨0点到凌晨3点。别以为只是少睡几个小时而已&#xff0c;这个时间段不睡&#…

大语言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通义千问、ChatGLM 等大语言模型&#xff0c;背后都离不开一个核心架构——Transformer。 2017 年&#xff0c;Google 在论文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;彻底改变了自然语言处理的发展方向。它摒…