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>
      
    • 在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释&#xff1a; Kubernetes&#xff08;也被称为 K8s&#xff09;就像是一个大管家&#xff0c;帮你管理你的云计算服务。想象一下&#xff0c;你有很多个小程序&#xff08;我们称之为“容器”&#xff09;&#xff0c;每个都在做不同的事情&…

UniApp的Vue3版本中H5配置代理的最佳方法

UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404&#xff0c;无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…

Android OpenGL ES详解——实例化

目录 一、实例化 1、背景 2、概念 实例化、实例数量 gl_InstanceID 应用举例 二、实例化数组 1、概念 2、应用举例 三、应用举例——小行星带 1、不使用实例化 2、使用实例化 四、总结 一、实例化 1、背景 假如你有一个有许多模型的场景&#xff0c;而这些模型的…

2024数维杯问题C:脉冲星定时噪声推断和大气时间信号的时间延迟推断的建模完整思路 模型 代码结果

&#xff08;Modeling of pulsar timing noise deduction and atmospheric time delay deduction of time signals&#xff09; 脉冲星是一种连续而稳定的快速旋转的中子星&#xff0c;为它们赢得了“宇宙的李温室”的绰号。脉冲星的空间观测对深空航天器的导航和时间标准的维…

Shell基础2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

基于微信小程序的校园超市购物系统设计与实现,LW+源码+讲解

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本超市购物系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

【golang-技巧】-线上死锁问题排查-by pprof

1.背景 由于目前项目使用 cgo golang 本地不能debug, 发生死锁问题&#xff0c;程序运行和期待不一致&#xff0c;通过日志排查可以大概率找到 阻塞范围&#xff0c;但是不能找到具体问题在哪里&#xff0c;同时服务器 通过k8s daemonset 部署没有更好的方式暴露端口 获取ppr…

【Visual Studio】设置文件目录

打开属性 输出目录&#xff1a;$(SolutionDir)bin\$(Platform)\$(Cinfiguration)\ 中间目录&#xff1a;$(SolutionDir)bin\intermediates\$(Platform)\$(Cinfiguration)\

智谱AI清影升级:引领AI视频进入音效新时代

前几天智谱推出了新清影,该版本支持4k、60帧超高清画质、任意尺寸&#xff0c;并且自带音效的10秒视频,让ai生视频告别了"哑巴时代"。 智谱AI视频腾空出世&#xff0c;可灵遭遇强劲挑战&#xff01;究竟谁是行业翘楚&#xff1f;(附测评案例)之前智谱出世那时体验了一…

Datawhale模型压缩技术Task2之模型剪枝

模型剪枝 模型剪枝介绍何为剪枝&#xff08;What is Pruning?&#xff09;剪枝类型非结构化剪枝结构化剪枝半结构化剪枝 剪枝范围局部剪枝全局剪枝 剪枝粒度细粒度剪枝基于模式的剪枝向量级剪枝内核级剪枝通道级剪枝 为何剪枝&#xff08;Why Pruning?&#xff09;剪枝标准&a…

雨晨 Fix 24H2 Windows 11 iot 企业版 ltsc 2024 极简 2合1 26100.2448

映像的详细信息: 雨晨 Fix 24H2 Windows 11 iot 企业版 ltsc 2024 极简 2合1 26100.2448 索引: 1 名称: Windows 11 IoT 企业版 LTSC 2024 极简V1 26100.2448 (传统legacy资源管理器) 描述: Windows 11 IoT 企业版 LTSC 2024 极简V1 26100.2448 By YCDISM v2025 2024-11-15 大…

【Qt聊天室】客户端实现总结

目录 1. 项目概述 2. 功能实现 2.1 主窗口设计 2.2 功能性窗口 2.3 主界面功能实现 2.4 聊天界面功能实现 2.5 个人信息功能开发 2.6 用户信息界面设置功能 2.7 单聊与群聊 2.8 登录窗口 2.9 消息功能 3. 核心设计逻辑 3.1 核心类 3.2 前后端交互与DataCenter 4…

3、.Net UI库:CSharpSkin - 开源项目研究文章

CSharpSkin(C# 皮肤)是一个基于C#语言开发的UI框架&#xff0c;它允许开发者使用C#和.NET技术栈来创建跨平台的桌面应用程序。CSharpSkin框架通常用于实现具有自定义外观和感觉的应用程序界面&#xff0c;它提供了一套丰富的控件和组件&#xff0c;以及灵活的样式和布局系统。 …

JUC包中常用类解析

目录 &#xff08;一&#xff09;Callable接口 &#xff08;1&#xff09;Callable与Runnable的区别 &#xff08;2&#xff09;Future接口 2.1Futrue接口中的方法 2.2FutureTask类 &#xff08;3&#xff09;Callable接口的使用 3.1借助FutureTask运行 3.2借助线程池运…

交友问题 | 动态规划

描述 如果有n个人&#xff0c;每个人都可以保持单身或与其他人结成一对。每个人只能找一个对象。求总共有多少种保持单身或结对的方式。用动态规划求解。 输入 输入第一行t表示测试用例的数量 对于每一个测试用例, 输入一个整数n表示人数1<n<18 输出 针对每个测试用…

【WPF】Prism库学习(一)

Prism介绍 1. Prism框架概述&#xff1a; Prism是一个用于构建松耦合、可维护和可测试的XAML应用程序的框架。它支持WPF、.NET MAUI、Uno Platform和Xamarin Forms等多个平台。对于每个平台&#xff0c;Prism都有单独的发布版本&#xff0c;并且它们在不同的时间线上独立开发。…

基于Java Springboot在线音乐试听交流网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff…

# 第20章 Cortex-M4-触摸屏

第20章 Cortex-M4-触摸屏 20.1 触摸屏概述 20.1.1 常见的触摸屏分类 电阻式触摸屏、电容式触摸屏、红外式触摸屏、表面声波触摸屏 市场上用的最多的是电阻式触摸屏与电容式触摸屏。红外管式触摸屏多用于投影仪配套设备。 电阻式触摸屏构成&#xff1a;整个屏由均匀电阻构成…

《 C++ 修炼全景指南:二十 》不止是链表升级!跳表的核心原理与超强性能解析

摘要 这篇博客全面解析了跳表 (Skip List) 作为一种高效的链表数据结构的特性和应用。跳表以多层链表和随机化策略实现 O(log n) 的查找、插入和删除性能&#xff0c;简化了平衡树结构中常见的复杂旋转操作。通过剖析跳表的结构设计和核心操作&#xff0c;我们探讨了其在范围查…

【C++之STL】摸清 string 的模拟实现(上)

文章目录 1. 为什么要模拟实现&#xff1f;2. 基本框架搭建3. 构造函数3. 1 默认构造/from c_str3. 2 拷贝构造3. 2. 1 深浅拷贝 3. 3 fill3. 4 迭代器区间构造 4. 容量操作4. 1 size()和capacity()和empty()4. 2 clear()4. 3 resize()4. 4 reserve() 1. 为什么要模拟实现&…