monorepo抽离shadcn和tailwind

news/2025/11/6 13:07:55/文章来源:https://www.cnblogs.com/dingshaohua/p/19196263

最小可shadcn可初始化环境

一般我们会将shadcn集成到现有的前端框架项目中,比如vite、nextjs等等。
但是如果我们要把shadcn抽离出来,成为一个单独的组件库项目,供多个项目使用,那么我们就要创建一个最小可运行的环境,来支持shadcn初始化以及后续的组件安装。

我们在执行pnpm dlx shadcn init的时候,会进行一些检查,如果不符合要求,是不能进行初始化的,通过执行pnpm dlx shadcn init,如果出现下面的提示,则说明我们当前的环境是符合shadcn初始化要求的。

✔ Preflight checks.
✔ Verifying framework. Found Vite.
✔ Validating Tailwind CSS config. Found v4.
✔ Validating import alias.

Preflight checks

预检检查,会检查项目中是否已经被初始化过。
这个不重要!

Verifying framework

验证框架,会检查项目中是否使用了vite、nextjs等框架。
所以我们只需要在项目中新建一个空的vite.config.js文件即可,这样shadcn就会识别为vite项目了。

Validating Tailwind CSS config

验证tailwindcss配置,会检查项目中是否已经安装了tailwindcss,并且在项目中存在任意一css文件且有@import "tailwindcss";,比如我们可以

|--src|--base-styles.css

Validating import alias

验证导入别名,会检查项目中是否已经配置了导入别名。
需要我们创建一个最小的tsconfig.json文件,内容如下:

