vite+tailwind封装组件库
前言
演示视频
https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from=333.1387.homepage.video_card.click
参考
https://juejin.cn/post/7112295067682865166
https://juejin.cn/post/7046187185615142949
代码仓库
https://gitee.com/malguy/vite-components-lib-tutorial
初始化项目
创建vite
直接使用命令行
pnpm create vite react-components
cd react-components
pnpm i
你也可以用我的脚手架面板(推销一下😁🤓)
malred/cli-panel
无需联网, 因为是用文件复制的方法创建的
安装tailwind
使用tailwind v3
Installation - Tailwind CSS
pnpm install -D tailwindcss@3 postcss autoprefixer
# npx tailwindcss init -p
pnpm dlx tailwindcss@3 init -p
将路径添加到 **<font style="color:rgb(15, 23, 42);">tailwind.config.js</font>**
文件中的所有模板文件中。
/** @type {import('tailwindcss').Config} */
export default {content: ["./index.html",// 使用react时"./src/**/*.{js,ts,jsx,tsx}",// 使用vue时"./src/**/*.{vue,js,ts,jsx,tsx}",// 使用svelte时"./src/**/*.{svelte,js,ts,jsx,tsx}",],theme: {extend: {},},plugins: [],
}
将Tailwind每个层的 **<font style="color:rgb(15, 23, 42);">@tailwind</font>**
指令添加到您的 **<font style="color:rgb(15, 23, 42);">./src/app.css</font>**
文件中。
@tailwind base;
@tailwind components;
@tailwind utilities;
写一个button组件
src/components/Button/Button.jsx
// src/components/button/index.tsx
/** @Author WangZhiGang* @Date 2025-06-07 05:58:37* @Description */
import './button.css'import * as React from "react";interface Props {size: 'lg' | 'md' | 'sm'children: string | React.ReactNode
}const Button = ({size, children}: Props) => {const className = size + " base "return (<buttonclassName={className}>{children}</button>);
};export default Button;
如果觉得tailwind样式太长, 可以写一个css
button {&.base {@apply text-white bg-blue-500 rounded-md}&.sm {@apply text-xs p-2}&.md {@apply text-sm p-4}&.lg {@apply text-lg p-8}
}
在index.js中导出
// !!! 重要 包含@tailwind的css必须导出, 否则新项目会丢失变量 !!!
import './index.css'
import './App.css'import Button from "./components/button/index.jsx";export {Button as MalButton
}
修改vite配置文件
import {defineConfig} from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
// const path = require("path");const resolvePath = (str) => path.resolve(__dirname, str);// https://vitejs.dev/config/
export default defineConfig({plugins: [react()],// 防止 vite 将 rgba() 颜色转化为 #RGBA 十六进制cssTarget: 'chrome61',resolve: {alias: {"@": path.resolve(__dirname, "./src"),},},// 打包编译配置build: {rollupOptions: {// 请确保外部化那些你的库中不需要的依赖external: ["react", "react-dom"],output: {// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量globals: {react: "react","react-dom": "react-dom",},},},lib: {// 打包入口文件, 使用时从入口进行寻找依赖entry: resolvePath("src/index.js"),name: "mal-react-components",// 打包后文件名 format表示不同的规范(commonjs之类的) // 如果打包成 UMD 格式,文件名可能是 mal-vue3-components.umd.js。// 如果打包成 ES Module 格式,文件名可能是 mal-vue3-components.es.jsfileName: format => `mal-react-components.${format}.js`,},}
})
import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
// import tailwindcss from 'tailwindcss';// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],// css: {// postcss: {// plugins: [tailwindcss],// }// },// 打包编译配置build: {rollupOptions: {// 请确保外部化那些你的库中不需要的依赖external: ['vue'],output: {// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量globals: {vue: 'Vue',},},},lib: {// 打包入口文件, 使用时从入口进行寻找依赖entry: './src/index.js',// 名称name: 'mal-vue-components',// 打包后文件名 format表示不同的规范(commonjs之类的) // 如果打包成 UMD 格式,文件名可能是 mal-vue3-components.umd.js。// 如果打包成 ES Module 格式,文件名可能是 mal-vue3-components.es.jsfileName: (format) => `mal-vue3-components.${format}.js`,},}
})
如果使用的是ts
pnpm i @rollup/plugin-typescript tslib
# 在vite.config文件里使用node的依赖需要安装
pnpm i @types/node --save-dev
import {defineConfig} from 'vite'
import react from '@vitejs/plugin-react'
import typescript from '@rollup/plugin-typescript'
// 想在ts使用node的依赖, 需要安装 @types/node
import { resolve } from "node:path";const resolvePath = (str: string) => resolve(__dirname, str);// https://vitejs.dev/config/
export default defineConfig({plugins: [react()],resolve: {alias: {"@": resolve(__dirname, "./src"),},},// 打包编译配置build: {rollupOptions: {// 请确保外部化那些你的库中不需要的依赖external: ["react", "react-dom"],output: {// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量globals: {react: "react","react-dom": "react-dom",},},plugins: [typescript({target: "es2015", // 这里指定编译到的版本,rootDir: resolvePath("src/"),declaration: true,declarationDir: resolvePath("dist"),exclude: resolvePath("node_modules/**"),allowSyntheticDefaultImports: true,}),],},lib: {// 打包入口文件, 使用时从入口进行寻找依赖entry: resolvePath("src/index.ts"),name: "mal-react-components",// 打包后文件名 format表示不同的规范(commonjs之类的)// 如果打包成 UMD 格式,文件名可能是 mal-vue3-components.umd.js。// 如果打包成 ES Module 格式,文件名可能是 mal-vue3-components.es.jsfileName: format => `mal-react-components.${format}.js`,},},
})
打包 发布
pnpm build
pnpm publish
使用
在本地想测试, 可以用
# 在库的目录执行
npm link
# 在要使用的目录中执行
npm link [自己写的库的名称]
但是我之前试了老是失败, 我的解决方法是直接复制打包后的文件到项目中, 然后从其中引入依赖
相关文章:

