npm发布插件到私有仓库保姆级教程

news2025/1/19 2:53:57

在开发项目的过程中,我们经常需要安装插件依赖,那么怎么把自己开发的组件封装成一个插件,并发布到npm 插件市场或者上传到私有仓库里面呢?今天总结下自己发布插件到私有仓库的记录:

一、创建组件

  1. 执行命令创建一个空项目:npm create vite
  2. 在 src 目录下面创建一个文件 package 存放组件和公共的JS方法。
    在这里插入图片描述
  3. 重点说明下 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 = true
    components.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

到这一步组件已经开发完毕,接下里就是上传到私有仓库的操作了。

二、打包组件

  1. 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"
  }
}

  1. 设置 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'
        },
      },
    },
  }
})

  1. 执行打包命令pnpm run build进行打包插件 会看到生成的 dist 文件就是整个插件的代码了。

三、npm 上传插件

插件既可以上传到npm 市场,也可上传到公司内部的私有仓库里。2种方案都给大家说下吧

上传到npm 官方

  1. 登录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

  1. 插件热更新,实时监听插件的代码变化,并随时打包dist文件。npm run build:watch
    注意在package.json 添加该命令
    在这里插入图片描述
  2. 在主项目里面进行链接到插件 npm link [插件名称] --global , 这里特别提示下,如果不起作用,就需要把主项目里面下载的这个依赖包进行remove 掉,重新链接。成功后如下。

在这里插入图片描述
这里再送出最后一个福利(被抖音直播洗脑了)哈哈,如果插件有固定的前缀,可以在本机环境下配置下:找到本机的 .npmrc 文件,或者在主项目根目录也行,添加镜像切换:
在这里插入图片描述
这样以后只要登录成功一次,后面就不需要再切换镜像和重复登录了。

友情提示:如果上传失败,要检查是否修改版本号了,其次登录npm 成功后,上传完成,要及时把镜像切换回去。

补充创建软链,也可自行百度
在这里插入图片描述
over ! 祝好!

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

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

相关文章

渗透测试---burpsuite(5)web网页端抓包与APP渗透测试

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽---bp&…

关闭windows11的“热门搜索”

win10搜索栏热门搜索怎么关闭?win10搜索栏热门搜索关闭方法分享_搜索_onecdll-GitCode 开源社区 注册表地址是:计算机\HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\ 最后效果如下:

【MySQL】视图详解

视图详解 一、视图的概念二、视图的常用操作2.1创建视图2.2查询视图2.3修改视图2.4 删除视图2.5向视图中插入数据 三、视图的检查选项3.1 cascaded(级联 )3.2 local(本地) 四、视图的作用 一、视图的概念 视图(View)是一种虚拟存…

数据结构 (22)哈夫曼树及其应用

前言 哈夫曼树(Huffman Tree),又称最优二叉树或最优树,是一种特殊的二叉树结构,其带权路径长度(WPL)最短。 一、哈夫曼树的基本概念 定义:给定N个权值作为N个叶子结点,构…

Jenkins 的HTTP Request 插件为什么不能配置Basic认证了

本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级,升级策略是在一台新服务器上安装和配置最新版本的Jenkins, 当前的最新版本是: 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载,也可以到如下地址下载&#xff1…

1.1 Beginner Level学习之“创建 ROS msg 和 srv”(第十节)

学习大纲: 1. msg 和 srv msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言生成消息的源代码。srv 文件则描述了一个服务,包括两部分:请求和响应。Srv 文件用于生成服务的源代码。msg 文件存储在包的 msg 目录中。srv 文件存…

ubuntu中使用ffmpeg库进行api调用开发

一般情况下,熟悉了ffmpeg的命令行操作,把他当成一个工具来进行编解码啥的问题不大,不过如果要把功能集成进自己的软件中,还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了,直接用官网别人编译好的库就…

deepsort复现报错TypeError: tuple indices must be integers or slices, not tuple 解决

deepsort复现中遇到的TypeError: tuple indices must be integers or slices, not tuple问题的解决-CSDN博客 以上为参考教程。 复现的时候出现这个报错,搞了好久试了好多方法,包括降 scikit-learn版本,都不行,最后终于找到这个博…

Rigol DP711自动控制--SCPI命令

通过串口的SCPI命令来控制通道输入输出 也可以用UltraSigma UI来发送SCPI 物理连接: Pin2_2, Pin3_3, Pin5_5 串口命令控制: 命令:9600, 8bit, None SCPI CMD(Standard Commands for Programmable Instruments) OUTPut CH1, On…

【Java Web】Tomcat 快速入门

通常,为了让 Java 开发的应用程序(app)能够在服务器上正常运行,必须安装 Java 运行时环境(JRE)。JRE 主要支持 Java SE,而如果要运行 Java EE 应用,则需要更多的支持,比如…

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…

SpringMvc完整知识点一

SpringMVC概述 定义 SpringMVC是一种基于Java实现MVC设计模型的轻量级Web框架 MVC设计模型:即将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离…

强化学习新突破:情节记忆与奖励机制引领多智能体协作

简介 本推文介绍了韩国科学技术院发表在人工智能顶会ICLR 2024上的论文《Efficient Episodic Memory Utilization of Cooperative Multi-Agent Reinforcement Learning》。该论文提出创新性高效情节记忆利用(Efficient Episodic Memory Utilization,EMU…

密码翻译

密码翻译 C语言实现C实现Java实现Python实现 💐The Begin💐点点关注,收藏不迷路💐 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报…

【C++初阶】第7课—标准模版库STL(string_1)

文章目录 1. 什么是STL2. STL六大组件3. 标准库中string类3.1 auto关键字3.2 范围for3.3 string类的类型3.4 string类的常用接口(string类对象的常见构造)3.5 string的析构和赋值运算符重载3.6 string类对象的容量操作 1. 什么是STL STL(standard template library—标准模板库…

uniapp扭蛋机组件

做了一个uniapp的扭蛋机组件,可以前往下载地址下载 支持vue2、3、h5页面微信小程序,其余小程序未测试 示例图片

MyBatis的工作流程是怎样的?

大家好,我是锋哥。今天分享关于【MyBatis的工作流程是怎样的?】面试题。希望对大家有帮助; MyBatis的工作流程是怎样的? MyBatis 的工作流程可以分为几个主要步骤:从配置、映射到执行 SQL,最终获取数据库结…

MYSQL PARTITIONING分区操作和性能测试

PARTITION OR NOT PARTITION IN MYSQl Bill Karwin says “In most circumstances, you’re better off using indexes instead of partitioning as your main method of query optimization.” According to RICK JAMES: “It is so tempting to believe that PARTITIONing wi…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性(reliability) 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性(dependablity)的目的 其目的是覆盖系统的可用性&#x…

vue3中使用watchEffect和watch函数时应当防止内存泄漏

官方文档:https://cn.vuejs.org/api/reactivity-core.html#watcheffect 也就是说当使用他们两个时候,使用完成之后要及时停止他们,防止一直在运行,停止他们之后,也可以再次开启。 watchEffect()​ 立即运行一个函数…