build: adopt esbuild for frontend bundling (build:web → public/build/)

- esbuild dev dep; build:web/dev:web bundle public/main.ts → public/build/main.js
- gitignore public/build/; tsconfig.web.json now typecheck-only
- frontend build convention documented in PLAN §1, DISPATCH, ARCHITECTURE §5
- resolves the T1 deferred decision
This commit is contained in:
Yaojia Wang
2026-06-16 07:36:01 +02:00
parent 987cab8eb7
commit 409b208928
8 changed files with 38 additions and 18 deletions

View File

@@ -64,6 +64,12 @@ W5 验收与收尾(按 F# 并行) T16T20 F1F9 实测 · T21 安全+README
> ARCH §6 的 S1S8 是线性视角;本计划是其**并行重排**。每个任务标了 `ARCH:` 做溯源。
**前端构建约定(T1 已定,T8/T11/T14 遵守)**:打包器 = **esbuild**
- 入口 `public/main.ts`;`npm run build:web` → 打包到 **`public/build/main.js`**(若 main.ts `import '@xterm/xterm/css/xterm.css'`,
esbuild 同时出 `public/build/main.css`)。开发用 `npm run dev:web`(--watch)。`public/build/` 已 gitignore。
- `index.html``<script type="module" src="./build/main.js">` 加载,并 `<link rel="stylesheet" href="./build/main.css">`(若有)+ 自己的 `style.css`
- `server.ts` 静态托管整个 `public/`(含 `public/build/`)。`tsconfig.web.json` 仅类型检查(noEmit)。
---
## 2. 任务清单
@@ -160,7 +166,7 @@ W5 验收与收尾(按 F# 并行) T16T20 F1F9 实测 · T21 安全+README
#### T8 · `public/index.html` `[ ]`
- **Wave/ARCH**: W1 / S7 §5 · **Owns**: `public/index.html`
- **Depends**: 无(可在 T2 前都行) · **Parallel-safe**: 全部
- **Steps**: [ ] 终端容器 `#term`、键栏挂载点 `#keybar`、引 main.ts/style.css;viewport meta(移动端)
- **Steps**: [ ] 终端容器 `#term`、键栏挂载点 `#keybar`;`<script type="module" src="./build/main.js">` + `style.css`(及 `./build/main.css` 若有);viewport meta(移动端)。**按§1 前端构建约定**
- **Accept**: 浏览器打开无控制台报错(静态)
#### T9 · `public/style.css` `[ ]`
@@ -183,7 +189,7 @@ W5 验收与收尾(按 F# 并行) T16T20 F1F9 实测 · T21 安全+README
- **Wave/ARCH**: W1 / S7 §5/§6 · **Owns**: `public/main.ts`
- **Depends**: T2 + T10(仅 `mountKeybar` 签名,可并行) · **Parallel-safe**: 后端全部
- **Steps**:
- [ ] xterm + FitAddon 初始化;`fit()` 在容器有真实尺寸后调用(§9 坑)
- [ ] (本文件是 esbuild 打包入口,见§1 约定)xterm + FitAddon 初始化 + `import '@xterm/xterm/css/xterm.css'`;`fit()` 在容器有真实尺寸后调用(§9 坑)
- [ ] WS:**scheme 随页面协议** `https→wss`(M6),URL `…/term`,首帧发 `attach`(localStorage 取 sessionId)
- [ ] `term.onData → ws.send {input}`;`onmessage` 按 type 处理(attached 存 id、output→`term.write`、exit→提示重连)
- [ ] `ResizeObserver`/resize → `fit()` → 发 `resize`(防抖 100ms)
@@ -234,7 +240,7 @@ W5 验收与收尾(按 F# 并行) T16T20 F1F9 实测 · T21 安全+README
- **Wave/ARCH**: W4 / S6 §3.6 · **Owns**: `src/server.ts`
- **Depends**: T4、T5、T7、T13 · **Parallel-safe**: T15 可并行起草用例
- **Steps**:
- [ ] Express 托管 `public/` + 编译产物
- [ ] Express 托管 `public/`(含 esbuild 产物 `public/build/`,见§1 约定);提示:start 前需 `npm run build:web`(或 `dev:web` 监听)
- [ ] `WebSocketServer({ noServer:true })`(L3);HTTP `upgrade`:非 `/term`→destroy、Origin 不过→`401\r\n\r\n`+destroy、通过→`handleUpgrade`→emit connection
- [ ] `connection`:等首帧 attach→`try handleAttach` 回 attached;`catch`→send `exit(-1,reason)`+close(仅此连接,不 fail-fast)(M4)
- [ ] `message`:parse→ok:false 丢弃记日志,否则路由 writeInput/resize