Unleash 前端开发指南:从本地联调到 OpenAPI 客户端生成与 E2E 测试
2026/9/15 3:29:57 网站建设 项目流程

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.tsindex.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:sandbox

start: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.mtsbase: UNLEASH_BASE_PATH)。

仓库还提供了其他沙箱变体,可按需选用:

脚本环境变量用途
start:sandboxUNLEASH_API=https://sandbox.getunleash.io/UNLEASH_BASE_PATH=/pro/对接开源沙箱,VITE_TEST_REDIRECT=true
start:sandbox:enterprise同沙箱地址,UNLEASH_BASE_PATH=/enterprise/对接企业版沙箱
start:demoUNLEASH_API=https://app.unleash-hosted.com/UNLEASH_BASE_PATH=/demo/对接托管演示实例
start:demo2UNLEASH_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 e2e

e2e脚本实际执行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 交互界面,只挑选当前正在开发的测试用例运行。

调试步骤如下:

  1. 在仓库根目录以开发模式同时启动前后端,例如pnpm dev(前端 3000、后端 4242);
  2. 在前端目录执行:
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: 1920viewportHeight: 1080runMode下失败重试 1 次、测试失败自动截图并录制视频,以及通过cypress-vite预处理器让 Cypress 直接复用vite.config.mts编译测试代码。

E2E 支持层

frontend/cypress/support 目录提供了API.tsUI.tscommands.tse2e.tsindex.ts等支持文件,用于封装 API 调用与 UI 交互的通用命令;cypress/oss/demo/demo.spec.tscypress/oss/feature/feature.spec.tscypress/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:demohttps://app.unleash-hosted.com/demo/docs/openapi.json)与gen:api:sandboxhttps://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:fixBiome 自动修复
pnpm ts:checkTypeScript 类型检查(tsc
pnpm testVitest 单元测试(vitest run),test:watch为监听模式
pnpm ciCI 一体化流程:lint 修复 + 类型检查 + 构建 + 测试

单元测试配置同样内嵌于 vite.config.mts 的vitestConfig:使用jsdom环境、全局模式、setupFiles: 'src/setupTests.ts'、超时 30 秒,并排除cypress目录。

小结与最佳实践

综合 frontend/README.md 与仓库源码,Unleash 前端开发的推荐工作流可以归纳为:

  1. 日常 UI 开发:根目录pnpm install && pnpm dev,前后端分别在 3000/4242 端口联动,登录admin / unleash4all
  2. 仅改前端:进入frontend/执行pnpm run start:sandbox,对接远程 API 避免本地起后端;
  3. 验证功能:根目录构建并启动后运行pnpm run e2e(开源版)或pnpm run e2e:enterprise(企业版);单测调试用pnpm e2e:dev:open打开 Cypress UI,注意开发模式下测试速度会明显下降;
  4. 后端 API 变更后:在本地 4242 运行实例的前提下执行pnpm gen:api(或一键脚本gen:api:clean),同步更新src/openapi/models类型;
  5. 提交前:依次通过pnpm lintpnpm ts:checkpnpm testpnpm build的质量门禁。

理解这些脚本背后对应的 Vite 代理配置、Orval 生成规则与 Cypress 运行参数,能让你在遇到端口、鉴权、类型不同步等问题时快速定位根因,更高效地参与 Unleash 前端的开发与维护。

【免费下载链接】unleashOpen-source feature management platform项目地址: https://gitcode.com/GitHub_Trending/un/unleash

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询