到目前为止,在 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 将把 button
、label
、input
和 card
组件安装到 packages/ui
下,并将 login-form
组件安装到 apps/web/components
下。
导入组件
你可以从 @workspace/ui
包导入组件,如下所示
import { Button } from "@workspace/ui/components/button"
你还可以从 @workspace/ui
包导入 hook 和实用工具。
import { useTheme } from "@workspace/ui/hooks/use-theme"
import { cn } from "@workspace/ui/lib/utils"
文件结构
当你创建新的 Monorepo 项目时,CLI 将创建以下文件结构
apps
└── web # Your app goes here.
├── app
│ └── page.tsx
├── components
│ └── login-form.tsx
├── components.json
└── package.json
packages
└── ui # Your components and dependencies are installed here.
├── 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 如何导入组件、hook、实用工具等。
{
"$schema": "https://ui.shadcn.org.cn/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.org.cn/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 组件、区块、库和 hook 安装到正确的路径,并为你处理导入。