# 我把 GitHub 全球第一装进电脑以后，先撞上了一把收费的门锁

今天排在 GitHub Trending 全球榜首的项目叫 God’s Eye View。它想把飞机、船舶、卫星、地震、火灾、交通和城市摄像头放进同一张 3D 地图。项目页面很抓人，地球能转，目标能追，数据层也多。拿它做视频很容易，录一段画面，再把功能念一遍就够了。

我们今天换了一种做法。

剑的 AI 实验室已经把每天的工作定下来了。先从 GitHub Trending 找十个项目，收进项目库，再选当天排名最高且没有重复的一个，放进实验田。热度只负责把项目送到门口。后面还要安装、检查、跑测试、做出东西，最后才能写报告和拍视频。

God’s Eye View 正好成了第二个完整实验。它也很快暴露出一个问题。一个项目能在 GitHub 上冲到第一，和一名普通用户今天能不能用上，是两回事。

## 先把版本钉住

这次测试固定在提交 `b22573a9db28e47c324821ebdd4c67bdb241c0e1`。测试环境使用 Linux、Node.js 24.19.0 和 npm 11.9.0。

我先读了 README、TESTING.md、SECURITY.md、DATA_SOURCES.md 和 package.json。项目要求 Node.js 24.14.x 或 26.x。这个限制写得很清楚，版本不合适，安装阶段就可能出问题。

它也不是一张做给人看的静态网页。源码里有 315 个文件，测试和质量检查脚本有 51 个。Vite 负责网页和本地代理，Cesium 负责 3D 地球。飞机、船舶、卫星、地震、火点和交通各有自己的数据入口。

这类项目最容易让人忽略的东西是外部服务。界面看起来像一个完整产品，背后接了 Google Maps、OpenAI、OpenSky、AISStream、NASA FIRMS、TomTom、CelesTrak、OSM、Open-Meteo、GDELT 和 Radio Browser 等许多服务。它可以本地启动，数据却并不都在本地。

## 安装和构建过了

第一遍安装使用 `npm ci --ignore-scripts`，先隔离依赖里的安装脚本。确认来源以后，再按官方方式执行 `npm ci`。两次安装都成功，共装入 201 个包。

根项目没有 preinstall、install 或 postinstall。传递依赖里仍有四个包会运行安装脚本，分别是 esbuild、fsevents、Puppeteer 和 sharp。这些脚本主要处理平台二进制、浏览器和图像组件。它们有正常用途，也说明安装过程不能被写成完全没有脚本。

生产依赖的 npm audit 结果为零个已知漏洞。源码扫描没有发现硬编码的真实密钥。这个结果只能说明常见密钥模式和 npm 漏洞库没有报错，不能代替完整的安全审计。

构建更直接。`npm run build` 退出码为零，Vite 用 6.67 秒生成了约 31 MB、419 个文件。构建时出现两个值得记下的警告。部分 Node 模块被外部化，几个包的体积超过 1.5 MB。最大的一项来自地球重力模型，压缩前约 2.77 MB。构建没有失败，首屏加载和代码拆分仍值得作者继续处理。

## 2588 个断言通过，测试命令却没有结束

官方测试先给出 2587 个断言全部通过，随后又跑了一项 focus allocation 检查，同样通过。眼前能看到的总数是 2588，失败数为零。

问题出在测试结束以后。进程没有自然退出。等了九十多秒，仍然挂在那里，只能人工中断，最终退出码是 130。

所以这项结果要分开写。测试断言全部通过，这是事实。官方 `npm test` 在当前环境没有完整结束，也是事实。报告若只写一句“全部测试通过”，会把后半截藏掉。对维护者来说，这通常意味着仍有句柄、子进程或连接没有关闭。它未必影响产品使用，却会影响 CI、自动化和后来接手的人。

## Google Maps Key 拦住了主界面

接下来清空 Google、OpenAI、AIS、Cesium、TomTom 和 FIRMS 等环境变量，再启动本地服务。

网页外壳可以返回 HTTP 200。OpenAI 端点明确返回 503，并写明没有设置 OpenAI Key。Google Places 和 AISStream 也会给出清楚的缺钥匙提示。FIRMS 与 TomTom 的状态端点还能正常回答，TomTom 没有密钥时允许使用模拟交通。

