很想前后端一起写个博客项目,这样的话,以后有什么新的技术栈在公司项目不方便实践,在自己的项目中可以先试水。这次实战前后端包括部署都学到了不少东西,下面整理记录下。
项目简介
如寻常博客系统一样, 主要功能包括 文章展示、归档、标签、搜索等功能
主要技术栈
前端(Next.js)
- 主框架: Next.js,号称能够构建全栈应用,但我还是主要奔着他是个 SSR 框架,后端还是用
Nest写 - UI 库: shadcn,基于 radix-ui 做得,这个组件库不是通过 npm 安装,而是直接将代码下载到你的本地,方便你定制化
- CSS: Taliwind
- 数据请求:react-query
- 状态管理: zustand
后端(Nest.js)
数据库
项目结构
这是一个 MonoRepo 项目,packages 下面前后端在一起
开始安装
前端
安装 Next.js
在 /packages/nanlan-blog-client-next.js 下面安装 Next.js
# 自动安装
npx create-next-app@latest
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
}
dev:运行next dev以在开发模式下启动 Next.js。build:运行next build以构建用于生产环境的应用程序。start:运行next start以启动 Next.js 生产服务器。lint:运行next lint以设置 Next.js 的内置 ESLint 配置。
添加 shadcn
pnpm dlx shadcn@latest init
- 添加 shadcn ui
# 初始化
pnpm dlx shadcn init
初始化完之后会在项目根目录下看到 component.json
具体配置可以看 schema。 着重说下
aliases 这个配置,一开始我以为配置 aliases 不是在 tsconfig.json 下面嘛,为啥这里还要配置呢? 原来是为了帮助 shadcn 在本地的生成组件放在正确的位置
由于并不是直接安装 shadcn, 它本身的相关依赖会被安装到 package.json 下面 初始化之后也会多几个依赖
# package.json
"dependencies": {
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-slot": "^1.1.2",
"class-variance-authority": "^0.7.1",// 一个用于构建类型安全的 UI 组件变体的工具库
"clsx": "^2.1.1",
"lucide-react": "^0.475.0",
"tailwind-merge": "^3.0.1",
"tailwindcss-animate": "^1.0.7"
}
也会在 tailwind.config 加入相关配置
- 添加组件
pnpm dlx shadcn@latest add button card dialog input ...
这个时候代码会添加到本地components/ui 下面
安装 react-query
pnpm install @tanstack/react-query
后端
安装 Nest.js
在 /packages/nanlan-blog-server-nest.js 下面安装 Next.js
$ pnpm i -g @nestjs/cli
$ nest new project-name
安装 prisma
# 安装
pnpm install @prisma/client
# prisma 生成
pnpm generate
配置数据库
// schema.prisma
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
启动项目
可以安装 turopack 在根目录启动
// package.json
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"start": "turbo run start",
"lint": "turbo run lint"
}
或者自己写个
// package.json
"scripts": {
"start:server": "pnpm --filter nanlan-blog-server-nestjs dev",
"start:client": "pnpm --filter nanlan-blog-nextjs dev",
}