Vue3 + Vite 构建组件库的整体流程

Vue3 + Vite 构建组件库的流程

本文教你如何用 Vue + Vite,一步一步构建一个组件库并发布到 npm 的整体流程

1. 通过 vite 命令创建一个基本的项目结构(这里选用 vue + ts 的项目)

  • npm create vite@latest
    

2. 在项目中创建一个 lib 目录,用于存放组件库所要编写的组件

  • 在这里插入图片描述

3. 我们先在 lib 中编写组件库的第一个组件,用于这次组件库的搭建的组件 - 这里只通过创建一个简单的按钮 button 组件来作为测试

  • <!-- lib/components/HButton.vue -->
    <script setup lang="ts">
    import { ref } from 'vue';defineProps<{title: string
    }>()const count = ref(0)
    </script><template><button class="h-button" @click="count++">{{ title }} : {{ count }}</button>
    </template><style scoped>
    .h-button {background-color: #409eff;color: white;padding: 0 16px;height: 34px;line-height: 34px;border-radius: 4px;border: 0px;cursor: pointer;
    }.h-button:hover {background-color: #66b1ff;
    }
    </style>
    

4. 我们可以先在 App.vue 中引入该组件,来测试一下该组件

  • <script setup lang="ts">
    import HButton from "../lib/components/HButton.vue"
    </script><template><h1>app</h1><hr><HButton title="小孔" />
    </template>
    
  • 在这里插入图片描述

5. 当组件测试没有问题后,接下来我们需要在 vite.config.ts 配置文件中,配置项目打包为一个 lib 库模式

  • // vite.config.ts : 项目初始配置
    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'
    export default defineConfig({plugins: [vue()],
    })
    
  • // // vite.config.ts : 配置 build 打包模式为 lib 库模式 → 下面对应的配置也可以直接在 vite 官方文档中找到对应的示例
    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'import { resolve } from "path"export default defineConfig({plugins: [vue()],build: {lib: {entry: resolve(__dirname, 'lib/main.ts'), // -- 配置打包的库的入口文件name: 'my-lib-test',fileName: 'my-lib-test' // -- 配置打包的文件名},rollupOptions: {// -- 配置你不需要打包进库中的依赖库(因为该组件库是在 vue 项目中的,所以使用的项目需要本身就有 vue 依赖库了,所以我们在这里不需要打包进组件库中) -- 如果你还有其它的依赖也不想打包进依赖库中,同理external: ['vue'],}}
    })
    
  • 注意: - 我们将上面的配置好后,我们会发现他的有些代码报错了

    • 在这里插入图片描述

    • 这是因为 vite 创建的项目,默认是没有对应 node 的相关类型的,而 path 与 __dirname 是 node 中的东西

    • 解决该问题,我们只需要下载对应的 node 类型库就行了 → npm i @types/node

    • 在这里插入图片描述

6. 在对应的 lib 库的入口文件 main.ts 中引入我们所写好的 HButton 组件,并导出我们需要导出的组件

  • // lib/main.ts
    // -- 引入我们写好的组件并在 main.ts 入口文件中将其导出 → 使其在打包中可以将该组件构建进去
    export { default as HButtom } from "./components/HButton.vue"
    

