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…

linux怎么查看网络带宽命令

说明: 1、研发反馈访问中间件有时候很慢,查看zabbix监控,发现带宽很高 2、但不知道具体什么应用业务访问导致,所以要用查看带宽命令获取实时数据 要查看带宽使用情况,具体取决于您的操作系统和可用的工具,以下是一些常用的命令: Windows: 使用 netstat -e 命令查看网络接…

视频编码基础入门

文章目录 前言一、视频编码的目标二、 视频编码基本流程1. 采样与颜色空间转换2. 变换编码&#xff08;例如DCT&#xff09;3. 量化4. 熵编码5. 运动补偿和帧间预测6. 编码输出 三、视频编码的关键技术1. 帧类型2. GOP&#xff08;Group of Pictures&#xff09;结构3. 比特率控…

CSS 语法规范

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

Rust 语言学习笔记(五)

终于来到了 Rust 的精髓所在了&#xff0c;那就是使之不依赖于垃圾回收又能保障内存安全且高效运行的所有权系统(Ownership System)。想要用 Rust 做一个稍显规模项目必定绕不过它&#xff0c;所有权系统包括所有权(Ownership), 借用(Borrowing), 生命周期(Lifetimes)。 以下概…

【在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…

计算机视觉 ---常见图像文件格式及其特点

常见的图像文件格式及其特点如下&#xff1a; JPEG&#xff08;Joint Photographic Experts Group&#xff09; 特点&#xff1a; 有损压缩&#xff1a;通过丢弃一些图像数据来实现高压缩比&#xff0c;能显著减小文件大小&#xff0c;适合用于存储照片等色彩丰富的图像。但过…

Vue3 动态获取 assets 文件夹图片

我真服了Vue3 这个老六了,一个简单图片src 赋值搞得那么复杂. //item.type 是我遍历类型的类型参数 <img alt"吐槽大会" :src"getAssetUrl(item.type)" /> 基于 Vue2 的Webpack 处理,还不错,可以用/ 这种绝对路径,可以接受,虽然多了个require很不爽…

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

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

MySQL详解之DDL(数据定义语言)

引言 在关系型数据库的管理与操作中&#xff0c;DDL&#xff08;数据定义语言&#xff09;是一个至关重要的组成部分。它允许我们创建、修改和删除数据库的结构&#xff0c;包括数据库、表、视图等对象。对于新手来说&#xff0c;理解DDL的基本概念与常用命令&#xff0c;可以…

【MYSQL】数据库三大范式是什么?【最简单理解】

这些依赖都是按道理来说的&#xff0c;比如地址可以拆成国、省、市、区。 第一范式 数据表中拿到字段存储的数据不可再拆分&#xff0c;比如地址是国、省、市、区&#xff0c;必须拆封开&#xff0c;不能一股脑全写到一个字段中。 第二范式 数据表中在满足第一范式的情况下&…

Vue监视属性变化watch

在 Vue.js 中&#xff0c;watch 选项用于观察 Vue 实例的数据变化&#xff0c;并在数据变化时执行相应的回调函数。它特别适用于你需要在数据变化时执行异步或开销较大的操作的场景。watch 可以监听数据属性、计算属性的变化&#xff0c;也可以对深层嵌套的数据进行监听。 基本…

gitlab角色、权限

GitLab是一个基于Web的Git仓库管理工具&#xff0c;它提供了一套完整的角色和权限管理机制&#xff0c;以控制用户对项目和仓库的访问和操作权限。以下是GitLab中不同角色的基本权限概述&#xff1a; 访客&#xff08;Guest&#xff09;&#xff1a; 可以查看项目中的公开信息。…

基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现)

基于机器学习电信号EMG训练分类模型控制仿生手控制系统&#xff08;Matlab-Simulink实现&#xff09; 引言 随着生物医学工程和机器学习技术的发展&#xff0c;仿生手控制系统的研发取得了显著进展。本文将介绍如何利用机器学习方法&#xff0c;通过肌电图&#xff08;Electr…

https://localhost/index 配置的nginx,一刷新就报404了

当你的Nginx配置导致页面刷新时报404错误时&#xff0c;通常是由于以下几个原因造成的&#xff1a; 静态文件路径配置错误&#xff1a;Nginx没有正确地指向静态文件的目录。前端路由问题&#xff1a;如果是SPA&#xff08;单页应用&#xff09;&#xff0c;刷新页面时Nginx没有…

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

目录 计算机网络基础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-激活虚拟环…