vite+tailwind封装组件库
前言 演示视频 https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from333.1387.homepage.video_card.click 参考 https://juejin.cn/post/7112295067682865166 https://juejin.cn/post/7046187185615142949 代码仓库 https://gitee.com/malguy/vite-components-li…...
Gin框架实战指南:从入门到进阶
Gin框架实战指南:从入门到进阶 在当今的后端开发领域,Gin框架以其高性能、简洁易用的特点,赢得了众多Go语言开发者的青睐。本文将带你深入探索Gin框架的方方面面,从基础的安装与使用,到响应处理、请求参数解析、中间件…...

【Java学习笔记】包装类
包装类(Wrapper) 1. 介绍 (1)针对八种基本数据类型相应的引用类型 --> 包装类 (2)有了类的特点,就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…...

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具
博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…...
QtDBus模块功能及架构解析
Qt 6.0 中的 QtDBus 模块是一个用于进程间通信(IPC)的核心模块,它基于 D-Bus 协议实现。D-Bus 是一种在 Linux 和其他类 Unix 系统上广泛使用的消息总线系统,允许应用程序和服务相互通信。 一、QtDBus模块主要功能: 1…...
光学字符识别(OCR)理论概述与实践教程
一、 光学字符识别(OCR)理论基础 OCR,即Optical Character Recognition,旨在通过计算机视觉和模式识别技术,将图像中包含的文本信息转换为机器可编辑、可搜索的文本数据。这项技术是实现信息数字化、自动化处理纸质或图像化文档的关键。 1. OCR处理管线 OCR系统通常采用…...
关键字--sizeof
sizeof 是 C 中的一个编译时运算符,用于获取一个类型或对象在内存中所占的字节数(单位:字节,byte)。 用法 获取类型的大小: std::cout << sizeof(int) << std::endl; // 输出int类型的字节数…...
Ubuntu20.04启动python的虚拟环境
如果你使用 mkvirtualenv 来创建虚拟环境,说明你已经安装了 virtualenvwrapper,这是一个用于管理 Python 虚拟环境的工具。 激活虚拟环境 要激活你使用 mkvirtualenv 创建的虚拟环境,按照以下步骤操作: 1.确保已经安装了 virtu…...
网页在线客服系统自动欢迎语实现方案(PHP+MySQL)
一、实现思路 在网页在线客服系统中实现自动欢迎语,主要需要以下几个步骤: 在数据库中存储欢迎语内容判断用户是否为首次访问或新会话在适当时机自动发送欢迎消息 演示网站:gofly.v1kf.com 二、数据库设计 首先需要扩展数据库结构:…...

UniRig:如何在矩池云一站式解决 3D 模型绑定难题
在 3D 动画制作中,绑定(Rigging)是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重,以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架,为这一难题提供了全新的解决方案。 什…...
用函数实现模块化程序设计(适合考研、专升本)
函数 定义:本质上是一段可以被连续调用、功能相对独立的程序段 c语言是通过“函数”实现模块化的。根据分类标准不同函数分为以下几类。 用户角度:库函数、自定义函数 函数形式:有参函数、无参函数 作用域:外部函数、内部函数 …...
玩转抖音矩阵:核心玩法与高效运营规则
一、 抖音矩阵:流量协同的生态网络 抖音矩阵,本质是运营一个相互关联、互相支持的抖音账号群。核心目标在于通过账号间的深度协同(内容、流量、粉丝),打破单个账号的流量天花板,实现11>2的效果。它不仅…...
spring:继承接口FactoryBean获取bean实例
spring框架提供接口FactoryBean获取bean实例。 实现步骤: 实现接口FactoryBean。 在xml文件中配置实现接口FactoryBean的类。 调用接口FactoryBean中方法getObject,获取bean实例。 实现接口类 package com.itheima.factory;import org.springframework…...

