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:
12
docs/PLAN.md
12
docs/PLAN.md
@@ -64,6 +64,12 @@ W5 验收与收尾(按 F# 并行) T16–T20 F1–F9 实测 · T21 安全+README
|
||||
|
||||
> ARCH §6 的 S1–S8 是线性视角;本计划是其**并行重排**。每个任务标了 `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# 并行) T16–T20 F1–F9 实测 · 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# 并行) T16–T20 F1–F9 实测 · 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# 并行) T16–T20 F1–F9 实测 · 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
|
||||
|
||||
Reference in New Issue
Block a user