Bulletproof React Next.js App 应用本地运行指南:环境配置、Mock Server 与开发工作流
【免费下载链接】bulletproof-react🛡️ ⚛️ A simple, scalable, and powerful architecture for building production ready React applications.项目地址: https://gitcode.com/GitHub_Trending/bu/bulletproof-react
本文基于apps/nextjs-app子应用的官方 README 展开,讲清如何从零把 Bulletproof React 的 Next.js App Router 示例应用跑起来:前置环境要求、.env环境变量体系、Mock API Server 的启动原理,以及yarn dev背后的目录结构与关键脚本。读完你可以独立启动该应用、理解四个环境变量的校验机制,并根据 package.json 中的脚本清单完成日常开发、测试与构建。
前置条件与初始化步骤
官方 README 给出的启动前提非常明确:
- Node 20+
- Yarn 1.22+
初始化命令如下:
git clone https://gitcode.com/GitHub_Trending/bu/bulletproof-react.git cd bulletproof-react cd apps/nextjs-app cp .env.example .env yarn install从 package.json 的依赖声明看,当前应用运行在Next.js 14(App Router)+ React 18.3 + TypeScript 5.4之上,状态层使用 TanStack Query 与 Zustand,UI 层基于 Radix UI 与 Tailwind CSS,这也是仓库整体架构(单向数据流、特征模块化)在 App Router 下的落地形态:
cp .env.example .env这一步不能跳过:应用启动时会用 Zod 对必填环境变量做校验,缺变量会直接抛错(下文详述)。仓库提供的 .env.example 内容如下:
NEXT_PUBLIC_API_URL=http://localhost:8080/api NEXT_PUBLIC_ENABLE_API_MOCKING=false NEXT_PUBLIC_MOCK_API_PORT=8080 NEXT_PUBLIC_URL=http://localhost:3000环境变量体系:四个变量的作用与 Zod 校验
这组变量全部以NEXT_PUBLIC_前缀定义,意味着它们会暴露给客户端 bundle。仓库中 .env.example-e2e 则用于 Playwright E2E 场景,两者取值相同。
真正的校验与解析逻辑集中在 src/config/env.ts。它把所有NEXT_PUBLIC_*变量映射到内部命名后,用一个 Zod schema 做运行时校验:
// src/config/env.ts(节选) const EnvSchema = z.object({ API_URL: z.string(), // 必填,无默认值 ENABLE_API_MOCKING: z .string() .refine((s) => s === 'true' || s === 'false') .transform((s) => s === 'true') .optional(), APP_URL: z.string().optional().default('http://localhost:3000'), APP_MOCK_API_PORT: z.string().optional().default('8080'), });由此可以整理出各变量的取值约束:
| 环境变量 | 内部键 | 必填 | 默认值 | 用途 |
|---|---|---|---|---|
NEXT_PUBLIC_API_URL | API_URL | 是 | 无 | 前端所有请求的 API 基地址,README 中的http://localhost:8080/api即来源于此 |
NEXT_PUBLIC_ENABLE_API_MOCKING | ENABLE_API_MOCKING | 否 | 无(可选) | 布尔字符串,'true'时启用浏览器端 MSW Service Worker 拦截,用于演示/联调 |
NEXT_PUBLIC_URL | APP_URL | 否 | http://localhost:3000 | 应用自身地址,同时作为 Mock Server 的 CORS 白名单来源 |
NEXT_PUBLIC_MOCK_API_PORT | APP_MOCK_API_PORT | 否 | 8080 | Mock API Server 的监听端口 |
ENABLE_API_MOCKING通过refine强制取值只能是'true'或'false',并transform成真正的布尔值,避免了字符串'false'被当真值的经典坑。校验失败时,createEnv()会抛出形如Invalid env provided.的错误,并逐条列出缺失或非法的字段名——这就是为什么 README 要求先cp .env.example .env。
Mock Server:先于应用启动的 API 层
README 特别强调:先启动 Mock Server,再运行应用,Mock Server 监听http://localhost:8080/api。对应的脚本是yarn run-mock-server,从 package.json 看它执行的是tsx ./mock-server.ts。
mock-server.ts 的完整实现值得逐行看,它把 MSW 的 handler 复用到 Node 侧,从而让开发环境拥有一个“真实”的后端:
// mock-server.ts(节选) const app = express(); app.use(cors({ origin: process.env.NEXT_PUBLIC_URL, credentials: true })); app.use(express.json()); app.use(logger({ level: 'info', redact: ['req.headers', 'res.headers'], /* pino-pretty 彩色输出 */ })); app.use(createMiddleware(...handlers)); initializeDb().then(() => { app.listen(process.env.NEXT_PUBLIC_MOCK_API_PORT, () => { console.log(`Mock API server started at http://localhost:${process.env.NEXT_PUBLIC_MOCK_API_PORT}`); }); });这里有几个设计细节:
- CORS 只放行
NEXT_PUBLIC_URL且携带凭证(credentials: true),与 Mock Server 处理基于 Cookie 的会话认证相配套; - 日志脱敏:
pino-http通过redact: ['req.headers', 'res.headers']隐藏请求/响应头,避免把 Cookie 打印到终端; - 数据持久化:Mock Server 使用
@mswjs/data建模。从 src/testing/mocks/db.ts 看,定义了user、team、discussion、comment四个模型(主键均为nanoid);在 Node 环境下数据写入工作目录的mocked-db.json文件持久化,在浏览器端则落到localStorage的msw-db键中,initializeDb()负责启动时把持久化数据灌回内存模型,因此重启 Mock Server 后数据仍在。
MSW 的 handler 集合同样可复用:src/testing/mocks/handlers/index.ts 聚合了auth、comments、discussions、teams、users五组 handler,并额外提供一个${env.API_URL}/healthcheck探活端点(带networkDelay模拟网络延迟)。而 src/testing/mocks/browser.ts 中的setupWorker(...handlers)则服务于NEXT_PUBLIC_ENABLE_API_MOCKING=true时的浏览器端拦截(public/mockServiceWorker.js 即对应 worker 文件)。同一份 handler 同时驱动 E2E 测试与 Mock Server,是本仓库“测试即契约”的体现。
yarn dev:开发模式与路由结构
README 中yarn dev一步对应next dev,启动后访问 http://localhost:3000。结合 src/config/paths.ts 的集中式路由定义,本地可见的页面布局为:
/— 落地页/auth/login、/auth/register— 认证页,支持?redirectTo=查询参数/app— 仪表盘(登录后)/app/discussions、/app/discussions/[discussionId]— 讨论列表与详情/app/users、/app/profile— 用户管理(需管理员权限)与个人资料/public/discussions/[discussionId]— 无需登录即可访问的公开讨论
对应源码位于 src/app 目录,按app/auth/public三个路由组划分,页面(page.tsx)与业务组件(_components/)分目录存放。全局 Provider 在 src/app/provider.tsx 中装配:ErrorBoundary→QueryClientProvider→Notifications,并在开发环境挂载 React Query Devtools。
前端所有 HTTP 调用统一走 src/lib/api-client.ts 的api封装(get/post/put/patch/delete)。它会自动拼接env.API_URL前缀、序列化查询参数、默认cache: 'no-store';在服务端运行时还会动态导入next/headers把当前请求的 Cookie 原样转发给 Mock API(getServerCookies),并开启credentials: 'include'以维持会话。请求失败时,客户端会调用 Zustand 通知存储弹出错误通知并抛出错误供 TanStack Query 接管——这套调用链正是 Mock Server 存在的意义:应用前后端分离时仍有一个行为一致、数据可持久化的 API 可对接。
完整脚本清单:日常开发、测试与构建
README 只列出了两个脚本,而 package.json 实际提供了完整的工程化脚本集,按用途归纳如下:
| 脚本 | 实际命令 | 用途 |
|---|---|---|
yarn dev | next dev | 开发模式,HMR,默认 3000 端口 |
yarn build/yarn start | next build/next start | 生产构建与启动 |
yarn run-mock-server | tsx ./mock-server.ts | 启动 8080 端口的 Mock API |
yarn test | vitest | 单元测试(Vitest + Testing Library,jsdom 环境) |
yarn test-e2e | pm2 start "yarn run-mock-server" --name server && yarn playwright test | 用 PM2 拉起 Mock Server 后跑 Playwright E2E |
yarn lint/yarn check-types | next lint/tsc --noEmit | 静态检查与类型检查 |
yarn storybook/yarn build-storybook | storybook dev -p 6006/storybook build | UI 组件 Storybook |
yarn generate | plop | 基于 generators/component 模板的代码生成 |
两个脚本值得展开:
yarn test-e2e把“先起 Mock Server”这一 README 约定固化进了命令本身——先用pm2以独立进程名server托管 Mock Server,再执行playwright test,测试用例位于 e2e/tests(auth.setup.ts、smoke.spec.ts、profile.spec.ts),E2E 读取的环境变量则来自.env.example-e2e对应的配置。yarn generate通过 Plop(plopfile.cjs)按 generators/component 下的 Handlebars 模板生成组件 + Story + 索引文件,保证新增 UI 组件时目录结构(组件、stories、index.ts)与仓库既有规范一致。
小结
apps/nextjs-app的本地启动路径可以概括为三步:复制.env.example为.env满足 Zod 必填校验;yarn run-mock-server在 8080 端口起一个带数据持久化的 MSW 模拟后端;yarn dev在 3000 端口启动 Next.js App Router 应用并访问/auth/register开始体验。整套流程的价值在于:环境变量有运行时校验、Mock 层与 E2E 测试共用同一份 MSW handler、工程脚本覆盖了单测、E2E、类型检查与组件文档化——这些细节与 README 中“先 Mock Server 后应用”的简单指引共同构成了该子应用可长期维护的基础。若需深入了解各层设计决策,可继续阅读仓库根目录 README.md 指向的 项目结构 与 API 层 等文档。
【免费下载链接】bulletproof-react🛡️ ⚛️ A simple, scalable, and powerful architecture for building production ready React applications.项目地址: https://gitcode.com/GitHub_Trending/bu/bulletproof-react
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考