当前位置: 首页 > news >正文

如何将本地组件库上传到npm上

如何把本地开发的组件发布到npm上面,我们需要去了解vue封装组件的原理,利用vue.use(plugin)这个api, 我们需要把封装好的组件打包成vue库,并提供install方法发布到npm上去,Vue.use(plugin)自动执行插件中的install方法。

我们在这里主要介绍的是怎么把已经开发好的公共组件打包发布到npm上面。首先需要我们调整下目录结构 ----> 创建打包组件的文件 ----> 把打包文件发布到npm上

目录结构

  1. 在当前项目创建一个打包文件夹packages
  2. 将每个组件的文件调整下,每个组件下定义src/index (组件内容) 以及与src同级index目录(暴露当前组件)

在这里插入图片描述

import { App } from 'vue'
import calendar from './src/index.vue'// 让这个组件可以通过use的形式使用
export default {install(app: App) {app.component('jsq-calendar', calendar)}
}
  1. 在文件下packages创建index.js文件
import { App } from 'vue'
import chooseArea from './chooseArea'
import chooseIcon from './chooseIcon'
import trend from './trend'
......const components = [chooseArea,chooseIcon,trend,......
]
export default {install(app: App) {components.map(item => {app.use(item)})}
}

创建打包命令

  1. 创建build.js用来打包组件
const path = require('path')
const { defineConfig, build } = require('vite')
const vue = require('@vitejs/plugin-vue')
const vueJsx = require('@vitejs/plugin-vue-jsx')
const fxExtra = require('fs-extra')
const fs = require('fs')// 打包入口文件夹
const entryDir = path.resolve(__dirname, '../packages')
// 出口文件夹
const outDir = path.resolve(__dirname, '../lib')// vite基础配置
const baseConfig = defineConfig({configFile: false,publicDir: false,plugins: [vue(), vueJsx()]
})// rollup配置
const rollupOptions = {external: ['vue', 'vue-router'],output: {globals: {vue: 'Vue'}}
}// 全量打包构建
const buildAll = async () => {await build({...baseConfig,build: {rollupOptions,lib: {entry: path.resolve(entryDir, 'index.ts'),name: 'jsq-element-components',fileName: 'jsq-element-components',formats: ['es', 'umd']},outDir}})
}// 单组件打包构建
// name组件名称
const buildSingle = async (name) => {await build({...baseConfig,build: {rollupOptions,lib: {entry: path.resolve(entryDir, name),name: 'index',fileName: 'index',formats: ['es', 'umd']},outDir: path.resolve(outDir, name)}})
}// 每个组件生产package.json
const createPackageJson = (name) => {const fileStr = `{"name": "${name}","main": "index.umd.js","module": "index.es.js","style": "style.css"}`// 输出fxExtra.outputFile(path.resolve(outDir, `${name}/package.json`),fileStr,'utf-8')
}// 打包成库
const buildLib = async () => {await buildAll()// 获取组件名称组成的数组const components = fs.readdirSync(entryDir).filter(name => {const componentDir = path.resolve(entryDir, name)const isDir = fs.lstatSync(componentDir).isDirectory()return isDir && fs.readdirSync(componentDir).includes('index.ts')})// 循环构建for(const name of components) {await buildSingle(name)createPackageJson(name)}
}
buildLib()
  1. 在package.json创建打包组件命令:“lib”: "node ./build.js”
  2. 执行命令 npm run lib
  3. 在项目文件下会生产lib文件夹,这个就是发布到npm上的文件代码
    在这里插入图片描述
  4. lib文件下执行 npm init -y 生产package.json文件
{"name": "jsq-element-components", // 组件名称"version": "1.0.0", // 版本号"main": "index.umd.js","module": "index.mjs","types": "index.d.ts","author": {"name": "jsq"},"keywords": ["ts","封装组件","vue-componets"]
}

npm官网注册

  1. npm官网
  2. 注册账号
    在这里插入图片描述

代码发布到npm上

  1. cd 到当前lib文件下
cd lib 
  1. 先查看 npm 的 registry
npm config get registry
  1. 设置 npm 的 registry 为官方源
npm config set registry https://registry.npmjs.org
  1. 执行命令 npm login 登录到 npm
npm login
  1. 执行命令 npm publish 发布到 npm
npm publish
  1. 登录npm官网 点击packages 查看上传的代码
    在这里插入图片描述

项目使用

  1. npm install 项目文件名称
npm install jsq-element-components
  1. 在项目入口文件引入组件
import App from './App.vue'	
// 组件
import jsqUI from 'jsq-element-components'
// 组件样式
import 'jsq-element-components/style.css'const app = createApp(App)
app.use(jsqUI)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【区块链+金融服务】甘肃股权交易中心企业金融服务平台 | FISCO BCOS应用案例
  • DQL-案例
  • 第10章 无持久存储的文件系统 (3)
  • 【hot100篇-python刷题记录】【和为 K 的子数组】
  • 写一个githubDemo
  • docker 安装minio并配置https域名访问
  • 4款AI 生成 PPT的工具,帮你赶上演示文稿的新趋势!
  • RabbitMQ的核心概念
  • 《九歌· 程序员》
  • 【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)
  • kafka运维常用命令
  • 存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)
  • C++ //练习 17.12 使用前一题中的数据结构,编写一个函数,它接受一个问题编号和一个表示真/假解答的值,函数根据这两个参数更新测验的解答。
  • 【轻松拿捏】什么是多态?如何在 Java 中实现多态?
  • 30. 串联所有单词的子串【 力扣(LeetCode) 】
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Javascript 原型链
  • javascript面向对象之创建对象
  • session共享问题解决方案
  • spring boot下thymeleaf全局静态变量配置
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Travix是如何部署应用程序到Kubernetes上的
  • ubuntu 下nginx安装 并支持https协议
  • 安装python包到指定虚拟环境
  • 回顾 Swift 多平台移植进度 #2
  • 使用parted解决大于2T的磁盘分区
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 学习笔记:对象,原型和继承(1)
  • 用 Swift 编写面向协议的视图
  • ![CDATA[ ]] 是什么东东
  • # Apache SeaTunnel 究竟是什么?
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #define
  • #pragma once与条件编译
  • #stm32整理(一)flash读写
  • (2)MFC+openGL单文档框架glFrame
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Note)C++中的继承方式
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (zhuan) 一些RL的文献(及笔记)
  • (离散数学)逻辑连接词
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十一)手动添加用户和文件的特殊权限
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (循环依赖问题)学习spring的第九天
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转) Android中ViewStub组件使用
  • ****三次握手和四次挥手
  • .bat文件调用java类的main方法
  • .NET : 在VS2008中计算代码度量值
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法