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
下安装 button 组件,并更新 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
包中导入 hooks 和 utilities。
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 如何导入组件、hooks、utilities 等。
{
"$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 组件、区块、libs 和 hooks 安装到正确的路径,并为你处理导入。