Project Map · Dependencies

动它之前,需要什么

分两层:功能靠什么才能跑(账号、服务、平台、前置操作), 以及代码装了哪些包、哪些能动哪些不能。

基线:2026-08-12 的 gameboxclient 工作区快照。 「是否被引用」是当时用 grep 逐个包核过的,含 extend/worker/ 里的纯 Node 脚本。

先说人话:为什么要分成两层

问「这个项目有哪些依赖」,通常回答的是 package.json 里那 121 个包。 但你接手后真正会被绊住的,八成不是包的问题

真正会绊住你的是这种事:改完一条 NPC 配置点保存,报错; 你以为是代码写错了,查半天才发现是当时选的服务器不对。 或者点发布毫无反应,最后发现是登录接口没给你下发 Jenkins token

这类「A 功能要先有 B、还要有某个账号、还只能在 Windows 上跑」的关系, 在代码里到处散落,没有任何一处集中写着。所以这一页把它放在最前面

一、功能依赖:谁靠谁才能跑

FIG. 06依赖倒下时,什么跟着倒

登录成功 /user/login → /user/info 会话 token 守卫放行的凭证 GameEvn.ENV 凭据包 userInfo.game → initEnv() 服务器列表 defaultServerId GM 地址 + pcode 测试 / 正式二选一 Jenkins 凭据 url · account · token SVN 凭据 url · 账号 · 密码 COS 密钥 SecretId / SecretKey 配置表编辑 表编辑 · 错误日志 脚本管理 · 全局数据 GM 工具 发布:Jenkins 型 编译资源 · 同步 · 热更 构建 APP 发布:SVN 型 提交本地资源改动 还需可执行的 svn 二进制 查找文件 资源上传 / 下载 cosDownload 平台闸门:必须 Windows extend/ 下 16 个 .exe 与登录无关,Mac 上无解 地图转换 · 动画转换 · lua 读写 · 图片转换 本地预览(QNnginx + QNnode) · 7-Zip 压缩 且解释器路径当前是断的,见下文 任何一列的凭据缺失,该列功能全部哑火 —— 而且多数是 静默失败 ,不报错

这张图最该记住的是那个根节点。 排查任何「点了没反应」的问题,第一步不是看功能代码, 是确认登录有没有真的成功、以及 /user/info 有没有下发该给的配置。

功能依赖明细表

「缺了会怎样」这一列是排障时最有用的 —— 大部分缺失都不会弹错误,只是安静地什么都不发生。

功能 前置功能 要账号 / 凭据 要外部服务 平台 缺了会怎样
登录 GameBox 账号密码 用户中心 /user/login + /user/info 任意 停在登录页,守卫把所有路由打回 /login
任何业务页 登录 会话 token 任意 重定向回登录页并带 ?redirect=
字段表单渲染 登录 + table store 初始化 任意 schema 为空 → 表单渲染成空白。注意 init 在登录后延迟 1500ms 才跑, 这期间进编辑页可能拿到空 config
配置表编辑 登录 + 选服 pcode(登录下发,选服时会改写) GM 接口 /1000y/engine/cmd 任意 请求打到错的服,或 excelToken 校验不过 → 数据空白或报错
表编辑(Excel) 登录 + 选服 同上 同上 任意 同上;另外从 /expert/* 跳进来会先弹确认框
Excel 独立小窗 先打开表编辑页 会话数据经 IPC 传入 任意 会话没传过去 → 小窗停在空白或被守卫踢回; 小窗里的路由被 docView() 单独管制
GM 工具 登录 + 选服 VITE_API_GM_PCODE(选服时按版本计算) GM 接口 任意 没选服时该键是空串 → 请求带不上 pcode,服务端拒绝
错误日志 / 脚本管理 / 全局数据 登录 + 选服 各自独立的 pcode 键 GM 接口 任意 这三个各用一套 pcode(GM / SCRIPT / SECTCONFIG),互相不通用
发布 · Jenkins 型 登录 + 当前没有别的构建在跑 Jenkins url / account / token(登录下发) Jenkins 服务器 + 对应 job 存在 任意 凭据缺失 → Jenkins 客户端根本没被创建,点了静默无反应; job 不存在 → 轮询永远等不到结果
发布 · SVN 型 登录 + 同上闸门 + 本地已有工作副本 SVN url / 账号 / 密码(登录下发) SVN 仓库可达 需要可执行的 svn 二进制 Mac arm64 上 extend/Svn/Mac/Arm64/1.14.2/bin/svn 没有可执行位 → exec 直接失败
资源下载 / 解压 登录 资源地址(多由接口下发) 资源服务器 任意 主进程 fork 子进程干活,进度经 IPC 回传; 子进程崩了界面上的进度条会停住不动
文件上传 / 下载(COS) 登录 COS SecretId / SecretKey 腾讯云 COS 任意 COS_Handler.init() 内部 try/catch 吞掉异常并 return false —— 初始化失败完全没有提示
地图转换 / 动画转换 登录 仅 Windows extend/Python/**/*.exe;而且解释器路径当前指向不存在的目录, 所有平台都跑不通(见下方红框)
本地预览(nginx) 登录成功时自动拉起 仅 Windows ReLogin/index.vue:256initNginx()initNginx.exe;Mac 上失败但不影响登录本身
7-Zip 压缩 仅 Windows 代码里写死 ./7zip-bin/win/7za.exeAnimation/security.ts:280,334

