Files

62 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Web App 站点模板(templates/web-app-template)
DeerFlow「Web App 产物模式」的站点脚手架:智能体在沙箱里 `scaffold` 本模板到
`outputs/<site>/`,改 `site.json`、写 `src/pages/*.tsx`、放数据到 `public/`,
再由 `scripts/build_site.py build` 用**预置依赖**执行 vite build 产出 `dist/`,
经平台签名静态托管在「站点预览」工作台(前端路由 `#/sites/{threadId}/{siteName}`)打开。
## 目录约定
- `site.json` — 站点清单:`title` / `description` / `nav[]`(页面导航顺序)/
`map`(可选底图:`tilesUrl` XYZ 模板或 `pmtiles` 单文件;都留空 = 无底图纯 GeoJSON 模式,离线可用)
- `src/pages/**/*.tsx` — 每个文件即一个页面,文件名(去扩展名)即路由(`overview.tsx` → `/#/overview`),自动注册
- `src/components/` — 内置组件:`AppShell`(导航壳)、`FlowCanvas`(@xyflow/react 交互流程图)、
`GeoMap`(MapLibre 地图)、`ChartPanel`(ECharts)、`MermaidBlock`(Mermaid 静态图)
- `public/` — GeoJSON / 数据文件,页面内 `fetch("./data.geojson")` 相对加载
- `scripts/build_site.py` — 构建 CLI(check / scaffold / build / status,输出单行 JSON)
## 依赖预置与开启步骤(关键:默认完全关闭,离线环境不跑 npm install)
`node_modules/` 已 gitignore,**永远不要提交,也永远不要在沙箱里安装**:
- **开发机**:`make webapp-template`(即在本目录 `pnpm install && pnpm build`)一次性生成;
- **离线发版**:`deerflow-offline-deployment` 仓库的构建脚本需在有网的 CI 上执行
`pnpm install --frozen-lockfile`(或 `npm ci`),把整个 `node_modules/` 随镜像预置到
`/app/backend/templates/web-app-template/node_modules`。
构建脚本会用 symlink(Linux)/ junction(Windows `mklink /J`,免管理员)把预置依赖
链进各站点目录,多站点共享、零拷贝。
**开启功能 = config.yaml 里同时放开两处注释**(缺一不可):
1. `sandbox.mounts` 里的模板挂载条目(沙箱技能经 `/mnt/web-app-template` 探测;
2. 文件末尾的 `web_app:` 段,`enabled: true`(开平台 API 与前端入口)。
`build_site.py check` 在宿主侧会读取 config.yaml 的 `web_app.enabled`(可用 env
`DEERFLOW_WEBAPP_ENABLED` / `DEERFLOW_WEBAPP_CONFIG` 覆盖);沙箱内读不到配置文件,
"挂载即视为开"——所以挂载条目就是沙箱侧的开关。改挂载后需重启网关(provider 单例
启动时读取;uvicorn --reload 模式改任一 `app/` 下文件即可触发热重启)。
未开启或依赖未预置时整条链路**优雅降级**:capability 探测返回不可用,技能第 0 步
回退单页 HTML 产出,前端入口按钮不渲染,现有功能零影响。
## 构建链路速查
```bash
python scripts/build_site.py check # 能力探测(模板/依赖/node)
python scripts/build_site.py scaffold outputs/my-site # 脚手架(排除 node_modules/dist/scripts)
python scripts/build_site.py build outputs/my-site # 链接预置依赖 + vite build → dist/
python scripts/build_site.py status outputs/my-site # dist 状态 + 最近构建结果
```
环境变量:`DEERFLOW_WEBAPP_TEMPLATE`(模板目录)、`DEERFLOW_WEBAPP_NODE`(node 路径)、
`DEERFLOW_WEBAPP_TIMEOUT`(构建超时秒数,默认 180)。
## 模板自身的构建约束
- `vite.config.ts` 固定 `base: "./"`(嵌套托管路径下资源自适应)与 `target: "es2018"`
(兼容 chrome100 老内核,与主前端基线一致);不要改这两个配置。
- 样式是纯 CSS + design tokens(`src/styles.css`),**不引入 Tailwind**(oklch 在老内核失效)。
- HashRouter:静态托管无需服务端 SPA fallback。
- 不新增 npm 依赖;只用已内置库(react / react-router-dom / @xyflow/react / maplibre-gl /
echarts / mermaid / pmtiles)。