跳到主要内容
版本:3.1.0(预览)

定制 React UI

Ambari 3.1 从 ambari-web/latest 提供主要 Web UI。本指南说明如何修改该应用、验证改动、构建 Server Web 制品,以及测试开发环境部署。它适用于应该进入 Ambari 公共 shell 或内置工作流的改动。

能够独立部署的工具通常更适合实现为 Ambari View。在主要 UI 中添加产品专用页面之前,请先阅读 React View 开发。

选择扩展边界​

需求扩展点原因
修改公共导航、身份验证、主机、服务、配置、告警或其他内置工作流ambari-web/latest此功能需要参与主要 shell、共享状态和 Ambari 权限控制。
添加具有独立版本、UI 和 REST 资源的应用Ambari ViewView 无需重新构建主要 UI,就可以单独打包、部署、升级和分配权限。
修改服务配置布局或控件服务 Theme服务专用的配置展示由 Stack 元数据管理。
添加编排、持久化或高权限操作Ambari Server API 加上以上一种 UI 扩展方式Server 必须是权限判断和变更操作的最终依据。

不要因为不想创建 View,就把功能直接塞进主要 UI。核心 UI 改动会影响每套 Ambari,需要兼容所有支持的身份验证、权限、代理和集群状态行为。

环境要求与基线​

使用当前 Ambari trunk 源码和其中声明的工具链。3.1 基线使用 JDK 17、Maven 3.9.x、Node 22.23.1 和 npm 10.9.8。Maven 前端插件会下载锁定的 Node 和 npm 版本;直接运行前端命令时,PATH 中需要存在兼容版本。

修改 UI 之前:

  1. 确认工作树基于目标 trunk 修订。
  2. 阅读附近的测试以及相关 Server API 或 Stack 契约。
  3. 不要编辑 latest/dist 或 target/classes/latest,它们都是生成目录。
  4. 不要把产品凭据和高权限逻辑放进浏览器代码。

源码目录​

路径职责
ambari-web/latest/src/router/RoutesList.tsx路由树,以及路由级权限、功能和操作状态保护
ambari-web/latest/src/screens工作流与页面实现
ambari-web/latest/src/apiAmbari REST 客户端、请求载荷和响应处理
ambari-web/latest/src/store已认证用户、集群、服务和应用共享状态
ambari-web/latest/src/components可复用控件、进度展示、路由保护、导航和 View 集成
ambari-web/latest/src/locales英文和简体中文 UI 文案
ambari-web/latest/src/test共享 Vitest 和 jsdom 测试设置
ambari-web/latest/vite.config.tsVite 基础路径、React 插件和测试配置

优先沿用相邻功能的实现,不要创建第二套请求、状态或通知模式。例如,新的服务操作应该复用现有的请求进度模型,不能把 API 已受理误认为操作已经完成。

开发核心 UI 改动​

安装、测试与构建​

直接运行前端命令可以获得最短的修改反馈周期:

cd ambari-web/latest
npm ci --no-audit --no-fund
npm test
npm run build

npm run build 会执行 TypeScript 构建,并把新的 Vite bundle 写入 ambari-web/latest/dist。npm test 会运行完整 Vitest 测试。还应执行 npm run lint,但要将仓库级结果与未修改的 trunk 基线比较,不要把已有 lint 问题都归因于本次改动。

Vite 开发服务器适合组件开发:

npm run dev -- --host 127.0.0.1

它本身不会还原 Ambari Server 身份验证、WebSocket 消息、View 托管或反向代理前缀。要验证集成行为,必须使用打包后的部署,或者配置同源开发代理。

添加路由与导航​

在 RoutesList.tsx 中注册内置路由,并使用现有保护组件:

  • ProtectedRoute 检查 Ambari 权限名,并提供安全的回退页面。
  • FeatureRouteGuard 检查 Stack 或 Server 功能标志。
  • ServiceOperationRouteGuard 防止互相冲突的服务工作流同时运行。
  • 特定工作流的保护组件负责持久化的所有者和恢复状态。