字符串字典序最大后缀问题详解
字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法:高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …...

VScode打开后一直显示正在重新激活终端 问题的解决方法
一、问题 本人打开“.py”文件后,同时会出现以下两个问题。 1、VScode一直循环在”正在重新激活终端“ 2、日志显示intellicode报错: Sorry, something went wrong activating IntelliCode support for Python. Please check the “Python” and “VS I…...

pe文件结构(TLS)
TLS 什么是TLS? TLS是 Thread Local Storage 的缩写,线程局部存储。主要是为了解决多线程中变量同步的问题 如果需要要一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量(被称为static memory local to a thread 线程局部静态变…...
二进制安全-OpenWrt-uBus
1 需求 需求:ubus list 需求:ubus -v list 需求:ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …...
分页查询的实现
第一步:导入pom依赖 <!--配置PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version><exclusions>…...

中型零售业数据库抉择:MySQL省成本,SQL SERVER?
针对中型零售企业(20台固定POS数十台移动POS,含库存管理与结算业务)的操作系统与数据库选型,需平衡性能、成本、扩展性及运维效率。结合行业实践与系统需求,建议如下: 🖥️ 一、操作系统选型…...
使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
iOS 应用上架流程对很多开发者来说都是一道复杂关卡,特别是当你并不使用 Mac 电脑时。虽然 Apple 一直强调使用其原生工具链(Xcode 和 Transporter),但现实是大量开发者正在寻找更灵活的替代方案。 今天我将从证书申请和 IPA 上传…...

IDEA中的debug使用技巧
详细教学视频见b站链接:IDEA的debug调试 CSDN详细博客文章链接:debug文章学习 以下为个人学习记录总结: idea中的debug模式界面如下: 现在详细介绍图标作用: 图标一(Show Execution Point)&…...

RockyLinux9.6搭建k8s集群
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
MS358A 低功耗运算放大器 车规
MS358A 低功耗运算放大器 车规 产品简述 MS358A 是双通道运算放大器,具有低功耗、宽电源电压范围、高单位增益带宽的特性。在特定情况下,压摆率可以达到0.4V/μs 。每个通道的静态电流 (5V) 只有 430μA 。 MS358A输入共模范围可以到地,同时…...

AI IDE 正式上线!通义灵码开箱即用
近期,通义灵码AI IDE正式上线,即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具,通义灵码AI IDE深度适配了最新的千问3大模型,并全面集成通义灵码插件能力,具备编程智能体、行间建议预测、行间…...
CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云
目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…...

Ubuntu20.04基础配置安装——系统安装(一)
引言: 工作需要,Ubuntu的各类环境配置,从23年开始使用Ubuntu20.04之后,尽管能力在不断提升,但是依旧会遇到Ubuntu系统崩掉的情况,为了方便后续系统出现问题及时替换,减少从网上搜索资源进行基础…...
ubuntu opencv 安装
1.ubuntu opencv 安装 在Ubuntu系统中安装OpenCV,可以通过多种方式进行,以下是一种常用的安装方法,包括从源代码编译安装。请注意,安装步骤可能会因OpenCV的版本和Ubuntu系统的具体版本而略有不同。 一、安装准备 更新系统&…...
使用Python和Flask构建简单的机器学习API
在机器学习项目中,将模型部署为一个Web API是一种常见的需求。这样可以方便地将模型集成到其他应用程序中,例如移动应用、Web应用或其他后端服务。Flask是一个轻量级的Python Web框架,非常适合用于构建简单的API。本文将通过一个具体的例子&a…...

Kafka入门-消费者
消费者 Kafka消费方式:采用pull(拉)的方式,消费者从broker中主动拉去数据。使用pull的好处就是消费者可以根据自身需求,进行拉取数据,但是坏处就是如果Kafka没有数据,那么消费者可能会陷入循环…...
[论文阅读] 人工智能 | 搜索增强LLMs的用户偏好与性能分析
【论文解读】Search Arena:搜索增强LLMs的用户偏好与性能分析 论文信息 作者: Mihran Miroyan, Tsung-Han Wu, Logan King等 标题: Search Arena: Analyzing Search-Augmented LLMs 来源: arXiv preprint arXiv:2506.05334v1, 2025 一、研究背景:…...