❌ 别学

凭据缺失一律静默失败。 src/utils/extend/jenkins/index.ts 里所有导出函数都写成 _buildService?.start(...) 这种可选链形式 —— 客户端没初始化时表达式求值为 undefined,函数正常返回, 没有任何异常、没有任何日志COS_Handler.init() 同理:catch 里直接 return false,没人检查这个返回值。

规范做法是「快速失败」:初始化时凭据不全就抛, 或至少在 UI 上标出「Jenkins 未连接」,让用户知道点了也没用。

你现在能做的:JSON.parse(localStorage.getItem('GameENV')) 当成排障第一条命令。这一条能省掉你未来几十次的无效排查。

❌ 别学

Python 工具链的解释器路径指向不存在的目录。 src/utils/extend/python.ts:34-41 按平台拼解释器路径: Windows 用 extend/Python/Win/3.11/python.exe, Mac arm64 用 extend/Python/Mac/3.8/bin/python3。 但当前 extend/Python/这两个目录都不存在 —— 实际只有 move/ luaTrans/ Script/ mapMask/ transPlist/, 里面是 16 个 .exe 和 3 个 .py

合理的猜测是:这些脚本已经被 PyInstaller 之类打包成独立 exe,不再需要外部解释器,而 python.ts 里的 command 拼接是遗留代码。 但这只是猜测,没有证据。

这是你上手后最该优先问清楚的技术问题之一。 在拿到答案前不要自己改路径 —— 你可能只是把一个「明显坏掉」变成「悄悄坏掉」。

二、技术依赖:装了什么,能不能动

package.json62 个运行时依赖 + 59 个开发依赖。 下面按用途分组,重点标出能不能升级是不是真的在用

2.1 核心框架 —— 都别乱动

版本 干什么 能不能动
vue ^3.3.4 渲染层框架 ⚠️ 小版本可升,大版本没有
vite 4.1.4(精确锁定,无 ^) 构建工具 ❌ 锁死。和 vite-plugin-electron@0.11rollup@3 是一套,动一个全炸
typescript 4.9.5(精确锁定) 类型检查 ❌ 锁死。升级会让 vue-tsc 现有的错误数量剧变, 而验收标准是「不新增错误」
electron ^21.4.4 桌面运行时 ❌ 别动。这是2022 年的版本, 升级会连带影响 @electron/remotenodeIntegration 行为和打包配置
electron-builder ^23.6.0 打包分发 ❌ 与 electron 版本绑定
pinia ^2.1.6 状态管理(22 个文件在用) ⚠️ 可升 2.x,Pinia 3 需要 Vue 3.4+
vue-router ^4.2.5 路由(hash 模式) ✅ 相对安全
element-plus ^2.14.3 UI 组件库,204 个文件在用 ⚠️ 用得太深,升级要全量回归
@intlify/unplugin-vue-i18n ^0.8.2 i18n 构建插件 ❌ 别动。git 历史里有一次专门的 fix(deps): 锁定 @intlify 版本…修复项目无法启动
vite-plugin-style-import 2.0.0(精确锁定) Element Plus 样式按需引入 ❌ 锁死

