Monorepo
在 monorepo 中使用 shadcn/ui 组件和 CLI。
到目前为止,在 monorepo 中使用 shadcn/ui 有些麻烦。你可以使用 CLI 添加组件,但必须管理组件的安装位置,并手动修复导入路径。
借助 CLI 中的新 monorepo 支持,我们简化了在 monorepo 中使用 shadcn/ui 的流程。
CLI 现在可以理解 monorepo 结构,并会将组件、依赖项和注册依赖项安装到正确的路径,并为你处理导入。
开始使用
创建一个新的 monorepo 项目
要创建一个新的 monorepo 项目,请运行 init
命令。系统会提示你选择要创建的项目类型。
pnpm dlx shadcn@canary init
选择 Next.js (Monorepo)
选项。
? Would you like to start a new project?
Next.js
❯ Next.js (Monorepo)
这将创建一个新的 monorepo 项目,包含两个工作区:web
和 ui
,并将 Turborepo 作为构建系统。
一切都为你设置好了,你可以开始向项目中添加组件。
注意:monorepo 使用 React 19 和 Tailwind CSS v4。
向项目中添加组件
要向项目中添加组件,请在 你的应用路径 中运行 add
命令。
cd apps/web
pnpm dlx shadcn@canary add [COMPONENT]
CLI 会弄清你正在添加什么类型的组件,并将正确的文件安装到正确的路径。
例如,如果你运行 npx shadcn@canary add button
,CLI 将在 packages/ui
下安装按钮组件,并更新 apps/web
中组件的导入路径。
如果你运行 npx shadcn@canary add login-01
,CLI 将在 packages/ui
下安装 button
、label
、input
和 card
组件,并在 apps/web/components
下安装 login-form
组件。
导入组件
你可以按如下方式从 @workspace/ui
包导入组件:
import { Button } from "@workspace/ui/components/button"
你也可以从 @workspace/ui
包导入钩子和工具。
import { useTheme } from "@workspace/ui/hooks/use-theme"
import { cn } from "@workspace/ui/lib/utils"
文件结构
当你创建一个新的 monorepo 项目时,CLI 会创建以下文件结构:
apps
└── web # 你的应用放在这里。
├── app
│ └── page.tsx
├── components
│ └── login-form.tsx
├── components.json
└── package.json
packages
└── ui # 你的组件和依赖项安装在这里。
├── src
│ ├── components
│ │ └── button.tsx
│ ├── hooks
│ ├── lib
│ │ └── utils.ts
│ └── styles
│ └── globals.css
├── components.json
└── package.json
package.json
turbo.json
要求
-
每个工作区必须有一个
components.json
文件。package.json
文件告诉 npm 如何安装依赖项。components.json
文件告诉 CLI 如何以及在哪里安装组件。 -
components.json
文件必须正确地定义工作区的别名。这告诉 CLI 如何导入组件、钩子、工具等。
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "../../packages/ui/src/styles/globals.css",
"baseColor": "zinc",
"cssVariables": true
},
"iconLibrary": "lucide",
"aliases": {
"components": "@/components",
"hooks": "@/hooks",
"lib": "@/lib",
"utils": "@workspace/ui/lib/utils",
"ui": "@workspace/ui/components"
}
}
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles/globals.css",
"baseColor": "zinc",
"cssVariables": true
},
"iconLibrary": "lucide",
"aliases": {
"components": "@workspace/ui/components",
"utils": "@workspace/ui/lib/utils",
"hooks": "@workspace/ui/hooks",
"lib": "@workspace/ui/lib",
"ui": "@workspace/ui/components"
}
}
-
确保两个
components.json
文件中具有相同的style
、iconLibrary
和baseColor
。 -
对于 Tailwind CSS v4,将
components.json
文件中的tailwind
配置留空。
遵循这些要求后,CLI 将能够将 UI 组件、区块、库和钩子安装到正确的路径并为你处理导入。