首页
/ Nacos Console UI (Next) 工程实战:基于 React 19 + TypeScript + Vite 的下一代控制台构建、开发与部署全解析

Nacos Console UI (Next) 工程实战:基于 React 19 + TypeScript + Vite 的下一代控制台构建、开发与部署全解析

2026-09-08 21:25:02作者:齐添朝

导读

Nacos 控制台前端正在从旧的 React 工程(console-ui/)向新一代工程(console-ui-next/)演进。本指南以仓库中 console-ui-next/README.md 为主线,系统讲解这一新一代控制台前端的技术选型、环境要求、供应链安全配置、本地开发代理、生产构建、静态资源部署以及 contextPath 自适应机制,并结合仓库源码(vite.config.tspackage.json.npmrc、后端 nacos-console.properties 等)深入剖析每个环节的底层原理。读完本文,你将能够独立完成该前端的依赖安装、本地联调、构建发布与多 contextPath 场景下的部署适配。

工程定位与技术栈

console-ui-next 是 Nacos 新一代控制台前端工程,官方 README 明确其技术栈为:

  • React 19:核心 UI 框架(依赖声明见 package.jsonreact / react-dom^19.2.4
  • TypeScript:类型安全,构建时通过 tsc -b 做全量类型检查
  • Vite:开发服务器与生产构建(vite^8.0.16
  • Tailwind CSS 4:原子化样式方案(tailwindcss^4.2.1,通过 @tailwindcss/vite 插件接入)
  • Shadcn/ui:基于 Radix UI 原语 + Tailwind 的可组合组件体系(依赖中包含大量 @radix-ui/* 包)

此外,工程还集成了 zustand(状态管理)、react-router-dom(路由)、i18next(国际化,见 src/locales)、monaco-editor(配置编辑)、axios(请求)、zod(校验)等成熟生态。从 src/api 目录可以看出现有 API 封装覆盖 auth、config、service、cluster、namespace、plugin、agent、skill、prompt、mcp、aiResourceImport 等模块,配合 src/router/routes.tsx 中的路由注册,新一代控制台不仅承载配置管理与服务管理,还深度集成了 AI 资源注册(Agent / Skill / Prompt / MCP Server)等新能力。

注意:工程为 private: true,不发布到 npm registry,仅作为 Nacos 仓库内置的前端源码模块存在。

环境准备:版本前提

官方 README 给出的环境要求如下:

依赖 版本要求
Node.js >= 20.19+
npm >= 10

需要特别说明的是,Node.js >= 20.19+ 是运行开发服务器与构建工具链的基础;而 .npmrcmin-release-age 供应链防护特性仅在 npm >= 11 时才生效(详见下文),如果使用的 npm 版本低于 11,该防护会静默不生效,建议在 CI/构建环境中显式固定 Node.js 与 npm 版本以确保行为一致。

供应链安全:.npmrc 的 min-release-age 机制

仓库在 .npmrc 中配置了:

min-release-age=3

含义是:npm install不会安装发布时间不足 3 天的包,从而降低依赖投毒等供应链攻击风险——攻击者发布的“新鲜”恶意版本会被自动过滤,给安全审计留出时间窗口。

关键约束:

  • min-release-age 仅对 npm >= 11 生效(这是 npm 11 引入的安装策略选项);
  • 单位为
  • 该配置只影响安装阶段,不影响已锁定的 package-lock.json 版本解析逻辑。

对于需要强制绕过该策略的场景,可以显式传入安装参数覆盖(npm 官方支持对应 CLI 参数),但默认情况下应保持该配置以维持供应链安全基线。

安装依赖

进入工程目录后执行:

npm install

依赖清单非常庞大:运行时依赖以 @radix-ui/*(约 20 个无障碍组件原语)、monaco-editor + @monaco-editor/react(编辑器)、react-markdown / @uiw/react-md-editor / remark-*(Markdown 渲染)、swagger2openapi(OpenAPI 转换)、jszip(压缩导出)、zod + react-hook-form(表单校验)等为主;开发依赖则以 typescriptvitevitesteslinttailwindcss@vitejs/plugin-react 为主。

提示:npm 安装时若遇到 peerDependencies 冲突,README 并未推荐 --legacy-peer-deps,但 package.jsonmin-release-age 脚本中使用了 npm install --legacy-peer-deps 作为备选安装方式,可结合自身环境选择。

本地开发:dev server 与 Vite 代理

启动本地开发服务器:

npm run dev

启动后访问 http://localhost:8000(端口在 vite.config.tsserver.port = 8000 中硬编码)。

开发模式下最核心的机制是 Vite 代理(server.proxy)。其设计目标是:前端开发服务器与后端服务分离,浏览器只面向 8000 端口,由 Vite 把 API 请求转发到后端的两个不同服务。README 中的规则描述为:

  • /nacos/v1/auth/*/nacos/v3/auth/* 转发到 Admin Server(localhost:8848);
  • 其余所有 /nacos/* 请求转发到 Console Server(localhost:8080,并剥离 /nacos 前缀)。

对照 vite.config.ts 的实际实现,代理分为两组:

proxy: {
  // Auth/admin endpoints → 8848 (server has contextPath=/nacos, so add prefix)
  '/v1/auth': {
    target: 'http://localhost:8848',
    changeOrigin: true,
    rewrite: (path) => `/nacos${path}`,
  },
  '/v3/auth': {
    target: 'http://localhost:8848',
    changeOrigin: true,
    rewrite: (path) => `/nacos${path}`,
  },
  // Console endpoints → 8080 (console has empty contextPath, no rewrite needed)
  '/v1': { target: 'http://localhost:8080', changeOrigin: true },
  '/v2': { target: 'http://localhost:8080', changeOrigin: true },
  '/v3': { target: 'http://localhost:8080', changeOrigin: true },
}

两组规则的原理差异值得展开:

  1. 认证/管理端 → 8848(Admin Server):前端发起的 /v1/auth/*/v3/auth/* 请求,会被 rewrite 加上 /nacos 前缀,最终到达 http://localhost:8848/nacos/v1/auth/*。原因在于 Admin Server 的 servlet contextPath 配置为 /nacos,后端必须带上前缀才能命中路由。
  2. 其余 Console 端 → 8080(Console Server)/v1/v2/v3 开头的业务 API 直接原样转发到 8080。这对应 nacos-console.properties 中的配置 server.servlet.contextPath=${nacos.console.contextPath:}(默认空字符串),即 Console Server 默认不带 contextPath,因此无需 rewrite。

也就是说,README 中"带 /nacos 前缀"与"剥离 /nacos 前缀"的说法,本质是对上述 rewrite 行为的语义化概括:前端请求路径与后端实际路径之间,由代理层完成了前缀的增删适配。若你本地改动了 nacos.console.contextPath 或 Admin Server 端口,需要同步调整这里的分组与 rewrite 规则。

生产构建:tsc 类型检查 + Vite 打包

执行构建:

npm run build

package.json 中 build 脚本完整定义为:

"build": "tsc -b && vite build && rm -rf ../console/src/main/resources/static/next && cp -r dist ../console/src/main/resources/static/next"

流水线分三步:

  1. tsc -b:基于 tsconfig.json 的项目引用模式(tsconfig.app.json + tsconfig.node.json)做增量类型检查与编译,任何类型错误都会中断构建;
  2. vite build:调用 Vite 生产构建,产物输出到 dist/
  3. 自动部署:清空并重建后端静态资源目录 ../console/src/main/resources/static/next(注意该脚本与 README 中的手动两段式命令是等价的两种做法,README 提供手动版以便单独控制部署时机)。

构建产物的分块策略

vite.config.tsbuild.rollupOptions.output 对产物做了精细规划,值得在实际调优时参考:

  • 入口 JS 固定为 js/main.js,chunk 命名为 js/[name].js
  • CSS 固定输出为 css/main.css,其余资源落入 assets/[name]-[hash][extname]
  • 通过 manualChunks 将大体积依赖拆分为独立 vendor chunk:
    • lucide-reactvendor-icons(图标库单独分包,避免拖慢主包);
    • monaco-editorvendor-monaco(Monaco 编辑器体积巨大,必须单独分包并按需加载 worker);
    • react-domreact-routeri18next 等 → vendor-react
    • @radix-uiclass-variance-authorityclsxtailwind-mergevendor-ui
    • react-markdownremark-*@uiw/react-md-editor 等 Markdown 链路 → vendor-markdown

该策略显著减少首屏加载体积、提升浏览器缓存命中率,是大型管理端工程常见的构建优化手法。

部署:静态资源集成进后端

构建产物需要复制到后端 Console 模块的静态资源目录。README 给出的手动部署命令:

rm -rf ../console/src/main/resources/static/next/*
cp -r dist/* ../console/src/main/resources/static/next/

部署后的目录结构(README 描述):

console/src/main/resources/static/next/
├── index.html
├── css/
├── js/
├── img/
├── favicon.svg
└── icons.svg

对照仓库现状,console/src/main/resources/static/next 目录中已包含 index.htmlcss/js/(含 main.js、各页面 chunk 与 vendor-*.js)、img/assets/(Monaco worker 与字体)、favicon.svgicons.svg 等完整产物,说明该部署链路已实际执行过。img/ 中的 nacos-icon.pngindex.html<link rel="shortcut icon" href="/img/nacos-icon.png"> 的引用一一对应。

该部署模式意味着:控制台前端由 Console 后端进程直接托管,浏览器访问 http://<host>:8080/ 即可加载 index.html 及静态资源,无需额外的 Nginx 或 CDN 托管步骤,便于开箱即用与单进程分发。

contextPath 自适应:任意前缀都能跑

README 强调了一个重要设计:构建产物一律使用相对路径(./,因此可以自适应任意 nacos.console.contextPath 配置值,无需为不同前缀重新构建。

该设计的实现位于 vite.config.ts

base: command === 'build' ? './' : '/',
  • 构建时 base 设为 './',Vite 生成的 HTML 中所有资源引用(CSS、JS、图片)均为相对路径,页面无论挂载在 //nacos 还是 /console 下都能正确解析;
  • 开发时 base'/',配合 dev server 的根路径托管。

对应的后端支撑是 nacos-console.properties

server.port=${nacos.console.port:8080}
server.servlet.contextPath=${nacos.console.contextPath:}

即 Console Server 的 contextPath 完全由 nacos.console.contextPath 参数控制(默认空)。前后端配合的结果是:改 contextPath 只需改后端配置并重启,前端产物无需重新构建——这正是相对路径方案的工程价值。唯一需要留意的是:如果生产环境通过代理把 Console 挂载在某个子路径下,需保证代理透传的路径与 nacos.console.contextPath 一致,前端本身无需任何改动。

源码纵深:入口、路由与权限守卫

除 README 覆盖的构建部署链路外,理解工程运行时结构有助于排障与二次开发:

  • 应用入口 src/main.tsx 在挂载 React 前先执行 OIDC Cookie 同步逻辑:从 document.cookie 读取 accessTokenusername,写入 localStoragetoken 结构后删除 Cookie,实现无服务端会话存储、对集群友好的 OIDC 登录态迁移;同时会解析 URL hash 中的 error= 参数并跳转登录页;
  • 路由注册 src/router/routes.tsx 使用 react-router-dom 的懒加载(React.lazy + Suspense)按需加载页面,并在页级路由外围嵌套四类守卫:
    • AuthGuard:校验登录态,同时读取服务端状态判断 nacos.console.ui.enabled 是否开启控制台(关闭时渲染 ConsoleDisabledPage 提示页);
    • GuestGuard:仅未登录可访问的页面(登录/注册);
    • AdminGuard:基于 globalAdmin 标志保护集群管理、用户/角色/权限管理、插件管理等管理面页面;
    • AiGuard:当 nacos.extension.ai.enabled=false 时把 AI 相关路由重定向到默认页面(见 src/router/guards.tsx)。

这些守卫与后端权限插件、nacos.console.ui.enabled 等开关协同,构成了新一代控制台的访问控制骨架。

测试与质量保障

工程使用 Vitest 作为测试框架(vitest^4.1.8),脚本定义在 package.json

"test": "vitest --run",
"test:watch": "vitest"

测试覆盖了 src/api/testssrc/stores/testssrc/lib/testssrc/types/testssrc/utils/tests 等模块,同时 vite.config.ts 中通过 test 段配置了 globals: trueenvironment: 'node',并在 define 中为浏览器环境 polyfill process.env / process.version(用于兼容 swagger2openapi 等依赖 Node 全局的库)。代码质量方面使用 ESLint 9 + typescript-eslint,脚本为 npm run lint

常见问题速查

现象 排查方向
npm install 装不上某些新发布的依赖 检查 npm 版本是否 >= 11;min-release-age=3 会拦截 3 天内发布的包
开发时登录/鉴权接口 404 确认 /v1/auth/v3/auth 是否命中 8848 代理且被 rewrite 成 /nacos 前缀;确认 Admin Server 已启动
配置/服务列表接口 404 确认 Console Server(8080)已启动,contextPath 为空或与代理规则匹配
构建产物部署后样式/资源 404 确认使用了 ./ 相对路径产物(不要手动改 base 为绝对路径),且资源随 static/next 一起被后端托管
修改 contextPath 后页面空白 无需重新构建前端,仅需重启后端使 nacos.console.contextPath 生效,并检查反向代理透传路径一致性
tsc -b 报类型错误 构建流水线会因类型错误中断,先修复类型再执行 vite build

小结

console-ui-next 作为 Nacos 的新一代控制台前端,通过 React 19 + TypeScript + Vite 7/8 + Tailwind CSS 4 + Shadcn/ui 的现代化技术栈,配合 min-release-age 供应链防护、双后端(Admin 8848 / Console 8080)开发代理、vendor 分包构建、相对路径 + contextPath 自适应部署等设计,形成了一套完整且可复用的前端工程范式。本文覆盖的安装、开发、构建、部署全流程均可直接在当前仓库中验证:代理与构建配置见 vite.config.ts,脚本与依赖见 package.json,供应链配置见 .npmrc,后端承载配置见 nacos-console.properties,产物落地位于 console/src/main/resources/static/next。按本指南操作,即可独立完成该控制台前端的本地联调与生产发布。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
899
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
525