2.2 按用途分组

用途 说明
网络 axios · qs 只在 src/config/axios/ 里封装,业务层不直接用
加密 crypto-js · js-sha256 · js-base64 登录密码摘要与 excelToken 生成
Electron 生态 @electron/remote · electron-log · electron-updater electron-log主进程日志的唯一出口,排障必看
外部工具 node-svn-ultimate · jenkins 各 2 个文件在用,都在 src/utils/extend/
对象存储 cos-js-sdk-v5(腾讯) · ali-oss(阿里) 两套并存,各 1 个文件在用。COS 是主力,OSS 疑似历史遗留
压缩归档 adm-zip · archiver · jszip · unzipper · unzip-stream · 7zip-min · yauzl 七个压缩库yauzl 只被 extend/worker/ 的子进程脚本用, 别因为 src/ 里搜不到就删掉
表格 / Excel xlsx(3 处) · x-data-spreadsheet(2 处) 专家模式的表编辑功能
图形 konva(地图编辑画布) · fabric · ol / OpenLayers(Map/components/mapLoad2.vue 等) 三套画布库并存,各管一块,改地图相关功能前先确认在哪一套上
新手引导 intro.js(3 处) · shepherd.js(1 处) 两套引导库并存
文件系统 fs-extra(13 处,用得最多) · rimraf(4 处) · image-size 渲染层直接用 Node fs,这是 nodeIntegration 的直接后果
工具库 lodash + lodash-es两个都装了) · moment · mitt · web-storage-cache · nprogress moment 已停止维护,新代码建议用原生 Intl.DateTimeFormat

2.3 装了但一行没用的包

下面这些在 dependencies 里,但 src/electron/extend/worker/ 三处 全文搜不到任何引用。它们仍然会被打进安装包,白白增加体积。

本来是干什么的 处置建议
mockjs 接口 mock ✅ 可删。vite-plugin-mock 也在 devDeps 里但 vite.config.ts 没启用
vue-audio-player + @liripeng/vue-audio-player 音频播放,装了两个 ✅ 两个都可删
@esotericsoftware/spine-player Spine 骨骼动画播放 ⚠️ 动画模块有 6038 行,先确认是不是通过别的方式加载(比如全局 script)
vxe-table · xe-utils 表格组件 ✅ 疑似被 Element Plus 表格取代
node-xlsx Excel 读写(xlsx 已经在用了) ✅ 可删
ncp · execa 文件复制 / 进程执行 ✅ 已被原生 fs-extrachild_process 取代
html2canvas DOM 截图 ✅ 可删
vue3-menus 右键菜单 ✅ 可删
electron-store 主进程持久化配置 ✅ 可删。配置目前全走 localStorage —— 这也是凭据明文落盘的根因
@iconify/iconify · iconv-lite 图标运行时 / 编码转换 ⚠️ 可能被构建插件间接使用,删前先跑一次完整构建
7zip-bin 7-Zip 二进制 ⚠️ npm 包没被 import,代码直接走 extend/7zip-bin/win/7za.exe 这个路径。 npm 包看起来是冗余的,但确认前别删
electron-icon-builder 生成应用图标 ⚠️ 是 npm run electron:generate-icons 的工具, 应该在 devDependencies 里,现在在 dependencies

删包之前

本项目大量使用动态 require() 和路径拼接,静态搜索会漏。 安全的做法是:删一个 → npm run build:pro 跑通 → npm run ts:check 错误数不增 → 真机走一遍主流程。 一次只删一个,别批量。

2.4 依赖治理上的几个问题

❌ 别学

