惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
TanStack Router SSR/SSG 最佳实践指南 (Cloudflare Pages 版) - 少数派
2026-02-10 · via 少数派

TanStack Router SSR/SSG 最佳实践指南 (Cloudflare Pages 版)

本文档基于生产环境验证的架构,提炼了使用 TanStack Router 进行 SSR/SSG 混合部署的通用最佳实践。本方案特别针对 Cloudflare Pages 平台进行了优化,旨在实现高性能、高 SEO 友好度且低维护成本的现代 Web 应用。


1. 核心架构设计:静态优先,动态兜底 (Hybrid Architecture)

1.1 设计理念

  • 默认静态 (SSG):对所有公开、内容相对固定的页面(营销页、博客、文档)进行构建期预渲染。这保证了最佳的 TTFB(首字节时间)和 CDN 缓存能力。
  • SSR 兜底 (SSR Fallback):仅对无法预渲染的长尾路径或需要实时数据的 SEO 页面启用运行时服务端渲染。
  • 客户端渲染 (CSR):对需要登录状态、高度交互的应用内页面(Dashboard、设置),直接降级为 SPA 模式,无需 SSR。

1.2 URL 分层策略

路由类型渲染模式适用场景示例
强静态SSG (预渲染)首页、关于我们、法律条款/, /about
内容流SSG + ISR*博客文章、产品详情/blog/$slug
应用态CSR (SPA)用户后台、购物车/dashboard/*
动态 SEOSSR搜索结果、即时生成的落地页/search, /promo/$id

*注:Cloudflare Pages 暂不支持增量静态再生 (ISR),通常通过“预渲染 + 定时重建”或“预渲染首屏 + 客户端数据更新”替代。


2. 路由系统改造 (Router Refactoring)

2.1 工厂模式 (Factory Pattern)

在 SSR 环境下,必须避免单例模式。每个请求都需要独立的 Router 实例,以防止跨请求的状态污染。


    

    

    

  
// ❌ 错误:单例模式
export
 const
 router =
 createRouter
({ ... })
// ✅ 正确:工厂模式
export
 function
 createRouter
(
) {
  return
 createRouter
({
    routeTree,
    context
: { ... },
 // 注入请求级上下文
  })
}

2.2 入口分离

标准的 SSR 架构需要拆分客户端和服务端入口:

  • entry-client.tsx:负责客户端“注水” (Hydration)。

    

    

    

  
const
 router =
 createRouter
()
router.
hydrate
()
 // 恢复服务端状态
ReactDOM
.
hydrateRoot
(
document
.
getElementById
(
'root'
)!,
 
<
RouterProvider
 router
=
{router}
 />
)
  • entry-server.tsx:负责服务端渲染与脱水 (Dehydration)。

    

    

    

  
export
 async
 function
 render
(
url, headAssets
) {
  const
 router =
 createRouter
()
  const
 memoryHistory =
 createMemoryHistory
({
 initialEntries
: [url] })
  router.
update
({
 history
: memoryHistory })
  
  await
 router.
load
()
 // 等待关键数据加载
  
  // 注入 Head 资源并渲染
  // 返回 { appHtml, dehydratedRouter }
}

3. Cloudflare Functions 集成 (The Critical Part)

3.1 构建期生成入口 (Build-time Generation)

不要手动维护 functions/[[path]].ts。应在构建脚本中动态生成它,以便将 index.html 中带有哈希的文件名(如 assets/index-Ah3...css)自动注入到 SSR 模板中。

流程

  1. 1. 构建客户端 (vite build) → 产出 dist/client (含带哈希的静态资源)。
  2. 2. 构建服务端 (vite build --ssr) → 产出 dist/server
  3. 3. 脚本生成 Functions 入口:读取 dist/client/index.html 提取 CSS/JS 标签,写入 functions/[[path]].ts

3.2 静态资源绕行 (Static Bypass) - 核心稳定性机制

SSR 最常见的问题是错误地拦截了静态资源请求(如 .css, .js, robots.txt),导致返回 HTML 内容,引发 MIME 类型错误或 React Hydration 错误 (Error 418)。

最佳实践逻辑


    

    

    

  
// functions/[[path]].ts
export
 const
 onRequest
 =
 async
 (
context
) => {
  const
 { pathname } =
 new
 URL
(context.
request
.
url
);
  const
 accept = context.
request
.
headers
.
get
(
'accept'
) ||
 ''
;
  
  // 1. 扩展名检查:任何带扩展名的请求视为静态资源
  const
 hasExt =
 /\/[^/]+\.[^/]+$/
.
test
(pathname);
  
  // 2. Accept 头检查:不接受 HTML 的请求视为非页面请求
  const
 acceptsHtml =
 /\btext\/html\b/i
.
test
(accept);
  
  // 3. 绕行判断:非 GET、有扩展名、或不接受 HTML -> 直接透传给静态层
  if
 (context.
request
.
method
 !==
 'GET'
 || hasExt || !acceptsHtml) {
    return
 context.
next
();
  }
  
  // ... 进入 SSR 逻辑
}

3.3 SSR 路由白名单 (Gating)

为了防止 404 页面或未知的 SPA 路由意外触发 SSR(导致不必要的计算开销或错误),建议引入SSR 路径白名单

  • 机制:利用 prerender-routes.jsonsitemap 作为白名单。
  • 逻辑:如果请求路径不在白名单中,跳过 SSR,直接返回 SPA 的 index.html(由 Cloudflare 默认行为处理)。

4. SEO 与 Head 管理

4.1 集中式 Head 策略

利用 TanStack Router 的 Context 功能,在根路由 (__root.tsx) 统一管理全局 SEO 标签。

  • Hreflang & Canonical:基于当前 URL 动态生成,避免在每个页面重复手动配置。
  • Title & Description:通过 loader 获取数据,通过 head 函数返回。

4.2 避免 Hydration Mismatch

服务端生成的 Title/Meta 必须与客户端初始渲染完全一致。

  • 技巧:不要在组件内部使用 useEffect 修改 Title。使用 Router 的 head 属性,它能确保服务端渲染时就输出正确的 <title> 标签。

5. 构建与部署管道 (Pipeline)

5.1 推荐构建顺序

  1. 1. build:client:生成静态产物。
  2. 2. build:server:生成 SSR 渲染器。
  3. 3. generate:functions:生成 Cloudflare Functions 入口(注入 CSS/JS)。
  4. 4. prerender:本地运行 SSR 渲染器,生成高优先级路由的静态 HTML 文件。
  5. 5. post-build
    • • 生成 sitemap.xmlrobots.txt
    • • 生成 _redirects 规则文件。
    • • 清理 HTML 中的开发时标签(如 /src/*)。

5.2 重定向规则 (_redirects)

对于 Cloudflare Pages,正确的重定向规则是性能和稳定性的关键。


    

    

    

  
# 1. 静态资源优先 (防止 SSR 误拦截)
/assets/*  /assets/:splat  200
/images/*  /images/:splat  200
# 2. 规范化规则 (移除尾随斜杠等)
# 注意:不要强制添加尾随斜杠,这会破坏文件请求
# 3. SPA 兜底 (对于未被 SSR/SSG 覆盖的路径)
/*  /index.html  200

6. 常见故障排查 (Troubleshooting)

现象可能原因解决方案
CSS/JS 报 MIME 错误SSR 拦截了静态资源并返回了 HTML检查 onRequest 中的静态资源绕行逻辑;检查 _redirects 是否有强制重写规则。
React Error #418服务端 HTML 与客户端渲染不一致检查 entry-server 是否注入了正确的脱水数据;检查是否有组件使用了 window 变量但未做环境判断。
页面空白 / 307 跳转路由初始化 URL 不正确确保服务端传入 createMemoryHistory 的 URL 是规范化的(包含 pathname + search)。
样式闪烁 (FOUC)CSS 未在 HTML 头部注入确保 generate:functions 脚本正确提取了 index.html 中的 <link rel="stylesheet"> 并注入到 SSR 模板中。

7. 总结

本方案的核心优势在于确定性

  1. 1. 构建确定性:通过构建脚本注入哈希资源,杜绝版本不一致。
  2. 2. 路由确定性:通过白名单和静态绕行,确保 SSR 只在应该发生的时候发生。
  3. 3. SEO 确定性:通过集中式 Head 管理,保证元数据的准确输出。