npm发布插件到私有仓库保姆级教程
在开发项目的过程中,我们经常需要安装插件依赖,那么怎么把自己开发的组件封装成一个插件,并发布到npm 插件市场或者上传到私有仓库里面呢?今天总结下自己发布插件到私有仓库的记录:
一、创建组件
- 执行命令创建一个空项目:
npm create vite - 在 src 目录下面创建一个文件 package 存放组件和公共的JS方法。

- 重点说明下
packages/index.js因为插件需要支持按需引入和全局引入,所以这里搞了2种方式:整个案例如下
import { getCurrentInstance } from 'vue'
import EosVtable from './table'const components = [EosVtable]
export { EosVtable, setGlobalConfig }// 用于按需导入
const setGlobalConfig = (option) => {const { appContext } = getCurrentInstance()Set_Provide(option, appContext)
}const Set_Provide = (option, app) => {const context = computed(() => {const cfg = unref(option)return cfg})for (const key in option) {app.config.globalProperties[`$${key}`] = context.value[key]}
}// 定义 install 方法 全局引入
const install = (app, option) => {if (install.installed) return;install.installed = truecomponents.map(component => {app.component(component.name, component)})if (option) Set_Provide(option, app)
}
if (typeof window !== 'undefined' && window.Vue) {install(window.Vue)
}const installer = () => {return {install,setGlobalConfig,}
}export default installer()
补充下组件下的index.js下的组件暴露方法:
import Vtable from "./index.vue"
Vtable.name = "EosVtable"
Vtable.install = function (Vue) {Vue.component('EosVtable', Vtable)
}
export default Vtable
到这一步组件已经开发完毕,接下里就是上传到私有仓库的操作了。
二、打包组件
- 在
package.json里面配置包的名称,版本号,导出路径等相关信息。切记每次上传时要记得修改版本号,否则会报错的。照着我的抄,改成自己的名称即可。
{"name": "@eosine/vtable","private": false,"version": "0.0.14","type": "module","main": "dist/@eosine-vtable.umd.cjs","module": "dist/@eosine-vtable.js","files": ["dist/*"],"scripts": {"dev": "vite","build": "vite build","preview": "vite preview","build:watch": "vite build --watch","pushnpm": "npm publish"},"dependencies": {"pinyin-match": "^1.2.6","unplugin-auto-import": "^0.18.3","vue": "^3.5.10","vxe-pc-ui": "^4.2.18","vxe-table": "4.7.85","vxe-table-plugin-element": "^4.0.4"},"devDependencies": {"@vitejs/plugin-vue": "^5.1.4","sass": "^1.79.4","vite": "^5.4.8"}
}
- 设置
vite.config.js这里主要是设置插件的入口文件地址 lib , 完整案例
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from "path";
import AutoImport from "unplugin-auto-import/vite"
const resolve = (dir) => path.join(__dirname, dir);
export default defineConfig({plugins: [vue(),AutoImport({imports: [// 需要自动导入的API,自动导入vue和vue-router相关函数'vue','vue-router','pinia',],// 指明 .d.ts 文件的位置和文件名,生成 `auto-import.d.ts` 全局声明dts: 'src/types/auto-import.d.ts',}),],resolve: {alias: {"@": path.resolve(__dirname, './src'),},},build: {rollupOptions: {// 请确保外部化那些你的库中不需要的依赖external: ['vue', 'element-plus'],output: {// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量globals: {vue: 'Vue',},},},lib: {entry: "src/packages/index.js",name: "@eosine/vtable",fileName: "@eosine-vtable"},},server: {host: true,open: true,proxy: {'/api': {target: 'http://XXX.com'},'/M00': {target: 'http://XXX.com'}}},vite: {css: {preprocessorOptions: {scss: {api: 'modern-compiler', // or 'modern'},},},}
})
- 执行打包命令
pnpm run build进行打包插件 会看到生成的 dist 文件就是整个插件的代码了。
三、npm 上传插件
插件既可以上传到npm 市场,也可上传到公司内部的私有仓库里。2种方案都给大家说下吧
上传到npm 官方
- 登录npm, 执行命令
npm login, 没有账户的自行注册,上传失败的,检查npm 代理路径是否为官方的,如果是淘宝镜像需要自行切换到官方才可使用,包名是否已经在插件市场存在。
设置 npm 的 registry 为官方源
npm config set registry https://registry.npmjs.org
这里推荐一个工具 nrm 来统一维护自己的镜像,全局安装以下或者自行百度该插件,主要使用命令就是新增和切换镜像:nrm use 和 nrm ls

2. 直接执行命令 npm publish 进行上传即可,到npm 官网查看是否发布成功

四、上传到私有仓库
上面说了那么多,重点核心来了,如何上传到私有仓库呢 ?前提需要咱们的服务器部署私有仓库环境,
目前主流使用的都是
Verdaccio首次上传时需要把咱们的镜像切换到自己的私有仓库镜像,并进行登录,
切换镜像nrm use eos
登录npm login输入完账号和密码,
执行最后的上传命令npm publish,即可大功告成。
能看到这里的兄弟们幸苦了,必须再送各位一波福利,终极大招,项目调试插件。
五、插件联调
这里必须再上一个命令 ,非常少用的:npm link
- 插件热更新,实时监听插件的代码变化,并随时打包
dist文件。npm run build:watch
注意在package.json 添加该命令

- 在主项目里面进行链接到插件
npm link [插件名称] --global, 这里特别提示下,如果不起作用,就需要把主项目里面下载的这个依赖包进行remove掉,重新链接。成功后如下。

这里再送出最后一个福利(被抖音直播洗脑了)哈哈,如果插件有固定的前缀,可以在本机环境下配置下:找到本机的 .npmrc 文件,或者在主项目根目录也行,添加镜像切换:

这样以后只要登录成功一次,后面就不需要再切换镜像和重复登录了。
友情提示:如果上传失败,要检查是否修改版本号了,其次登录npm 成功后,上传完成,要及时把镜像切换回去。
补充创建软链,也可自行百度

over ! 祝好!
相关文章:
npm发布插件到私有仓库保姆级教程
在开发项目的过程中,我们经常需要安装插件依赖,那么怎么把自己开发的组件封装成一个插件,并发布到npm 插件市场或者上传到私有仓库里面呢?今天总结下自己发布插件到私有仓库的记录: 一、创建组件 执行命令创建一个空…...
WinRAR V7.10纯净体验
前言 很多同学在安装了WinRAR之后,每次用这个软件解压文件时,都会先跳出一个广。这个广就像打开了一个新窗口,很打扰人。从WinRAR的5.40版本开始,哪怕是简体中文版的,都会这样弹广告。不管你有没有注册账号࿰…...
scss文件内引入其他scss文件报错
1、今天在编译一些老项目的时候,老是提示下面信息 2、而且有很多Sass import rules are deprecated and will be removed in Dart Sass 3.0.0.警告 3、用npm view sass versions看,其中sass的最新版本是1.82.0 4、经过测试"sass": "1.75…...
1-12 GD32基于定时器输入捕获
前言: 基于本人对相关知识回顾与思考,仅供学习参考 目录 前言: 1.0 输入捕获 2.0 信号周期 3.0 定时器配置 4.0 定时器配置 5.0 定时器中断 后记: 1.0 输入捕获 2.0 信号周期 获取信号周期的方法,在第一次捕获与…...
前端基础的讲解-JS(22)
什么是JSON? 1.json 是一种轻量级的数据交换格式 简单来说:json 就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。 类似于: 国际通用语言 - 英语 中国 56 个民族不同地区的通用语言 - 普通话 …...
Minecraft-Datapack数据包开发3-进度与成就
目录 简介成就与进度根进度叶子进度更多的检测方式 简介 代码已经上传: gitee github 成就与进度 工欲善其事必先利其器,别死记硬背,多使用自动生成网站 进度数据包生成器:https://misode.github.io/advancement/指令生成器&…...
泷羽sec-shell编程(3)
shell(3) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…...
如何解决压测过程中JMeter堆内存溢出问题
如何解决压测过程中JMeter堆内存溢出问题 背景一、为什么会堆内存溢出?二、解决堆内存溢出措施三、堆内存参数应该怎么调整?四、堆内存大小配置建议 背景 Windows环境下使用JMeter压测运行一段时间后,JMeter日志窗口报错“java.lang.OutOfMe…...
爬虫项目基础知识详解
文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…...
uniapp 微信小程序webview 和 h5数据通信
项目是uniapp编写,因为是先开发了h5和app,小程序是突然要用的,做兼容开发已经来不及,由于微信小程序webview载入h5 因为通信必须要特殊限制(网页向小程序 postMessage 时,会在以下特定时机触发并收到消息&a…...
SSM01-MyBatis框架(一文学会MyBatis)
Mybatis框架 一、Mybatis框架简介 1.1 传统JDBC的缺陷 (1)数据库连接创建、释放频繁会造成系统资源浪费 【MyBatis通过在核心配置文件中配置数据路连接池解决此问题】 (2) SQL语句在代码中硬编码(PreparedStatement向占位符传…...
【PlantUML系列】状态图(六)
一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…...
JS中重排和重绘的区别是什么?
在JavaScript中,当DOM(文档对象模型)发生变化时,浏览器需要重新计算和更新渲染树,这个过程通常涉及到重排(reflow)和重绘(repaint)。了解这两者之间的区别对于优化页面性…...
工业—使用Flink处理Kafka中的数据_ProduceRecord2
使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“...
C 库中的断言与 FreeRTOS 中的 trace 宏
在 C 编程领域,断言和 FreeRTOS 中的 trace 宏都有着独特而重要的作用。 一、断言(assert) 断言在一般的 C 库中是一个非常有用的工具,它以函数的形式存在。其核心作用在于对程序中的逻辑条件进行检查,确保特定的表达…...
JAVAWeb中的Servlet学习
一 Servlet简介 1.1动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源.例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成,例如Servle…...
docker安装ddns-go(外网连接局域网)
docker先下载镜像,目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…...
时间复杂度度详解
时间复杂度是衡量算法性能的重要指标,用来描述算法随着输入规模 n 增大,运行时间的增长趋势。以下是时间复杂度的核心概念与常见分类的详细讲解。 1. 时间复杂度的定义 时间复杂度反映了算法执行的 基本操作数量 与输入规模 n 的关系。它通常使用大 O表示法来表示,即: 其中…...
如何处理和优化大文件上传和下载
如何处理和优化大文件上传和下载 简单来说 文件过大会导致内存溢出,上传和下载过慢会影响用户体验,不合理的设计可能引发安全问题,还有网络问题,数据完整性,服务器压力等 文件过大,内存溢出,…...
QT 线程锁
在 Qt 中,线程锁是用来同步多线程访问共享资源的机制,防止数据竞争和线程安全问题。Qt 提供了几种线程锁和同步工具,主要包括以下几种: 1. QMutex 功能:QMutex 是 Qt 中最常用的互斥锁(mutex)…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...
数据库优化实战指南:提升性能的黄金法则
在现代软件系统中,数据库性能直接影响应用的响应速度和用户体验。面对数据量激增、访问压力增大,数据库性能瓶颈经常成为项目痛点。如何科学有效地优化数据库,提升查询效率和系统稳定性,是每位开发与运维人员必备的技能。 本文结…...