stylelint 同时出现在 dependenciesdevDependencies 里,而且版本范围不同^15.11.0 vs ^15.10.3)。 stylelint-config-prettier 同样两边都有, 且 dependencies 里写的是 "latest"

后果:lint 工具被打进生产包; "latest" 意味着不同时间装出来的依赖树可能不一样, 「我这能跑你那不能跑」的经典成因。

规范做法:lint / 构建工具一律进 devDependencies, 版本一律用确定的范围,永远不写 latest。 这条改动风险低、收益明确,适合作为你的第一个正式提交

❌ 别学

.npmrc 在当前工作区里不存在了。 git 历史里有一次提交 chore(npm): .npmrc 增加 legacy-peer-deps,让裸 npm i 也能装上, 但新版本把它删掉了。

后果:直接跑 npm i 会因为 peer dependency 冲突失败。 必须跑 npm i --legacy-peer-deps,或者用 package.json 里已有的 npm run i (它等于 npm i --legacy-peer-deps && npm run cpsvn)。

建议:.npmrc 加回去。这是新人上手的第一道坎, 没人会想到去翻 package.json 里那个只有一个字母的脚本名。

⚠️ 隔离

Node 版本没有任何约束文件。 package.jsonengines 写着 node >= 14.18.0,但 devDependencies 里又装了一个 "node": "^22.13.0"(把 node 本身当 npm 包装, 这个写法本身就很可疑),而仓库里没有 .nvmrc 也没有 .node-version

后果:每个人用的 Node 版本都不一样, 原生模块(node-svn-ultimate 之类)编译结果也就不一样。 「别人能跑我不能跑」优先怀疑这里。

规范做法:加一个 .nvmrc, 写死团队统一的 Node 大版本,并让 engines 与之一致。

还有两个小问题:package.json"prepare": "husky install""lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js" 都指向 .husky/,但这个目录在当前工作区里已经不存在 —— 提交钩子实际上是失效的。

2.5 外挂二进制 extend/

这些不走 npm,是直接放在仓库里、随安装包分发的可执行文件。 electron-builder.json5files 里显式包含了 extend,并在 asarUnpack 里解包, 这样运行时才能用真实路径调用它们。

目录 是什么 谁在用 状态
extend/worker/ 6 个纯 Node 脚本:download / decompress / unzip / spwandownload / spwanUnZip / spwanUnZip7Z 主进程 fork 出来跑 ✅ 是 JS,能读能改。唯一一处你能轻松改的「外部工具」
extend/Svn/ 便携版 SVN 客户端,分 Mac/Win/ src/utils/extend/svn.ts ❌ Mac arm64 的二进制没有可执行位-rw-r--r--), SVN 链路在 Mac 上直接失败
extend/Python/ 16 个 .exe + 3 个 .py src/utils/extend/python.ts ❌ 代码要找的 Win/3.11/Mac/3.8/ 两个目录都不存在
extend/map/ · extend/TiledMap/ 地图资源生成与编辑工具(exe) 地图模块 ⚠️ 仅 Windows
extend/QNnginx/ · extend/QNnode/ 便携版 nginx 和 node 登录时 initNginx() 拉起,做本地资源预览 ⚠️ 仅 Windows(nginx.exe / node.exe
extend/7zip-bin/ 7-Zip Animation/security.ts ⚠️ 只有 win/ 目录,没有 Mac 版
extend/config/ · extend/localTableHeader/ · extend/delData/ · extend/files/ 随包分发的 JSON 配置与素材 运行时读取 ✅ 纯数据。localTableHeader/ 按渠道名取文件, 渠道对不上会静默读取失败

结论:这是一个 Windows 优先的工具

把上面几行连起来看:SVN 二进制、Python exe、地图工具、nginx、node、7-Zip —— 可执行的外部工具几乎全是 Windows 版

在 macOS 上你能做的是:跑起来、登录、改配置表、看代码、做定位。 做不了的是:SVN 提交、地图/动画转换、本地预览、打正式包。

所以「要不要申请一台 Windows 机器」不是偏好问题, 是能不能完整履行这个岗位职责的问题。 这条应该写进你的第一周汇报。