{"compilerOptions": {"paths": {// @repo/shadcn-cmpnts为项目的包名,即package.json的name属性,如果非多仓,则@直接对应root即可"@repo/shadcn-cmpnts/*": ["./src/*"]}}
}

这会决定一会初始化shadcn时候期生成配置文件components.json中aliases的值。
而配置文件components.json中aliases的值又会决定组件下载路径。

验证

现在你已经配置好所有的shadcn可具备初始化的环境了。我们立刻pnpm dlx shadcn init进行shadcn初始化吧,
它会在你配置的tsconfig.jsonpaths中新建一个@repo/xxx/*的别名对应的目录下:

  • 新建一个components目录,用于存放组件。
  • 新建一个lib目录,用于存放工具函数,比如utils.ts。

最后你可以pnpm dlx shadcn add button来安装一个组件了。

对了,我们现在可以将 vite.config.js删除了,毕竟他只是为了让shadcn初始化的时候识别框架类型而已!

优化(可选)

实际上,在安装完毕后你还可以将 tailwindcss 卸载,然后创建一个 tailwind-config的单仓,将刚生成的components.json里的 css配置 改为向tailwind-config单仓索取

shadcn-cmpnts>components.json

{{//..."tailwind": {// ..."css": "@repo/tailwind-config",},}
}

这样以来,我们的的shadcn组件仓@repo/shadcn-cmpnts将变的更为干净,不再包含tailwind相关内容,请看下面谈 如何抽离tailwind!

抽离tailwind

因为多个仓库可能都会用到tailwind,所以我们可以将tailwind抽离出来,成为一个单独的仓库,供多个仓库使用。
我们初始化一个仓库,包名改为@repo/tailwind-config,然后安装 tailwind依赖!

@repo/shadcn-cmpnts中的初始化后的xxx.css(即包含@import "tailwindcss";的那个css文件)拷贝到@repo/tailwind-config中,并加上如下代码

/* 只要你在任意一个会被 Tailwind 扫描到的 CSS 文件里写了 @source,它就把这些路径追加到扫描列表,效果与在被v4抛弃的 tailwind.config.ts 里写 content 完全等价。 */
@source "../**/*.{ts,tsx}";
@source "../../../../apps/**/*.{ts,tsx}";
@source "../../../../packages/**/*.{ts,tsx}";

最后导出!

{"name": "@repo/tailwind-config","version": "0.0.0","type": "module","private": true,"exports": {".": "./base-styles.css","./postcss": "./postcss.config.js" //可选},"devDependencies": {"postcss": "^8.5.6", //可选"tailwindcss": "^4.1.16"}
}

这样我们在其它仓库包中,就可以直接使用了:
比如@repo/web中,可以直接导入到此项目的style.css中,而不要在安装tailwindcss包了(但是如果@tailwindcss/vite还是要用的)

@import "@repo/tailwind-config";

在tailwind中,也可以直接给shadcn指定改依赖的css,而不要在安装tailwindcss包了

"tailwind": {// ..."css": "@repo/tailwind-config",
},

其它补充

@import "tailwindcss"

🚨 魔法语句,不是文件路径,
这并非导入tailwindcss这个style文件(实际上也没有这个文件)

@import "tailwindcss"; 只是 “按下开关”——
它让 Vite 去调 @tailwindcss/vite 里预先注册好的 虚拟模块
于是插件开始 扫描 → 交给 Tailwind 核心 → 生成一段 CSS → 塞回页面

这条语句本身不拉文件、也不含样式
纯粹是 “嘿,Tailwind,可以开工了” 的触发口令。

这是让大部分人误解的地方:

看到@import "tailwindcss"就是觉得,这不就是导入了tailwindcss预设了的一堆样式字典嘛,就跟bootstrap或者layui一样!这就给我造成困惑 那@tailwindcss/vite干啥的,而且为啥每次看head中关于tailwindcss的样式集合预设还不一样?

@source

这个是取代v3版本,tailwind-config的content字段的,用来标记tailwind的扫描范围的(默认情况下哎之扫描当前项目,如果是多仓库那子项目中的tailwind部分就不会被扫描到。旦“被 Tailwind 扫描到”就会被tailwind构建(一些tailwind专属语法比如 @theme @apply 等)输出和生效了。

需要注意的是哪怕你当前项目的css文件显示@import了其它模块里的含tailwind语法的css文件,但是只要此css文件没有被当前项目扫描到,那么其中的tailwind语法是不会被tailwind构建输出的。必须显式的指定扫描到子项目!

/* shared-styles.css */
.some-component {@apply bg-blue-500 p-4;  /* 这里的 @apply 需要被扫描到才会生效 */
}/* main.css */
@import "./shared-styles.css";  /* ❌ 这样不会让 Tailwind 扫描 shared-styles.css */
@import "tailwindcss";/* 必须在 @source 中显式包含 */
@source "./shared-styles.css";  /* ✅ 这样才会扫描其中的 Tailwind 语法 */

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

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

相关文章

OpenCSG发布最新白皮书!《AgenticOps:重塑企业 AI 生产力的下一代范式》

内容概要 在AI技术飞速发展的今天,企业正面临着从技术突破到行业应用的转型挑战。为此,OpenCSG发布了最新的白皮书,深入剖析了AI产业化的核心挑战与解决方案,并介绍了其革命性的AgenticOps方法论,助力企业实现AI的…

个人微信API开发优选方案:WTAPI框架微信自动化管理

个人微信API开发优选方案:WTAPI框架微信自动化管理 在微信深度渗透社交与商业场景的今天,个人微信号已成为企业客户运营、用户触达的核心载体。开发个人微信营销系统、自定义机器人、智能客服及群数据分析工具等需求…

企业数字化转型几点洞察

企业数字化转型几点洞察背景解决数据孤岛洞察一:这不是IT部门的项目,而是“一把手工程” 一个普遍的误区是将数字化转型视为技术升级,然后将其完全委托给IT部门。然而,所有成功的转型案例都指向一个共同点:…

【config】:google-chrome之配置搜索引擎

【config】:google-chrome之配置搜索引擎【config】:google-chrome之配置搜索引擎一、基础说明1.  在【google-chrome浏览器中】,添加、设置默认的搜索引擎;替换浏览器默认的【谷歌搜索引擎】。二、配置参数1. …

NET8 windows下 发布web.config配置

NET8 windows下 发布web.config配置 <?xml version="1.0" encoding="utf-8"?> <configuration><system.webServer><handlers><add name="aspNetCore" pat…

基于WTAPI框架的个人号二次开发、微信智能管理系统构建

基于WTAPI框架的个人号二次开发、微信智能管理系统构建 在微信深度渗透社交与商业场景的今天,个人微信号已成为企业客户运营、用户触达的核心载体。传统手动操作效率低、功能受限,而WTAPI框架作为专注微信个人号二次…

CSP 2025 GD 迷惑行为大赏

统计 CSP-J 共有 \(4047\) 个文件夹,CSP-S 共有 $$

可视化结构域序列并提取序列

1、可视化点击查看代码 from Bio import AlignIO import os# ====== 用户参数 ====== alignment_file = "比对.fa" # 输入比对文件(fasta/clustal) alignment_format = "fasta" html_output …

2025年11月国际连锁酒店投资加盟推荐:专业评价与选择指南

随着酒店行业逐渐复苏,越来越多的投资者将目光投向国际连锁酒店加盟领域。这类投资者通常具备一定的资金实力,希望通过加盟成熟品牌降低经营风险,同时获得稳定的投资回报。他们可能是首次进入酒店行业的创业者,也可…

vue 安装后端调试接口 - 东方不败-

vue2 安装低版本的:npm install -g json-server@0.17.4

动态规划经典题

动态规划专题动态规划专题基础入门系列经典习题509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯 62.不同路径 63.不同路径II 343.整数拆分 96.不同的二叉搜索树背包问题系列01背包问题416.分割等和子集 1049.最后一块…

2025年11月国际连锁酒店投资加盟推荐榜:五大品牌综合对比分析

对于有意向投资国际连锁酒店的投资者而言,选择正确的加盟品牌是决定项目成败的关键一步。这类投资者通常具备一定的资金实力,寻求稳健且可持续的投资回报,他们可能是经验丰富的酒店业者,希望借助国际品牌提升竞争力…

2025年11月连锁酒店加盟品牌推荐榜单:权威解析五大品牌投资价值对比

作为酒店行业的投资者,您可能正在寻找一个具备稳定回报和成熟运营体系的连锁酒店加盟品牌。随着国内商旅市场持续复苏,中端酒店市场呈现出较高的增长潜力,但面对众多品牌选择,投资者常面临品牌辨识度不足、投资回报…

sql 常用命令

1、mysql 服务的启动和停止 net stop mysql net start mysql 2、登录mysql mysql (-h IP)-u 用户名 -p 密码 3、grant 权限 on 数据库. to 用户名@登录主机 identified by "密码"* 例:增加一个用户user密…

今日依旧是java的基础知识内容

java基础知识内容 java的优势与特点简单性 面向对象 多线程 分布式 可移植性 高性能 安全性 健壮性 动态性java为什么能成功与时代契合 踩上了时代的洪流 满足了人们的需求 优势与特点无法替代java三大版本JavaME(嵌入…

基于Java+SSM+Flask网上授课体系(源码+LW+调试文档+讲解等)/在线教育平台/网络教学软件/远程授课器具/在线课程系统/网课平台/视频教学系统/网上教学平台/网络教育系统

基于Java+SSM+Flask网上授课体系(源码+LW+调试文档+讲解等)/在线教育平台/网络教学软件/远程授课器具/在线课程系统/网课平台/视频教学系统/网上教学平台/网络教育系统pre { white-space: pre !important; word-wrap: …

今天依旧是基础知识内容

java基础知识内容 java的优势与特点简单性 面向对象 多线程 分布式 可移植性 高性能 安全性 健壮性 动态性java为什么能成功与时代契合 踩上了时代的洪流 满足了人们的需求 优势与特点无法替代java三大版本JavaME(嵌入…

2025年11月AI智能客服机器人品牌对比榜:五强资质认证与服务范围全梳理

2025年11月,企业正在把“降本增效”从口号变成可量化的KPI,客服中心首当其冲。电销线索转化率下滑、人工座席流失率居高不下、夜间咨询无人响应,这些痛点让“AI智能客服机器人”成为采购清单上的高频关键词。用户场…

pytorch汉字识别.

import os import random import numpy as np import matplotlib.pyplot as plt from PIL import Image, ImageDraw, ImageFont import torch import torch.nn as nn import torch.optim as optim from torch.utils.da…