feat(ssr): 真 SSR 收尾——干净 hydration 与浏览器原生滚动恢复
- 修复 onRenderClient 引入 serverClient 导致浏览器 process is not defined: 抽出双端安全的 ssr/feedSeed.ts 作为唯一数据播种入口,serverClient 加 SSR 守卫 - 修复 React 19 Fizz Suspense Outlining:Suspense 边界从布局 Outlet 下移到 各懒加载路由,SSR 输出不再出现 <!--$?--> / $RB / template 探针标记 - 修复窄屏 React #418 hydration 致命错误:useMediaQuery 首帧恒 false, useLayoutEffect 绘制前同步真实值;主题改 cookie 存储供 SSR 直出, head 内联防闪烁/缩放脚本移除(缩放锁改为客户端 zoomGuard 模块) - 清理假 SSR 残留:删除 StaticFeedList 镜像组件、SSR 图标生成脚本、 探针与死代码;列表接口裁剪正文,仅下发 excerpt/first_image - Feed 与帖子详情改为窗口滚动(app-shell--doc-scroll):删除虚拟列表、 自研滚动快照与全局滚轮 hack;F5/前进后退滚动位置全部交给浏览器原生 历史恢复,HTML 响应头 no-cache 配合;锚点/楼层用 scrollIntoView + scroll-margin-top 适配 sticky 顶栏
This commit is contained in:
@@ -44,11 +44,11 @@ type homeBootStats struct {
|
||||
Comments int64 `json:"comments"`
|
||||
}
|
||||
|
||||
// APIHomeBoot 首页/板块/壳层聚合数据(Vike SSR +data 使用,与前端 HomeBootPayload 对齐)。
|
||||
// APIHomeBoot 首页/板块/壳层聚合数据(Vike +data 取数与 SPA 冷启动预热共用,与前端 HomeBootPayload 对齐)。
|
||||
// 并发聚合:帖子列表、板块、统计、侧栏 widget、登录态、签到等。
|
||||
func (h *Handlers) APIHomeBoot(c *gin.Context) {
|
||||
boardID := uint(parseUintOrZero(c.Query("board_id")))
|
||||
boot, err := h.gatherHomeSSR(c, boardID)
|
||||
boot, err := h.gatherHomeBoot(c, boardID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "获取数据失败"})
|
||||
return
|
||||
@@ -56,7 +56,8 @@ func (h *Handlers) APIHomeBoot(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, boot)
|
||||
}
|
||||
|
||||
func (h *Handlers) gatherHomeSSR(c *gin.Context, boardID uint) (*homeBootPayload, error) {
|
||||
// gatherHomeBoot 纯数据聚合(JSON),不做任何 HTML 渲染。
|
||||
func (h *Handlers) gatherHomeBoot(c *gin.Context, boardID uint) (*homeBootPayload, error) {
|
||||
limits := h.Settings.PublicLimits()
|
||||
brand := h.Settings.SiteBranding()
|
||||
brand.SiteURL = h.publicBaseURL(c)
|
||||
|
||||
Reference in New Issue
Block a user