这是基金实时估算项目的 Node.js 高性能版本。服务端采用 Fastify + TypeScript,前端采用 React + Vite;已有的 data/users.json、关注基金和持仓金额数据可以直接继续使用。
- 浏览器通过聚合 API 获取首屏数据,页面状态和服务端计算彼此独立。
- 服务端对基金持仓缓存 30 分钟、净值缓存 5 分钟、实时行情缓存 3 秒。
- 相同缓存键的并发请求自动合并,避免缓存击穿。
- 外部行情最多 4 路并发,股票代码按每批 80 个拆分。
- 腾讯行情失败后只对缺失代码请求新浪,不把接口失败伪装成 0% 涨跌。
- 生产前端使用 gzip 压缩和静态资源哈希,可由 Nginx/CDN 长期缓存。
- Node 服务端编译为原生 JavaScript,生产环境无需
tsx或 TypeScript 运行时。
需要 Node.js 22 或更新版本。
npm install
npm run dev访问 http://localhost:3000。
npm test
npm run build生产启动必须配置强随机会话密钥:
export SESSION_SECRET="$(openssl rand -hex 32)"
export PORT=3000
npm start不要把 SESSION_SECRET 写进仓库或提交到 Git。
不支持配置进程环境变量的面板可以在项目根目录创建权限为 600 的 .env 文件;npm start 会自动读取它:
SESSION_SECRET=使用 openssl rand -hex 32 生成的随机值
HOST=127.0.0.1
PORT=3000账号、收藏和持仓文件包含私有数据,已由 .gitignore 排除。首次部署请挂载持久化目录;服务会在用户注册或修改数据时自动创建所需文件。
服务直接读取以下持久化数据(全部位于 data/ 目录):
data/users.json:使用 PBKDF2-SHA256、120000 次迭代的密码哈希。data/users/<账号>/favorite_funds.jsondata/users/<账号>/invest_cache.jsondata/fund_codes_cache.json
基金代码缓存来自天天基金的全量基金注册表,可能随时间过期,可随时手动刷新:
npm run refresh:codes为避免镜像构建时覆盖服务器上的用户数据,正式部署建议把数据目录和用户文件挂载到持久卷:
docker build -t fund-node .
docker run -d \
--name fund-node \
--restart unless-stopped \
-p 127.0.0.1:3000:3000 \
-e SESSION_SECRET="你的随机密钥" \
-v "$PWD/data:/app/data" \
fund-node首次部署前请先创建挂载目标,避免 Docker 把不存在的文件路径创建成目录:
mkdir -p data/users
test -f data/users.json || printf '{}\n' > data/users.json服务使用普通 HTTP 反向代理:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 3s;
proxy_read_timeout 15s;
}HTTPS、限流和访问日志建议继续由 Nginx 或 CDN 负责。
src/
client/ React 页面、组件和样式
server/ Fastify、认证、缓存、行情和数据存储
shared/ 前后端共享类型
dist/ 生产构建输出
docs/design/ 设计稿与最终视觉验收截图
页面展示的实时估算仅供参考,不构成投资建议。第三方行情接口可能延迟、限流或变更。