Files
frontend_v2/.workbuddy/memory/2026-08-18.md
toom1996 d14dd7e2db
Some checks failed
deploy / deploy (push) Has been cancelled
update
2026-08-18 20:33:56 +08:00

50 lines
6.3 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.

# 2026-08-18
## article 组件改为 SSR(按需服务端渲染)
- 目标:`src/components/pages/article.astro` 由「浏览器 Alpine fetch 取数(CSR)」改为「服务端渲染 + 灯箱保留 Alpine」。
- 组件改动:接收 `article: RawArticle | null` 作为 prop,服务端直出标题/品牌/日期/图片网格/正文段落(利于 SEO 与首屏,无 loading 骨架);图片地址服务端补全绝对路径;灯箱仍是 Alpine 客户端交互,但图片数据由服务端以 `x-data={articleView(${JSON.stringify(images)})}` 注入。`locale` 控制文案(en/cn),`error` 控制服务端错误态(missing/failed)。
- 页面改动:`pages/article.astro`、`pages/cn/article.astro`、`pages/en/article.astro` 三页均加 `export const prerender = false`,frontmatter 按 `Astro.url.searchParams.get('id')` 调 `fetchArticleById(id, API)` 取数后传给组件。`API = import.meta.env.API_SSR || PUBLIC_API_BASE || http://localhost:8090`。
- `src/lib/data.ts`:`fetchArticleById(id, apiBase=API_BASE)` 增加 `apiBase` 参数(复用 brands 的 API_SSR 内部地址模式);`RawArticle` 类型补 `created_at?: number`(组件引用了它)。
- 验证:`npm run build` 通过(exit 0),article 不再生成静态 html,作为 3 个按需 chunk 进 `dist/server/`;dev 下 `/en/article?id=1`、`/cn/article?id=2` 返回 200,HTML 里可见服务端渲染的错误态文案「加载文章失败,请刷新或稍后再试」与 `articleView([])` 注入(后端离线时 article=null),证明 SSR 生效、不再是浏览器 fetch。
## 重要更正:astro.config.mjs 的 prefixDefaultLocale 实际为 true
- 08-16 记忆误记为 `false`;当前 `astro.config.mjs` 实为 `prefixDefaultLocale: true`(routing.prefixDefaultLocale)。
- 因此**无前缀路由全部 404**:`/article`、`/shows`、`/articles` 都 404,只有 `/en/...`、`/cn/...` 可用。
- 这导致既存的内部链接(`shows.astro`/`articles.astro`/`Index.astro` 里的 `/article?id=`)点过去是 404——属**既存全局 i18n 路由问题**,非本次 SSR 改动引入(这些无前缀路由在我改之前就 404)。
- **部署缺口**:当前 `nginx.conf` 只做静态托管 + `/api` 反代;article 现在是按需 SSR 路由,线上需 Node 服务承接,nginx 必须把 `/en/article`、`/cn/article` 等 SSR 路由代理到 Node 服务,否则线上 404。
## 修复 swiper TS2307「找不到模块"swiper"或其相应的类型声明」
- 现象:VS Code 报 `ts(2307)` 找不到模块 `swiper`,但 `package.json` 的 `dependencies` 里已声明 `swiper: "^11.2.10"`。
- 根因:`node_modules/swiper` **根本不存在**——依赖写进了 package.json 却没真正 install 进 node_modules(疑似此前 `npm install` 未执行 / node_modules 被裁剪)。所以 TS 服务找不到模块与类型声明。
- 修复:`npm install swiper@^11.2.10`(落盘后 `node_modules/swiper` 完整,版本 11.2.10;`exports` 映射正常:`.`→swiper.mjs/swiper.d.ts,`./modules`→types/modules/index.d.ts,`./css`→swiper.css,`./css/navigation`、`/free-mode`→对应 css)。Index.astro 的 5 行 import 全部可解析。
- 提醒:若 VS Code 仍报红,执行「TypeScript: Restart TS Server」(Ctrl+Shift+P)或重开文件即可,因 TS 服务可能缓存了旧缺失状态。
## 修正:article 面包屑应复用现有 Breadcrumb 组件(非手写)
- **更正**:上一节「article 组件加面包屑」我手写了 `<nav>` 面包屑并自加 `home/archive/brand` 字典键,属于重复造轮子。用户指出项目已有 `src/components/Breadcrumb.astro`(shows 页在用)。
- **正确做法**:article.astro 改用 `<Breadcrumb items={crumbs}><span slot="current">{title}</span></Breadcrumb>`。组件约定:
- `items[].label` 是 **i18n 英文 key**(组件内部 `t()` 翻译),不要预先 `t()`;末项用 `<slot name="current">`。
- `Home` / `Runway Archive` 已在 `dictionary.ts` 有 cn 翻译(首页/走秀档案)。
- 品牌名作为动态 label 传入 `t()` 会回退原文(dict 无此 key),即显示品牌名本身。
- 语言跟随 `Astro.currentLocale`,href 需调用方自己给 locale 前缀(en→`/en/shows`,cn→`/cn/shows`,首页 en→`/en/` cn→`/cn`)。
- 撤掉手写的 `lbl.home/archive/brand`;`src/lib/data.ts` 的 `brand_id` 字段保留(品牌面包屑链接用)。
## article 组件加面包屑(Breadcrumb)
- 位置:`src/components/pages/article.astro` 顶部,把原来「返回首页 + Runway·品牌」那一行(border-b 顶栏)整体替换为标准面包屑 `<nav aria-label="Breadcrumb">`:`首页 / 走秀档案 / 品牌名 / 文章标题`。
- 链接层级(均按 locale 给前缀,避免 404):
- 首页 `homeHref`:`/en/`(en)或 `/cn`(cn)。
- 走秀档案 `archiveHref`:`/en/shows` 或 `/cn/shows`(实测两路由均 200,是可用的全局走秀档案页)。
- 品牌 `brandHref`:`archiveHref + "?brand_id=<id>"`(当 `article.brand_id` 存在,指向品牌筛选后的走秀档案);否则退化为 archiveHref。
- 当前文章标题:末级、不可点、`truncate` 防溢出。
- 文案(en/cn)新增 `home`(Home/首页)、`archive`(Runway/走秀档案)、`brand`(Brand/品牌兜底) 三个 key,沿用既有 mono 小字号大写编辑风。
- `src/lib/data.ts`:`RawArticle` 类型新增 `brand_id?: number`(后端 `/api/public/articles/:id` 返回此字段),供品牌面包屑筛选链接使用。
- 验证:`npm run build` 通过;`astro dev` 下 `/en/article?id=1` 返回 200,无运行时错误。面包屑本体在 `article ?` 分支,需后端在线有数据时才可见。
## 项目小坑(PowerShell / Node)
- `package.json` 含 `"type": "module"`,因此临时 `.js` 脚本被当 ESM,`require` 不可用;需用 `.cjs` 后缀或用 `import`。
- PowerShell 里 `||` 会被当成管道、多路径 `dir a b` 报错;做 node 自检时优先写 `.cjs` 脚本文件再 `node` 执行。
## 待用户决策(未动,留给用户定)
1. 是否修复内部 `/article?id=` 链接为 locale 前缀版(如 `/en/article?id=` / `/cn/article?id=`,按当前页 locale 生成)。需改 shows.astro / articles.astro / Index.astro 等。
2. 是否更新 nginx.conf + Dockerfile/docker-compose 让 Node SSR 服务承接 article 路由。