Chat2DB Community 前端开发指南:从开发调试、生产构建到桌面打包与源码规范
【免费下载链接】Chat2DBChat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40+ databases, manage data, edit and run SQL, and use your own AI model to generate, explain, and optimize queries. Available on desktop, web, Docker, and CLI, with MCP support.项目地址: https://gitcode.com/GitHub_Trending/ch/Chat2DB
导读
本文以仓库中 chat2db-community-client/readme.md 为骨架,系统讲解 Chat2DB Community 前端(社区版)从环境准备、本地开发、生产构建、Docker 打包、JCEF 桌面打包到质量检查与源码约定的完整工作流。读者读完将掌握:如何用UMI_ENV=community正确选中社区版行为、如何连通社区版后端启动热开发、如何构建并验证生产产物、如何产出桌面安装包,以及社区版代码库的命名与主题、i18n 规范。文中所有命令均来自当前仓库的 package.json 与各脚本实现,可直接在仓库中验证执行。
一、技术栈与社区版选型机制
Chat2DB Community 前端基于Umi 4 + React + TypeScript + Ant Design 5 + Zustand构建。从 package.json 的依赖声明可以看到核心选型:
umi^4.0.87:应用框架与构建器;react/react-dom^16.8.0(peer)、antd~5.24.1:UI 层;zustand^4.4.4:轻量状态管理;monaco-editor^0.52.0:SQL 编辑器内核;@visactor/vtable、@xyflow/react、echarts等:表格、流程图、图表能力。
社区版与商业版的差异不是通过单独的代码目录硬隔离,而是通过UMI_ENV=community环境变量在构建/启动期选中社区行为。其行为定义集中在两个关键文件:
- src/product.community.ts(仓库根目录的 product.community.ts 同源)定义了社区版的产品级配置:
product: 'community'、默认应用名chat2db-community、本地存储前缀Chat2DB_Community_、开发代理目标http://127.0.0.1:10825等。 - src/client-runtime/index.ts 定义了
clientRuntime运行时开关,例如:社区版usesFixedIdentity: true(固定身份)、requiresAuthentication: false(免登录)、requiresLicenseActivation: false(免 License)、enableTeamWorkspace: false(无团队空间)、showMcpSetting: isDesktop(仅桌面端显示 MCP 设置)等,并用Chat2DB_Community_*前缀隔离各 Zustand store 的持久化键。
社区版导航行为则由 src/client-extension/community.tsx 提供:useCommunityNavigationItems直接原样返回导航项(不做商业版过滤),并通过 src/client-extension/index.ts 统一导出。
二、环境要求与依赖安装
按照 readme.md 的 Requirements 一节,开发前需要满足:
| 项目 | 要求 | 依据 |
|---|---|---|
| Node.js | 18.17.0 或更高 | package.json的engines.node: ">=18.17.0" |
| 包管理器 | Yarn,且必须使用仓库自带的yarn.lock | readme.md;仓库只维护 Yarn lockfile |
| 后端 | 运行社区版后端(开发服务器需要) | readme.md;默认代理到127.0.0.1:10825 |
在 chat2db-community-client 目录下安装依赖:
yarn install --frozen-lockfile重要约束:不要生成 npm 或 pnpm 的 lockfile。仓库仅维护 Yarn lockfile,混用包管理器会导致依赖版本漂移。
--frozen-lockfile保证安装结果与yarn.lock完全一致,适合 CI 与本地可复现构建。
安装完成后,postinstall钩子会自动执行umi setup(见 package.json 的postinstall脚本),生成 Umi 运行时所需文件。
三、本地开发:社区版热开发模式
3.1 先启动后端
社区版开发服务器会把 API 请求代理到后端。后端默认监听127.0.0.1:10825,这与 product.community.ts 中的defaultProxyTarget一致。请先在仓库后端模块(如 chat2db-community-server/chat2db-community-start)启动社区版后端。
3.2 启动前端开发服务器
yarn run start:community:hot对应 package.json 中的start:community:hot:
cross-env UMI_ENV=community APP_NAME=chat2db-community DISABLE_MFSU=true \ UMI_DEV_SERVER_COMPRESS=none HOST=127.0.0.1 PORT=8889 \ node --require ./scripts/bind-dev-server-loopback.cjs ./node_modules/umi/bin/umi.js dev --public_path=/要点解读:
UMI_ENV=community:选中社区版产品配置(对应product.community.ts);HOST=127.0.0.1 PORT=8889:社区版开发服务器固定监听 8889 端口,仅绑定回环地址;DISABLE_MFSU=true、UMI_DEV_SERVER_COMPRESS=none:关闭 MFSU 增量编译与压缩,便于热更新调试;--require ./scripts/bind-dev-server-loopback.cjs:注入回环绑定补丁。
启动成功后,浏览器访问http://127.0.0.1:8889。
3.3 端口绑定补丁的原理
scripts/bind-dev-server-loopback.cjs 是一个精妙的 Node 层猴子补丁:它重写了http.Server.prototype.listen,当检测到这是 Umi 的listen(port)调用(第一个参数是数字且只有一个参数或回调参数)时,会把HOST(127.0.0.1)插入为监听地址;若 Umi 的 portfinder 因端口占用而改选了其他端口,则直接抛错而不是静默换端口:
if (args[0] !== port) { throw new Error(`Umi selected fallback port ${args[0]}; configured port ${port} is unavailable`); }这保证了社区版开发服务器始终只暴露在127.0.0.1:8889,不会意外飘到0.0.0.0或其他端口,是安全性优先的设计。
四、生产构建
4.1 构建命令
yarn run build:web:community --app_version=5.3.0对应脚本build:web:community:
cross-env UMI_ENV=community APP_NAME=chat2db-community \ APP_VERSION=${npm_config_app_version} PRINT_LOGS=${npm_config_print_logs} \ APP_PORT=${npm_config_app_port} umi build--app_version=5.3.0:以 npm config 方式注入版本号APP_VERSION,最终会体现在应用的版本信息(如clientRuntime.localAppConfig.version,见 src/client-runtime/index.ts);- 可选参数:
--app_port、--print_logs可对应覆盖APP_PORT、PRINT_LOGS。
4.2 构建前自动执行的质量门槛
生产构建并非直接打包,prebuild:web:community钩子会先串行执行数十项社区版专项测试,覆盖树加载、数据源身份、SQL 执行流、结果集 UI、i18n、社区边界等(见 package.json 的prebuild:web:community),例如:
test:community-boundary:执行 scripts/verify-community-boundary.cjs;test:database-capabilities:跑 src/utils/databaseJudgments.test.ts;test:sql-execution-stream:跑 src/service/sqlExecutionStream.test.ts;test:data-source-authorization:跑 src/utils/dataSourceAuthorization.test.ts。
任何一项失败都会中止构建,从流程上保证产物质量。
4.3 构建后校验
构建完成后,postbuild:web:community会自动执行 scripts/verify-production-bundles.cjs,扫描dist/下所有 JS 产物,检查两类 Webpack 异常模式:
class extends null(类继承自 null);unused pure expression or super(Webpack 生成的非法 innerGraph 占位符)。
发现任一模式即以非零码退出,防止坏产物被发布。
4.4 产物与落盘位置
构建产物写入 chat2db-community-client/dist 下的dist/目录。若要做 Web/Docker 包,需要把产物暂存到 Spring Boot 模块的静态资源目录:
chat2db-community-server/chat2db-community-start/src/main/resources/static/front/ chat2db-community-server/chat2db-community-start/src/main/resources/thymeleaf/index.html对应build:web:2java脚本会自动完成「构建 + 清理 thymeleaf 目录 + 拷贝dist/index.html」的衔接。若不想手工暂存这些文件,推荐直接用仓库根目录下的./docker/docker-build.sh(见 docker/docker-build.sh)一键完成前端、后端与镜像的整体构建。
五、JCEF 桌面打包
社区版桌面端基于 JCEF(Java Chromium Embedded Framework),打包入口是仓库本地的脚本:
script/package/package-community-jcef.sh 5.3.0 prepare- 必须在仓库根目录执行(对应脚本位于 script/package/package-community-jcef.sh);
- 第一个参数为版本号(如
5.3.0); - 第二个参数为动作:
prepare只做打包前的准备(生成 jpackage 输入);在对应操作系统上替换为mac/linux/win即可产出原生安装包; - 生成的输入与安装包写入
jpackage/目录(如 jpackage/input/icons/community),这些不是前端源码文件,可随时重建。
桌面端还涉及平台差异逻辑,例如 src/utils/env.ts 的isDesktop判断会影响showMcpSetting、showNetworkProxySetting等运行时开关;更详细的 JCEF 开发说明可参考 docs/guides/community-jcef-development.md。
六、质量检查命令
readme.md 的 Checks 一节给出四条核心检查:
yarn run lint yarn run test:i18n yarn run test:result-markdown yarn run test:sql-in-clipboard逐一说明:
| 命令 | 对应脚本 | 作用 |
|---|---|---|
yarn run lint | lint:eslint+lint:style | ESLint 检查src/**/*.{js,jsx,ts,tsx}(--max-warnings=0,零警告准入)+ Stylelint 检查src/**/*.{css,less}(同样零警告) |
yarn run test:i18n | scripts/validate-i18n.cjs | 校验 i18n 文案契约(见下节) |
yarn run test:result-markdown | src/blocks/SearchResult/components/ResultSetTable/event/onContextmenuCell/handleCopyAsMarkdown.test.ts | 验证结果集「复制为 Markdown」功能 |
yarn run test:sql-in-clipboard | src/utils/sqlInClipboard.test.ts 等 | 验证 SQL 写入剪贴板相关行为 |
除此之外,package.json 还提供了上百个细粒度测试脚本(如test:redis-explorer、test:terminal、test:task-center、test:import-preview、test:sse-request等),覆盖各功能模块,可在改动对应模块时单独执行。
七、源码约定
7.1 命名约定
- TypeScript 接口与类型别名统一以
I前缀命名(interface / type alias 均适用)。仓库中大量类型遵循此约定,例如 src/typings/connection.ts、src/typings/database.ts 中的IConnection、IDatabase一族。
7.2 主题变量约定
- JS 中读取
window._AppThemePack提供的值; - 样式中使用CSS 变量(如
var(--control-item-bg-active)),禁止硬编码主题色。
主题变量定义集中在 src/styles/var.less 与 src/styles/var.ts,主题切换逻辑可参考 src/theme 与 src/components/AppTheme。这样在明暗主题切换或自定义主题包(_AppThemePack)注入时,界面颜色能随主题联动。
7.3 i18n 约定
- 文案 key 统一取自 src/i18n/ 目录(当前含
en-US、es-ES、ja-JP、ko-KR、zh-CN五个语言包,每语言 20 个模块文件); - 通过
i18n或i18nElement使用;占位符统一用{1}、{2}…编号形式,不使用具名插值; - 西班牙语与韩语目录必须与
en-US保持严格的「模块、key、占位符、HTML 标签」四方对齐;每当对应英文文案变化时,必须同步更新翻译并更新源码哈希。
这套契约由 scripts/validate-i18n.cjs 在yarn run test:i18n时强制执行,其校验逻辑包括:
- 模块对齐:
es-ES、ko-KR的模块文件列表必须与en-US完全一致; - key 集合对等:双向比对,目标语言缺失 key 或多了意外 key 均报错;
- 字符串契约:用正则提取
{\d+}占位符与 HTML 标签并排序比对,顺序不一致即报错(因为{1}/{2}顺序影响渲染结果); - 静态约束:每个 locale 模块必须是静态字符串对象字面量,支持字符串拼接,但不允许动态表达式;
- 源码哈希门禁:以
en-US为基准计算每个模块的 sha256(算法见 scripts/validate-i18n.cjs 的moduleHash),与 scripts/i18n-source-hashes.json 中记录的哈希比对,英文文案一旦变化而未更新翻译,构建即失败; - 服务端联动:还会校验 Spring Boot 侧的
messages_*.properties资源包(位于 chat2db-community-server/chat2db-community-start/src/main/resources/i18n 与 chat2db-community-server/chat2db-community-jcef/src/main/resources/i18n),以及各 README 的语言导航链接完整性。
7.4 社区版边界约束
除 readme 中列出的约定外,社区版还有一道硬性边界检查:scripts/verify-community-boundary.cjs 在构建前执行,它会:
- 检查
src/中是否存在商业版专属目录(如src/blocks/PersonalCenter、src/blocks/Setting/License、src/pages/login、src/service/license.ts等 45 个路径); - 扫描全部生产代码文件(前端
src/与后端src/main下的 html/java/properties/xml/yaml)是否包含商业标记(如ENTERPRISE_DELIVERY、RuntimeEditionConfig、chat2db-pro、/api/enterprise等); - 校验
package.json中不得暴露build:*:pro/local/enterprise/delivery之类的商业版脚本。
任何命中都会以异常终止构建,从机制上保证社区版产物不掺杂商业实现。
八、常见问题与排查建议
| 现象 | 排查方向 |
|---|---|
| 开发服务器起在别的端口或无法访问 | 检查127.0.0.1:8889是否被占用;回环补丁 scripts/bind-dev-server-loopback.cjs 会在端口被占时直接报错,此时释放端口即可 |
| 页面接口 404 / 401 | 确认后端已启动在127.0.0.1:10825,且是社区版后端;代理目标定义在 product.community.ts 的defaultProxyTarget |
| 构建失败于 prebuild 测试 | 按报错定位到对应*.test.ts,例如test:data-source-identity涉及 src/utils/dataSourceIdentity.test.ts 等多个测试文件,本地先跑单一测试脚本定位 |
test:i18n报 "English source changed" | 英文文案被改动后未同步西/韩翻译,更新 src/i18n/es-ES 与 src/i18n/ko-KR 对应模块,并通过yarn run test:i18n -- --write-source-hashes刷新哈希 |
| 新增文案不生效 | 确认使用i18n/i18nElement且 key 存在于 src/i18n/en-US,占位符使用{1}、{2}编号形式 |
结语
Chat2DB Community 前端以「Umi 4 + React + TS + Ant Design 5 + Zustand」为底座,通过UMI_ENV=community在构建与运行期选择社区行为,配合开发回环绑定、构建前测试门槛、产物合法性扫描、i18n 契约校验与社区边界检查等一系列工程化机制,形成了一条可复现、可审计的社区版前端流水线。无论是本地热开发(start:community:hot,8889 端口)、生产构建(build:web:community)、一键 Docker 整体构建(./docker/docker-build.sh)还是 JCEF 桌面打包(script/package/package-community-jcef.sh),都可以直接在本仓库中按命令落地执行。
【免费下载链接】Chat2DBChat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40+ databases, manage data, edit and run SQL, and use your own AI model to generate, explain, and optimize queries. Available on desktop, web, Docker, and CLI, with MCP support.项目地址: https://gitcode.com/GitHub_Trending/ch/Chat2DB
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考