当前位置: 首页 > news >正文

Turborepo + Vite + Next.js + Shadcn Monorepo 项目构建

从零开始构建 Turborepo + Vite + Next.js + Shadcn 的 Monorepo 项目的完整流程。构建一个现代、高性能的 Web 系统,包含:

  • 多个前端应用(Next.js 和 Vite 都支持)
  • 可共享的 UI 组件库(使用 shadcn/ui)
  • 高效的构建与缓存支持(通过 Turborepo)
  • 使用 pnpm 管理依赖

🧱 最终结构预览

my-monorepo/
├── apps/
│   ├── web/         # Next.js 应用
│   └── docs/        # Vite 应用(文档或营销页)
├── packages/
│   └── ui/          # 共用 UI 组件库,shadcn/ui
├── turbo.json       # Turborepo 配置
├── pnpm-workspace.yaml
├── tsconfig.json
└── package.json     # 根目录 package.json

🛠️ 步骤一:初始化项目

mkdir my-monorepo && cd my-monorepo
pnpm init -y

安装必要的依赖:

pnpm add -D turbo typescript

创建 pnpm-workspace.yaml

# pnpm-workspace.yaml
packages:- apps/*- packages/*

✨ 步骤二:初始化 Turborepo 配置

创建 turbo.json

{"$schema": "https://turborepo.org/schema.json","pipeline": {"build": {"dependsOn": ["^build"],"outputs": [".next/**", "dist/**"]},"dev": {"cache": false,"persistent": true},"lint": {}}
}

🧱 步骤三:添加 Next.js 应用(web)

cd my-monorepo
pnpm create next-app apps/web --typescript --app

进入 apps/web,安装依赖:

cd apps/web
pnpm install

🔥 步骤四:安装 shadcn/ui 到 web 应用中

cd apps/web
npx shadcn-ui@latest init

使用默认配置(选择 Tailwind、TypeScript、默认路径),会自动创建好 components/uitailwind.config.ts


📘 步骤五:添加 Vite 应用(docs)

cd ../../
pnpm create vite apps/docs --template react-ts
cd apps/docs
pnpm install

然后配置 TailwindCSS:

pnpm add -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

修改 tailwind.config.js

// apps/docs/tailwind.config.js
export default {content: ["./index.html","./src/**/*.{js,ts,jsx,tsx}","../../packages/ui/**/*.{js,ts,jsx,tsx}"],theme: {extend: {}},plugins: []
}

src/index.css 中加入:

@tailwind base;
@tailwind components;
@tailwind utilities;

🧩 步骤六:创建共享 UI 组件库(packages/ui)

mkdir -p packages/ui/src
cd packages/ui
pnpm init -y

安装 React + Tailwind 相关依赖:

pnpm add react react-dom
pnpm add -D typescript tailwindcss postcss autoprefixer

初始化 tsconfig.json

{"compilerOptions": {"target": "ESNext","module": "ESNext","jsx": "react-jsx","declaration": true,"outDir": "dist","strict": true,"esModuleInterop": true,"moduleResolution": "Node","baseUrl": ".","paths": {}},"include": ["src"]
}

创建一个组件:

// packages/ui/src/button.tsx
import { ButtonHTMLAttributes } from "react"export function Button(props: ButtonHTMLAttributes<HTMLButtonElement>) {return (<buttonclassName="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"{...props}/>)
}

packages/ui/package.json 添加:

{"name": "ui","main": "./src/index.ts","type": "module"
}

🧩 步骤七:在 web/docs 中使用 packages/ui

安装本地依赖:

# 根目录执行
pnpm add ui --workspace --filter web
pnpm add ui --workspace --filter docs

然后在 apps/webapps/docs 中都可以引入:

import { Button } from "ui"

🧪 步骤八:配置 TypeScript 共享设置(可选)

根目录 tsconfig.json

{"compilerOptions": {"baseUrl": ".","paths": {"ui": ["packages/ui/src"]}}
}

然后在 apps/web/tsconfig.json 中使用:

{"extends": "../../tsconfig.json"
}

🚀 步骤九:运行开发环境

# 运行 Next.js 应用
pnpm dev --filter web# 运行 Vite 应用
pnpm dev --filter docs

✅ 总结

Monorepo 架构,特点如下:

特性技术栈
Monorepo 构建工具Turborepo
包管理器pnpm + workspace
主站应用(App Router)Next.js + TypeScript
文档/营销页Vite + React
UI 组件库packages/ui + shadcn/ui
样式Tailwind CSS
构建缓存与依赖追踪Turbo pipeline

相关文章:

  • MoonBit正式入驻GitCode!AI时代的编程语言新星,开启高性能开发新纪元
  • 【面试 · 五】CSS个别重点总结
  • 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
  • Xcode报错:“Set `maskView` to `nil` before adding it as a subview of ZFMaskView
  • 嵌入式培训之数据结构学习(三)gdb调试
  • 深入解析京东 item_sku 接口:获取商品SKU信息的详细指南
  • libarchive.so.19丢失
  • 使用libUSB-win32的简单读写例程参考
  • 基于SpringBoot+Vue的房屋租赁管理系统源码包(完整版)开发实战
  • 现代垃圾收集器
  • 【springcloud学习(dalston.sr1)】Ribbon负载均衡(七)
  • svn status . 命令返回分析
  • npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
  • 2025年Flutter项目管理技能要求
  • 怎么查看当前vue项目,要求的node.js版本
  • MobiPDF:安卓设备上的专业PDF阅读与编辑工具
  • <论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
  • VTK|类似CloudCompare的比例尺实现2-vtk实现
  • 如何用Redis实现分布式锁?RedLock算法的核心思想?Redisson的看门狗机制原理?
  • C++:二叉搜索树
  • 夜读丨读《汉书》一得
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 颜福庆与顾临的争论:1930年代在中国维持一家医学院要花多少钱
  • 民生谣言误导认知,多方联动守护清朗——中国互联网联合辟谣平台2025年4月辟谣榜综述
  • 退休夫妻月入1.2万负债1.2亿申请破产,律师:“诚实而不幸”系前置条件
  • 中美经贸高层会谈将在午餐后继续