7. 我们可以先通过 npm run build 来打包一下,来看一下效果

  • 在这里插入图片描述

  • 上面打包后的 dist 目录中还有两个先问题,一个是 vite 默认会将 public 中的内容直接复制到对应的打包目录中,一个是没有将对应的类型声明构建进去

    • 第一个问题: 我们可以通过在 build 中将 copyPublicDir 配置为 false → 表示构建时不对 public 中的内容进行复制

      • // vite.config.ts
        export default defineConfig({build: {copyPublicDir: false,// ...}
        })
        
    • 第二个问题: 我们可以通过在 vite 中配置 vite-plugin-dts 插件,该插件可以使在库模式下,自动根据源文件生成对应的类型声明文件(🔺因为需要处理的东西比较多,在下面进行介绍 ↓)

8. 通过 vite-plugin-dts 来生成对应的类型文件

  • 安装: - npm i vite-plugin-dts -D

  • 配置:

    • // vite.config.ts
      import dts from 'vite-plugin-dts'export default defineConfig({plugins: [vue(),dts({ // -- 配置 vite-plugin-dts 插件rollupTypes: true, // -- 是否将说有的类型声明,合并到一个文件中tsconfigPath: "./tsconfig.json" // -- 指定对应的 tsconfig 文件,会根据该配置文件中的 include 配置生成对应的类型声明})],// ... 
      })
      
    • 在这里插入图片描述

  • 如上图,我们会发现一个问题,如果我们配置好对应的 dts 插件后,重新构建时,会出现一些错误,且所生成的类型文件也是存在问题 → 🔺这是因为 dts 中的 tsconfigPath 配置的问题

  • 因为 tsconfigPath 我们配置的是 tsconfig.json 中的 include 中不是我们想要包含的文件

    • 在这里插入图片描述
  • 🔺我们可以创建一个专用于打包的 ts 配置文件(tsconfig.build.json),并将 dts 插件中的 tsconfigPath 配置该 ts 配置文件

    • // tsconfig.build.json
      {"extends": "./tsconfig.json", // -- 除了 include 配置外,其它所有配置都继承于原本的 tsconfig.json 配置文件"include": [ // -- 配置所要包含想要包含的目录(如下就表示 lib 目录下的多有内容)"lib",]
      }
      
    • export default defineConfig({plugins: [vue(),dts({rollupTypes: true, tsconfigPath: "./tsconfig.build.json" // -- 替换成 tsconfig.build.json 配置文件})]
      })
      
  • 此时,我们在通过 npm run build 时,就不会出现对应的报错,且对应打包的库也能生成正常对应的类型声明文件了

    • 在这里插入图片描述

9. 上面还可以做一个小优化,可以通过上图看到,组件中的样式它是打包到一个单独的 css 文件中的,并且默认时不会自动在对应打包的 js 中引入该样式

  • 也就是说,我们在使用该组件时需要先引入对应的该库中的 css 文件(如在对应项目 main.ts 项目入口中引入)

  • 我们也可以通过 "vite-plugin-libcss" 插件来帮助我们自动引入对应的样式文件,该插件可以自动的将对应 css 通过 import 导入到对应捆绑的 js 文件中

    • 安装: npm i vite-plugin-libcss -D

    • 配置:

      • // vite.config.ts : 在 vite 中配置对应插件
        import libCss from 'vite-plugin-libcss';export default defineConfig({plugins: [// ..libCss()],// ..
        })
        
    • 此时,我们打包后查看对应的 js 文件,就会发现它会自动的将对应的 css 进行注入,所以我们现在就可以直接在项目中引入对应的 js 文件中的内容来使用即可

      • 在这里插入图片描述

10. 现在,我们在 App.vue 组件中导入对应打包后的 dist 目录下的文件中的组件,来进行使用与测试

  • <!-- src/App.vue -->
    <script setup lang="ts">
    import { HButtom } from "../dist/my-lib-test" // -- 引入打包后的库的组件
    </script><template><h1>app</h1><hr><HButtom title="小孔" />
    </template>
    
  • 在这里插入图片描述

  • 使用起来也一切正常后,接下来我们就可以将该库发布到 npm 上了

11. 现在,发布 npm 包还需要再 package.json 中做一些简单配置,具体如下

  • // package.json
    {"name": "lib-test", // -- 必填: 库名,必须是唯一的,可以先上 npm 搜索,看是否已经存在该库了(如果已经存在,需要更换名称)"version": "0.0.1", // -- 必填: 版本号(如果更新包内容,此项也必须比前面的版本高)"private": false,  // -- 此项默认为 true,需要将其配置成 false 或删除该配置项"type": "module", "main": "./dist/my-lib-test。umd.js", // -- 指定包的入口文件(通过 require 引入包时,加载的文件 )"module": "./dist/my-lib-test.js", // -- 指定包的入口文件(通过 esmodule 引入时,加载的文件)"types": "./dist/my-lib-test.d.ts", // -- 指定 ts 类型声明文件"files": [ // -- 指定发布包时,所包含的文件和目录"dist"],"description": "测试 lib 组件库", // -- 包描述"scripts": {"dev": "vite","build": "vue-tsc -b && vite build","preview": "vite preview"},"peerDependencies": { // -- 我们可以该库需要依赖的,放到 peerDependencies 配置项中(用于提示用户与再npm中会有对应的显示)"vue": "^3.5.12"},"devDependencies": {"@vitejs/plugin-vue": "^5.1.4","typescript": "~5.6.2","vite": "^5.4.10","vite-plugin-libcss": "^1.1.1","vue-tsc": "^2.1.8","@types/node": "^22.9.0","vite-plugin-dts": "^4.3.0"}
    }
    

12. 最后,我们只需要再命令行中执行对应的命令进行发布即可 - tip: 需要有对应的 npm 账号 & 在下面命令操作时,有时候经常会因为网络问题登录或发布失败,可以多尝试几遍

  • 🔺在执行下面的命令前,先提几个注意的点:

    • (1) npm 的源必须为官方源,如果先前切换成淘宝的源或其它的源后,需要先将 npm 切换会原来的官方源

      • npm config set registry https://registry.npmjs.org/
        
    • (2) 在登录会发布过程中,因为 npm 源是国外的,所以可能会经常存在登录失败或上传失败的问题,可能是网络的问题,可以多尝试几遍

    • (3) 当包重名时也会上传失败,所以出错时可以留意一下对应的信息(如下错误示例 ↓)

      • 在这里插入图片描述
  • 1.需要在命令行中通过 "npm login" 命令来登录 npm

    • 在这里插入图片描述
  • 2. 登录成功后,在通过 "npm publish" 命令来进行上传即可

    • 在这里插入图片描述

    • 此时,该包我们就成功发布到 npm 中了 - tip: 需要注意包重名的问题,在上面的注意示例中有图例

13. 此时我们就可以通过 npm 来下载并使用我们的组件库了,下面就为一个基本的使用示例(可跳过不看,因为不是重点) - tip: 此测试库我后续会删除,这里只是演示与测试是否能够正常工作

  • 安装: npm i lib-test-kxh

  • 再 App.vue 中引入并使用

    • <script setup lang="ts">
      import { HButtom } from "lib-test-kxh"</script><template><h1>App</h1><hr><HButtom title="小孔" />
      </template>
      
    • 在这里插入图片描述

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

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

相关文章

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS&#xff08;读取时间戳计数器&#xff09;指令是 x86/x86_64 架构中的…

正则表达式(补充)

定义一个正则表达式 const 变量名 /表达式/ const reg /前端/ 匹配看字符串中有无前端俩字 正则对象上的一些方法 test() 用于查看正则表达式与指定的字符串是否匹配 const reg /前端/ const res reg.test(学前端&#xff0c;找黑马) //匹配到返回true,匹配不到返回fa…

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)

目录 1 -> epoll的工作方式 1.1 -> 水平触发(Level Triggered)工作模式 1.2 -> 边缘触发(Edge Triggered)工作模式 2 -> 对比LT与ET 3 -> 理解ET模式和非阻塞文件描述符 4 -> epoll的使用场景 5 -> epoll示例 5.1 -> epoll服务器(LT模式) 5.2…

响应“一机两用”政策 落实政务外网安全

在数字化时代&#xff0c;政务办公外网安全的重要性日益凸显&#xff0c;特别是在“一机两用”的背景下&#xff0c;即同一台终端既要处理政务内网的数据&#xff0c;又要访问互联网&#xff0c;这对网络安全提出了更高的要求。深信达SPN安全上网方案&#xff0c;即反向沙箱技术…

计算机网络基础——针对实习面试

目录 计算机网络基础OSI七层模型TCP/IP四层模型为什么网络要分层&#xff1f;常见网络协议 计算机网络基础 OSI七层模型 开放系统互连参考模型&#xff08;Open Systems Interconnection Reference Model&#xff0c;简称OSI模型&#xff09;是一个概念性模型&#xff0c;用于…

leetcode100:相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建…

如何在jupyter notebook切换python环境

目录 参考链接 首先确保conda已经正常安装 conda --version 或者conda -V 以下请将“myenv”替换成自己的命名&#xff01;&#xff01;&#xff01; 1-查看虚拟环境目录 conda env list 2-创建虚拟环境命令 conda create -n myenv 或者 conda create --name myenv 3-激活虚拟环…

【嵌入式软件-STM32】OLED显示屏+调试方法

目录 一、调试方式 1&#xff09;串口调试 优势 弊端 2&#xff09;显示屏调试 优势 弊端 3&#xff09;Keil调试模式 4&#xff09;点灯调试法 5&#xff09;注释调试法 6&#xff09;对照法 二、OLED简介 OLED组件 OLED显示屏 0.96寸OLED模块 OLED外观和种类…

求字符 ‘a‘ 和 ‘b‘ 组成的,最大长度为n的字符串中字典序第 k 个字符串

求字符 ‘a’ 和 ‘b’ 组成的&#xff0c;最大长度为n的字符串中字典序第 k 个字符串 先来解释一下这个题目&#xff0c;假设最大长度为3&#xff0c;那么由字符a和b组成的字符串有&#xff1a; a, b, ab, aaa, aba...把这些字符串按照字典序排序: aaaaaaaabababaabbbbabaab…

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

如何保证MySQL与Redis缓存的数据一致性?

文章目录 一、引言二、场景来源三、高并发解决方案1. 先更新缓存&#xff0c;再更新数据库2. 先更新数据库&#xff0c;再更新缓存3. 先删除缓存&#xff0c;再更新数据库4. 先更新数据库&#xff0c;再删除缓存小结 四、拓展方案1. 分布式锁与分布式事务2. 消息队列3. 监听bin…

暴露IP地址会影响网络隐私安全吗?

​我的IP地址暴露后会影响隐私安全吗&#xff1f; 互联网飞速发展以来&#xff0c;短短数十年&#xff0c;我们的工作生活就不能够离开互联网。那么作为网络连接传递数据的门户——IP地址&#xff0c;大家都有一定的疑惑和好奇。其中关于自身安全的尤为重要&#xff0c;所以IP…

通过 SSH 隧道将本地端口转发到远程主机

由于服务器防火墙,只开放了22端口,想要通过5901访问服务器上的远程桌面,可以通过下面的方式进行隧道转发。 一、示例命令 这条代码的作用是通过 SSH 创建一个 本地端口转发,将你本地的端口(5901)通过加密的 SSH 隧道连接到远程服务器上的端口(5901)。这种方式通常用于在…

CTF攻防世界小白刷题自学笔记14

fileclude&#xff0c;难度&#xff1a;1&#xff0c;方向&#xff1a;Web 题目来源:CTF 题目描述:好多file呀&#xff01; 给一下题目链接&#xff1a;攻防世界Web方向新手模式第17题。 打开一看&#xff0c;这熟悉的味道&#xff0c;跟上一篇文章基本一摸一样的&#xff…

微信小程序开发,仿小红书瀑布流实现

文章目录 1. 涉及到的知识点2. 功能描述3. 通用属性3. 代码实现过程4. 报错问题&#xff0c;解决方法5. 运行效果图 1. 涉及到的知识点 grid-view的使用官方文档指南&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/grid-view.html 2. 功能描述 Sk…

ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;“魅力”繁峙宣传网站系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了“魅力”繁峙宣传网站系统的发展&#x…

基于Matlab的碎纸片的自动拼接复原技术

碎纸片的自动拼接复原技术 摘要&#xff1a;破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。目前发现对碎纸片的拼接大部分由人工完成&#xff0c;准确率较高&#xff0c;但耗费大量人力财力及时间&#xff0c;效率很低。随着计算机技术的…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…