主界面走不到这一步。`src/main.js` 初始化时会检查 `GOOGLE_MAPS_API_KEY`。没有这项配置，代码直接抛错，主要的 3D 地球界面不会出现。

Google Maps Key 还需要开启相应 API 和计费。它会进入浏览器，用户能在开发者工具里看到，因此必须限制来源、限制可调用的 API，并设置预算和配额。Cesium ion Token 也有类似的浏览器可见问题。OpenAI、AISStream 和 OpenSky 等服务端密钥由本地代理读取，边界相对清楚。

README 里关于多数地球功能可以零密钥使用的说法，很容易让普通用户理解成下载后就能看到主界面。当前这次固定版本没有做到这一点。零密钥可以安装、构建、跑逻辑测试，也可以检查部分接口。想进入核心的摄影级 3D 地球，Google Maps Key 是硬条件。

这个差别会直接影响用户。看完演示再动手，用户还要创建云项目、开计费、限制密钥、设预算。对有经验的开发者，这些步骤不算难。对第一次接触 Google Cloud 的人，它足以让一次试用停下来。

## 浏览器验收没有硬写成通过

项目提供了 `npm run test:track`，用于检查 3D 跟踪和浏览器交互。第一次运行时，本地服务没有启动，脚本正确报出服务器不可达。启动服务以后，脚本找到了 Puppeteer 下载的 Chrome，Chrome 随后因为当前容器禁止创建进程单例 socket 而崩溃，退出码为 2。

这项失败来自测试环境权限，不能据此判断项目界面坏了。它也不能被改写成视觉检查通过。

因此本次没有验收 WebGL、地图瓦片、拖动、目标聚焦和真实数据叠加，也没有生成可以代表完整运行状态的界面截图。要补完这部分，需要一台能启动 Chrome 和 WebGL 的桌面环境，再配置一枚受限制并设好预算的 Google Maps Key。

## 这个项目最值得学的地方

God’s Eye View 对数据真假处理得比很多演示项目认真。官方文档把 live、modeled、reconstructed 和 simulation 分开。交通没有 TomTom Key 时会标为模拟。某些数据源受限时，端点会明确返回缺少配置。这个方向值得保留。

它的安全边界也写得比较坦白。项目默认绑定本机，部分代理限制了目标地址、协议、重定向和私有网络。SECURITY.md 直接说明这是一套本地探索工具，没有按生产服务做全面加固。用户若把 Vite 服务开放到局域网或公网，别人可能调用代理并消耗他的额度。

它目前最该补的是第一次启动。项目可以在缺少可选服务时逐项降级，主界面却被 Google Maps Key 一次拦住。作者如果能提供一个可用的 OSM 首次启动模式，让用户先看到地球和基础数据层，再决定是否接入摄影级 3D 地图，试用门槛会低很多。README 也应把 Google Maps Key 的硬要求、计费和浏览器可见性放到安装步骤前面。

## 我们的网站也暴露出一个缺口

这次实验让剑的 AI 实验室的流程更清楚了。项目库不能只放简介和 Star。一个项目进入实验田以后，至少要分别记录代码检查、自动测试、外部服务、真实界面和产物。某一步受密钥或环境阻塞，状态必须停在“待补条件”，不能顺手改成“已实测”。

收成区也要让读者一眼分清三类结果。第一类已经通过。第二类明确失败。第三类因为缺少条件而没有完成。God’s Eye View 这次三类都有，正适合拿来检验这套记录方式。

目前能下的结论很明确。这个仓库工程量大，安装和构建可靠，可见的 2588 个测试断言全部通过。它的密钥边界和数据标签有不少值得借鉴的地方。普通用户若没有一枚已开计费的 Google Maps Key，今天还进不了核心 3D 体验。浏览器视觉与真实数据也没有在本次环境中验收。

我们会保留这份不完整。等桌面浏览器和受限制的 Google Maps Key 准备好，再补最后一段。真实实验允许暂时没有漂亮结局。

## 资料

- [God’s Eye View 仓库](https://github.com/bilawalsidhu/gods-eye-view)
- [官方测试说明](https://github.com/bilawalsidhu/gods-eye-view/blob/main/TESTING.md)
- [官方安全说明](https://github.com/bilawalsidhu/gods-eye-view/blob/main/SECURITY.md)
- [数据源说明](https://github.com/bilawalsidhu/gods-eye-view/blob/main/DATA_SOURCES.md)
