← 回成果库

全球资产实时仪表盘 · 部署上线报告


一、这个项目原本上不了线,难点在哪

主席上传的是一个全栈应用,不是一个网页文件:

组成技术上线障碍
前端Vite + React 19 + TypeScript + Tailwind + lightweight-charts需要编译,不能直接丢上去
后端Hono + tRPC(Node 常驻进程)Cloudflare Pages 没有常驻 Node 进程,直接部署等于没有后端
数据库drizzle + MySQL需要一台数据库
行情源腾讯 / 新浪 / Gate.io浏览器直连被 CORS 挡死,必须有服务端代理

所以"把 zip 丢上 Pages"这条路走不通——后端不搬,页面打开就是一片空白

二、怎么解决的

1. 前端静态化:以 base=/global-assets/ 编译,产物落 web/terminal/global-assets/;

路由 basename 跟随 base,_redirects 加 SPA 回退(防 /global-assets/ticker/AAPL 刷新 404)。

2. 后端搬家(关键一步):把同一套 tRPC 路由用 esbuild 打包成 Cloudflare Pages Function

web/terminal/functions/api/global-assets/[[path]].js,对外就是 /api/global-assets/trpc/*

前端代码一行业务逻辑没改,只是换了运行的地方(Node 进程 → Workers 边缘运行时)。

3. 数据库直接砍掉:原项目 db/schema.ts 是空壳(只有注释示例),行情全部走上游接口实时代理,

不需要数据库 → 零运维、零成本。

4. 一条命令可重建:cd apps/global-assets && bash scripts/build-to-terminal.sh

(前端构建 → 同步产物 → 打包 Function,三步一次做完)。

三、顺手修掉的 7 处真 Bug(不修就是空图/崩图)

全部是"实测复现 → 定位 → 修 → 复测"跑出来的,不是看代码猜的:

#问题影响面根因处理
1商品全线没行情黄金/白银/铜/原油/天然气 5 个全空上游腾讯的代码是 hf_GC(带下划线),项目字典里写的是 hfGC,请求过去什么都不返回请求时做代码映射 + 放宽解析正则
2加密货币 K 线崩图BTC 个股页 + 首页跨资产图整块报错Gate.io 返回本已按时间升序,代码又 reverse() 一次变倒序,图表库直接抛 Value is null改为显式按时间升序排序,不假设上游顺序
3首页引用了字典里不存在的代码标普500 卡片、跨资产图、全球指数表全空用了 usSPX / usRUT,字典里其实是 usINX / usIWM改回正确代码
4K 线后缀写死错了罗素2000、道指 图全空硬编码 .A / .P,上游实际是 .AM去掉错误硬编码,改为运行时解析
5VIX / 日经 / 富时 / DAX / 美元指数 没有历史图5 张图空白这些指数上游只有报价、没有公开 K 线各挂一只对应 ETF 作历史走势代理(VIXY / EWJ / EWU / EWG / UUP)
6一次网络抖动会永久钉死某只股票如 CAT 之类纽交所股票 K 线永远空解析失败时把猜测值 .OQ 写进缓存,再也不重试猜测值不入缓存,下次请求重新解析
7中文名乱码所有卡片名称Workers 的 TextDecoder 只支持 UTF-8,上游是 GBK乱码时回退用字典里的中文名

四、验证(全部真跑,有据可查)

检查项方法结果
行情覆盖全字典 165 个标的逐个取实时价165/165 有价
历史 K 线165 个标的逐个取 3M K 线,查空图/乱序/非法值165/165 有数据,0 乱序,0 非法值
后端接口20 个接口逐个调用(快照/K线/热力图/领涨跌/筛选/搜索/7×24快讯)20/20 HTTP 200
前端运行时Playwright 真浏览器跑 6 条路由(首页/全球股指/大类资产/美股筛选/个股 AAPL/个股 BTC)0 JS 报错,并已逐页截图人工看过确有数、有图
线上生产域名curl 实测页面 JS 哈希与本地构建完全一致;深链接 /global-assets/ticker/AAPL 200;/api/global-assets/* 返回实时数据

线上抽样(2026-08-01 20:56 北京时间取):

苹果 308.91(−7.35%)· 标普500 7,489.72(+0.70%)· 纽约黄金 4,096.38(−1.54%)·

比特币 63,101(−1.02%)· 日经 44,946.64(−0.90%)· 上证 3,832.26(+0.72%)· 恒生 25,884.43(+0.10%)

五、诚实的边界(没做/做不到的)

收盘时段显示的是最后收盘价。做投研参考够用,不能当下单依据

前端已有兜底——取不到就沿用上一次的值并标 stale,不会白屏;下一轮自动补回。

所以做了日线兜底。开盘时段会正常显示当日分时。

主席要哪个当"全球资产终端"正主可以随时说,我把首页卡片指过去。

六、维护方式

`bash

cd apps/global-assets

npm install # 首次

bash scripts/build-to-terminal.sh # 改完代码,一条命令重出产物

然后部署:

cd ../../web/terminal && CLOUDFLARE_API_TOKEN=... npx wrangler@3 pages deploy . \

--project-name=metazero-terminal --branch=main

`


*证据等级:行情数值 E1(上游接口实测返回,已标时间);上线状态 E1(curl + 真浏览器实测);

延迟说明为公开接口通例,属 E2 常识判断。*