Unleash 前端开发指南:从本地联调到 OpenAPI 客户端生成与 E2E 测试
【免费下载链接】unleashOpen-source feature management platform项目地址: https://gitcode.com/GitHub_Trending/un/unleash
Unleash 是开源的功能开关(feature flag)管理平台,其仓库中的frontend/目录承载着全部管理员界面(Admin UI)前端应用。本文以 frontend/README.md 为主线,系统梳理该前端的本地运行方式、远程 API 沙箱联调、端到端测试的启动与调试,以及基于 OpenAPI 规范生成类型化客户端的方法,并结合仓库源码与配置文件补充背后的实现细节,帮助你快速上手 Unleash 前端的日常开发与验证流程。
目录结构与技术栈概览
在深入运行方式之前,先了解frontend/目录的整体构成。从仓库结构看,该目录包含:
src/:前端源码,其中component/下约 2000 个组件文件(以.tsx/.ts为主),hooks/、utils/、interfaces/等目录分别承载数据获取、工具函数与类型定义;src/openapi/:由后端 OpenAPI 规范生成的类型定义(models/),以及统一的fetcher.ts与index.ts;cypress/:端到端测试,按oss/(开源版)与enterprise/(企业版)拆分,覆盖 feature、segments、groups、projects 等核心页面;vite.config.mts:Vite 构建与开发服务器配置,同时内嵌 Vitest 测试配置;orval.config.ts:OpenAPI 客户端生成器的配置;package.json:全部脚本与依赖声明,前端包名unleash-frontend-local,要求 Node >= 22,使用 pnpm 管理依赖。
从 frontend/package.json 的依赖可以确认技术选型:React 19 + TypeScript + Vite 8 作为构建基础,MUI(Material UI)提供组件体系,SWR 负责数据请求,Cypress 承担 E2E 测试,Vitest + Testing Library 负责单元测试。这些细节在后续各章节中会逐一体现。
本地开发环境:与 unleash-api 同时运行
前置准备
按照 contributing/CONTRIBUTING.md 的 "How to run the project" 一节,本地运行需要:
- Node.js(22 及以上,仓库
engines字段同样声明node >= 22); - pnpm(推荐使用,仓库锁定
packageManager: pnpm@11.15.1); - Docker(用于启动 Postgres 数据库);
- PostgreSQL 14+。
启动流程
在仓库根目录执行:
pnpm install pnpm dev这一组合命令会同时启动两个开发服务器:
- 前端开发服务器:端口
3000(由 vite.config.mts 中server.port: 3000定义); - 后端开发服务器:端口
4242(Unleash API 的默认端口)。
前端通过 Vite 的server.proxy将/api、/auth、/logout、/health、/invite、/edge等路径代理到后端目标地址,默认目标即http://localhost:4242:
const UNLEASH_API = process.env.UNLEASH_API || 'http://localhost:4242'; // ... server: { open: true, host: true, port: 3000, proxy: { [`${UNLEASH_BASE_PATH}api`]: { target: UNLEASH_API, changeOrigin: true }, [`${UNLEASH_BASE_PATH}auth`]: { target: UNLEASH_API, changeOrigin: true }, // ... }, },这意味着浏览器只访问localhost:3000,涉及鉴权与业务数据的请求会被 Vite 透明转发给后端,从而避免跨域问题。UNLEASH_BASE_PATH默认是/,且必须以/开头和结尾,否则启动时会直接报错退出。
登录凭据
后端默认创建一个管理员账号,登录localhost:3000时使用:
- 用户名:
admin - 密码:
unleash4all
Cypress 配置(frontend/cypress.config.ts)中的AUTH_USER=admin, AUTH_PASSWORD=unleash4all与之一致,说明这组凭据同样被 E2E 测试使用。
使用远程沙箱实例联调前端
如果不想在本地跑起整个 unleash-api(包括数据库与后端进程),可以改用远程沙箱 API。进入前端目录执行:
cd ./frontend pnpm install pnpm run start:sandboxstart:sandbox脚本定义在 frontend/package.json:
"start:sandbox": "UNLEASH_API=https://sandbox.getunleash.io/ VITE_TEST_REDIRECT=true UNLEASH_BASE_PATH=/pro/ pnpm run start"它通过环境变量把前端的 API 目标指向远程实例,同时指定了基础路径/pro/。Vite 启动后,UNLEASH_API会作为代理目标,UNLEASH_BASE_PATH会成为应用挂载的基础路径(对应vite.config.mts中base: UNLEASH_BASE_PATH)。
仓库还提供了其他沙箱变体,可按需选用:
| 脚本 | 环境变量 | 用途 |
|---|---|---|
start:sandbox | UNLEASH_API=https://sandbox.getunleash.io/,UNLEASH_BASE_PATH=/pro/ | 对接开源沙箱,VITE_TEST_REDIRECT=true |
start:sandbox:enterprise | 同沙箱地址,UNLEASH_BASE_PATH=/enterprise/ | 对接企业版沙箱 |
start:demo | UNLEASH_API=https://app.unleash-hosted.com/,UNLEASH_BASE_PATH=/demo/ | 对接托管演示实例 |
start:demo2 | UNLEASH_API=https://sandbox.getunleash.io/,UNLEASH_BASE_PATH=/demo2/ | 对接演示环境 |
这种“后端在别处、前端在本地”的开发模式,非常适合前端开发者在不需要修改后端逻辑时快速验证 UI 效果。
针对 localhost 的端到端测试
标准流程
E2E 测试使用 Cypress,全部 spec 文件位于 frontend/cypress 目录,按oss/(开源版)与enterprise/(企业版)分类。测试在仓库根目录执行以下命令:
pnpm build:frontend pnpm dev:start这两个命令分别完成前端构建与后端+构建产物的一体化启动。随后运行测试:
pnpm run e2ee2e脚本实际执行e2e:oss:
"e2e": "pnpm run e2e:oss", "e2e:oss": "pnpm run cypress:run --config baseUrl='http://localhost:4242' --spec \"cypress/oss/**/*.spec.ts\""注意baseUrl指向4242(后端端口),且e2e:oss只运行cypress/oss/下的 spec;e2e:enterprise则不加--spec限制,运行全部测试(包括cypress/enterprise/)。
企业版测试
如果你开发的功能涉及企业版(enterprise)能力,需要启动企业版后端并运行对应测试套件:
pnpm run start:enterprise pnpm run e2e:enterprise调试 E2E 测试
在开发过程中调试单个测试时,建议使用开发构建而不是生产构建。仓库 README 特别提醒:对开发版前端跑 E2E 会明显变慢(可能慢 5 倍以上),因此最佳实践是打开 Cypress 交互界面,只挑选当前正在开发的测试用例运行。
调试步骤如下:
- 在仓库根目录以开发模式同时启动前后端,例如
pnpm dev(前端 3000、后端 4242); - 在前端目录执行:
pnpm e2e:dev:open该脚本对应:
"e2e:dev:open": "pnpm run cypress:open --config baseUrl='http://localhost:3000'"它把baseUrl指向前端开发服务器(3000 端口),并打开 Cypress 图形界面(cypress open),便于逐条运行与断点式调试。相比之下,e2e:open则针对生产/后端地址(4242)。
Cypress 的整体行为由 frontend/cypress.config.ts 控制,其中值得留意的默认值包括:viewportWidth: 1920、viewportHeight: 1080、runMode下失败重试 1 次、测试失败自动截图并录制视频,以及通过cypress-vite预处理器让 Cypress 直接复用vite.config.mts编译测试代码。
E2E 支持层
frontend/cypress/support 目录提供了API.ts、UI.ts、commands.ts、e2e.ts、index.ts等支持文件,用于封装 API 调用与 UI 交互的通用命令;cypress/oss/demo/demo.spec.ts、cypress/oss/feature/feature.spec.ts、cypress/oss/segments/segments.spec.ts分别是演示、功能开关与分段(segments)的测试入口。若测试需要指向其他端口(如迁移验证场景),可用e2e:migrations脚本,它通过EXPOSED_PORT环境变量(默认 4242)决定baseUrl。
生成 OpenAPI 客户端
为什么需要生成
Unleash 前端与后端通过 REST API 通信,前端使用由后端 OpenAPI 规范生成的类型化客户端,保证前后端数据结构一致、接口变更可被编译器及时捕获。当前仓库的策略是:
- 只使用生成的类型(
src/openapi/models)定义请求/响应数据结构; - 方法层(
src/openapi/apis)暂未启用,未来新特性会逐步迁移使用。
这一点在 orval.config.ts 的注释与 frontend/README.md 中均有明确说明。
生成命令
每当后端 API 发生变更,都需要重新生成客户端:
pnpm gen:api rm -rf src/openapi/apis然后清理src/openapi/index.ts的导入,只保留第一行:
export * from './models';仓库还提供了封装好的脚本gen:api:clean,一步完成上述三件事:
"gen:api:clean": "pnpm run gen:api && rm -rf src/openapi/apis && sed -i.bak '1q' src/openapi/index.ts && rm src/openapi/index.ts.bak"当前仓库的 src/openapi/index.ts 实际内容为export * from './models/index';,与文档描述的清理后状态一致。
配置与数据源
生成器基于 Orval,配置见 orval.config.ts:
- 输入:
process.env.UNLEASH_OPENAPI_URL || 'http://localhost:4242/docs/openapi.json',即默认从本地 4242 端口的运行时 OpenAPI 文档生成; - 输出:
src/openapi工作区,模式为tags,类型输出到models/,方法输出到apis/; - 客户端:
swr(与前端的数据请求方案一致); - 自定义请求器:
./fetcher.ts中的fetcher; - 属性排序:
Alphabetical; - 收尾钩子:
afterAllFilesWrite执行 scripts/clean_orval_generated.sh,该脚本会删除生成的apis目录、将index.ts重置为仅导出 models、并运行 lint 与 Biome 格式化。
该脚本假定你有一个运行在http://localhost:4242的实例(文档说明可以是企业版后端,因为企业版暴露了更完整的 OpenAPI 规范),生成结果来自该实例的运行时 schema。如需更换来源,设置环境变量即可:
UNLEASH_OPENAPI_URL=https://your-instance/docs/openapi.json pnpm run gen:api仓库同样预置了针对托管与沙箱实例的变体:gen:api:demo(https://app.unleash-hosted.com/demo/docs/openapi.json)与gen:api:sandbox(https://sandbox.getunleash.io/demo2/docs/openapi.json)。
分析打包体积
当需要排查前端产物体积时,在frontend/目录下运行:
npx vite-bundle-visualizer该工具会基于 Vite 构建产物生成依赖与 chunk 的可视化分析,帮助定位体积异常的模块。构建相关的关键配置位于 vite.config.mts:产物输出到build/,静态资源放到static/,开发模式下开启 sourcemap;此外还有针对@mui/icons-material深路径导入的 ESM 重定向插件,以及开发模式下注入的 Emotion Babel 插件(用于组件样式标签命名)。
前端质量门禁与常用脚本
frontend/package.json 中定义了一套完整的质量保障脚本,贯穿本地开发与 CI:
| 命令 | 作用 |
|---|---|
pnpm dev/pnpm start | 启动 Vite 开发服务器(端口 3000) |
pnpm build | 先执行lint:material:icons(校验 MUI 图标导入规范,见 check-imports.rc),再执行vite build |
pnpm lint | 使用 Biome 检查代码(biome check . --error-on-warnings) |
pnpm lint:fix | Biome 自动修复 |
pnpm ts:check | TypeScript 类型检查(tsc) |
pnpm test | Vitest 单元测试(vitest run),test:watch为监听模式 |
pnpm ci | CI 一体化流程:lint 修复 + 类型检查 + 构建 + 测试 |
单元测试配置同样内嵌于 vite.config.mts 的vitestConfig:使用jsdom环境、全局模式、setupFiles: 'src/setupTests.ts'、超时 30 秒,并排除cypress目录。
小结与最佳实践
综合 frontend/README.md 与仓库源码,Unleash 前端开发的推荐工作流可以归纳为:
- 日常 UI 开发:根目录
pnpm install && pnpm dev,前后端分别在 3000/4242 端口联动,登录admin / unleash4all; - 仅改前端:进入
frontend/执行pnpm run start:sandbox,对接远程 API 避免本地起后端; - 验证功能:根目录构建并启动后运行
pnpm run e2e(开源版)或pnpm run e2e:enterprise(企业版);单测调试用pnpm e2e:dev:open打开 Cypress UI,注意开发模式下测试速度会明显下降; - 后端 API 变更后:在本地 4242 运行实例的前提下执行
pnpm gen:api(或一键脚本gen:api:clean),同步更新src/openapi/models类型; - 提交前:依次通过
pnpm lint、pnpm ts:check、pnpm test、pnpm build的质量门禁。
理解这些脚本背后对应的 Vite 代理配置、Orval 生成规则与 Cypress 运行参数,能让你在遇到端口、鉴权、类型不同步等问题时快速定位根因,更高效地参与 Unleash 前端的开发与维护。
【免费下载链接】unleashOpen-source feature management platform项目地址: https://gitcode.com/GitHub_Trending/un/unleash
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考