隐藏导航入口不等于完成授权。直接访问的路由也必须受保护,Server API 还要检查相同权限。需要测试直接输入 URL、浏览器刷新、无权限角色、关闭的功能标志和冲突中的操作。

复用 API 与状态契约​

把 REST 调用放在 src/api 下,并复用已配置的 ambariApi 客户端。该客户端会发送同源凭据,并统一处理身份验证失败。变更类请求应沿用现有端点对 X-Requested-By、内容类型和载荷结构的处理;不要内置用户名、密码、token 或外部服务密钥。

Ambari 操作是异步的。变更操作创建请求后,需要保留 request ID,跟踪 Server 中的权威任务状态,展示失败主机或任务,并在刷新后提供同样受支持的重试或恢复入口。不要用定时器或乐观成功提示替代 Server 状态。

保持本地化与可访问性​

用户可见文案要同时加入 src/locales/en/translation.json 和 src/locales/zh/translation.json。API 载荷使用稳定资源标识,只翻译展示标签。新控件需要支持键盘操作、提供可访问名称、保留清晰焦点,并展示加载、空数据、成功和失败状态,不能只依赖颜色传递信息。

构建 Server Web 制品​

Maven 模块会锁定前端工具链、构建 React 应用,并把 latest/dist 复制到 ambari-web/target/classes/latest:

mvn -B -pl :ambari-web -am \
-DskipTests -DskipPythonTests=true package

受支持的交付方式是构建并安装经过审查的 Ambari Server 软件包。这样可以让 Web 文件、Java 制品、版本元数据和软件包所有权保持一致。不要把 node_modules、Vite 开发服务器或源码复制到受管集群节点。

在开发环境替换静态文件​

默认 RPM 配置将 webapp.dir 设为 /usr/lib/ambari-server/web,React 应用从它的 latest 子目录提供。自定义安装可能在 ambari.properties 中设置不同的 webapp.dir,替换前应先检查实际配置。

在一次性开发 Server 上,可以先停止 Server,再暂存并整体切换 dist 目录:

ambari-server stop
stamp=$(date +%Y%m%d%H%M%S)
install -d /usr/lib/ambari-server/web/latest.new
cp -a /path/to/ambari-web/latest/dist/. \
/usr/lib/ambari-server/web/latest.new/
mv /usr/lib/ambari-server/web/latest \
"/usr/lib/ambari-server/web/latest.${stamp}"
mv /usr/lib/ambari-server/web/latest.new \
/usr/lib/ambari-server/web/latest
ambari-server start

必须整体切换目录。Vite 文件名带有内容哈希,只复制部分文件可能使 index.html 指向不兼容的资源集合。验证完成前保留带时间戳的目录。需要回退时,停止 Server,将失败的 latest 目录移开,把带时间戳的目录恢复为 latest,再启动 Server。

这套流程只适用于开发环境。生产改动应该通过有版本、可审查的软件包和站点正常发布流程交付。

验证清单​

不要只验证页面能否成功打开:

  • 对改动的页面、API 客户端、store 和保护组件运行定向测试。
  • 运行完整 Vitest 测试和生产构建。
  • 通过部署环境实际使用的基础路径和 TLS 入口打开 /latest/#。
  • 测试本地登录、已配置的 SSO、会话过期和退出。
  • 通过导航和直接 URL 分别测试有权限与无权限角色。
  • 注入 API 拒绝、超时、部分任务失败、刷新和重试。
  • 验证英文、简体中文、键盘操作和窄屏布局。
  • 如果页面使用实时状态,检查 WebSocket 或轮询恢复。
  • 检查浏览器控制台、网络请求、CSP 行为和 Server 日志。

安全规则​

浏览器代码应视为公开内容。不得将密码、API token、私钥或 AI 服务凭据编译进 React bundle 或 VITE_ 变量。需要高权限的外部调用必须经过 Server 端点,并使用受保护的凭据存储、明确授权、输入输出限制和可审计的错误处理。

不要把 Server 或模型输出直接作为原始 HTML 渲染。保留 Ambari 的同源凭据模式、CSRF 请求头约定、CSP、代理前缀和权限检查。React 路由保护能改善用户体验,但不能替代 Server 权限检查。