<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Web安全 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《为 AI 生成的 HTML 构建安全隔离的预览环境》</title><link>https://channel.meo-ai.com/posts/735</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/735</guid><pubDate>Sat, 31 Oct 2026 00:07:59 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《为 AI 生成的 HTML 构建安全隔离的预览环境》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%AE%89%E5%85%A8&quot; title=&quot;#Web安全&quot;&gt;#Web安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B&quot; title=&quot;#前端工程&quot;&gt;#前端工程&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23AI%E7%94%9F%E6%88%90%E5%86%85%E5%AE%B9&quot; title=&quot;#AI生成内容&quot;&gt;#AI生成内容&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23iframe%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB&quot; title=&quot;#iframe沙箱隔离&quot;&gt;#iframe沙箱隔离&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSP%E5%86%85%E5%AE%B9%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5&quot; title=&quot;#CSP内容安全策略&quot;&gt;#CSP内容安全策略&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23postMessage%E5%AE%89%E5%85%A8&quot; title=&quot;#postMessage安全&quot;&gt;#postMessage安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5&quot; title=&quot;#同源策略&quot;&gt;#同源策略&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23srcdoc%E6%B8%B2%E6%9F%93&quot; title=&quot;#srcdoc渲染&quot;&gt;#srcdoc渲染&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这是一篇面向“AI 生成 UI 必须渲染到某处”这一现实需求的安全工程文章。作者以一个未经防护的 &lt;code&gt;srcdoc&lt;/code&gt; iframe 预览为起点，用三种攻击方式（读取父页面、劫持窗口跳转、向外部服务器回传数据）逐一击破，最终给出四层防护组合：最小化沙箱权限、专用隔离域名、CSP 网络层管控、以及严格的 postMessage 通道校验，并强调每次权限放宽都应是可解释、可辩护的决策。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 用 &lt;code&gt;srcdoc&lt;/code&gt; 渲染 AI 生成的 HTML 看似稳妥，但生成的代码本质是“没人读过的陌生代码”，直接渲染等于把不可信脚本放进了自己应用的上下文。&lt;br /&gt;2. 无沙箱的 iframe 与宿主同源，能直接读取父页面的 DOM、&lt;code&gt;localStorage&lt;/code&gt; 和 Cookie；加上 &lt;code&gt;sandbox=&quot;allow-scripts&quot;&lt;/code&gt; 后获得不透明源，同源读取立即被 &lt;code&gt;SecurityError&lt;/code&gt; 阻断。&lt;br /&gt;3. 沙箱需要按需最小授权：默认空沙箱全封禁，只加 &lt;code&gt;allow-scripts&lt;/code&gt;；绝不能图省事同时加 &lt;code&gt;allow-same-origin&lt;/code&gt;，否则沙箱可被脚本自行移除。&lt;br /&gt;4. 沙箱管不了网络外泄——沙箱内的 &lt;code&gt;fetch&lt;/code&gt; 和图片请求仍能把数据带出去，必须用 &lt;code&gt;default-src &apos;none&apos;&lt;/code&gt; 的 CSP 在请求发出前拦截，它与沙箱是互补的两道独立防线。&lt;br /&gt;5. 沙箱化 iframe 的 postMessage 来源会序列化为 &lt;code&gt;&quot;null&quot;&lt;/code&gt;，无法用字符串白名单识别身份，必须改用浏览器填充的 &lt;code&gt;event.source&lt;/code&gt; 做身份校验，并配合载荷形状校验。&lt;br /&gt;6. 高价值场景应给预览内容单独分配一个一次性域名（如 CodePen 用 &lt;code&gt;cdpn.io&lt;/code&gt; 渲染结果），即使沙箱被逃逸，攻击者也落在“什么都没有”的原点上。&lt;br /&gt;7. 实战落地顺序与直觉相反：先建空沙箱再逐项加权限、用隔离域名承载、叠 CSP、严格校验消息通道；放宽策略（如为 CDN 图片加 &lt;code&gt;img-src&lt;/code&gt;）必须是能明确说出理由的决策。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&quot;&gt;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.master.dev/building-an-isolated-preview-for-ai-generated-html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;An iframe with srcdoc feels like a safe place to render HTML a model wrote. It isn&apos;t. Three tests show how the preview can read your page, escape the frame, and phone home, and four layers of protection close each hole.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;blog.master.dev&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Building an Isolated Preview for AI-Generated HTML&quot; src=&quot;/static/https://cdn4.telesco.pe/file/vCHUiG-xOP0QRaFtv9gDjcRNHRFu_a8v6mMG0VpIUzfFdurxCR7QpSMh5V6ODuVpzPEV09f7FaPMsvjVCGL42F1eGfBN8YY1lBpHLtXWwKH0BdNsMVbf1fqIVNK0u-M8xorEBbB0BqZh2_ytQbFA9tu_mmJbw92LF2ikp7SVGKDR9DPd5XtXzJyfarITNe7KBrRPV3HEILZ1htyiBZ-bHSdAOiXZlBMQeyHoP79AyJjd22HZV2iEx_FpUfDJ_BOvochJM0Ww3kUEDsM_cD01UqHEl1w0D4Ig_1qa1RRSPeOXIxgy5GP1fRfa1PxIiIcT5sAA88bOfXwRTlvzJMZgxA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Building an Isolated Preview for AI-Generated HTML&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;An iframe with srcdoc feels like a safe place to render HTML a model wrote. It isn&apos;t. Three tests show how the preview can read your page, escape the frame, and phone home, and four layers of protection close each hole.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《用 AI 定制框架替换 Next.js：一个静态网站的“超个性化”重构实验》</title><link>https://channel.meo-ai.com/posts/707</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/707</guid><pubDate>Mon, 14 Sep 2026 01:14:08 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《用 AI 定制框架替换 Next.js：一个静态网站的“超个性化”重构实验》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B&quot; title=&quot;#前端工程&quot;&gt;#前端工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E8%BE%85%E5%8A%A9%E7%BC%96%E7%A8%8B&quot; title=&quot;#AI辅助编程&quot;&gt;#AI辅助编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJs&quot; title=&quot;#NextJs&quot;&gt;#NextJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99&quot; title=&quot;#静态网站&quot;&gt;#静态网站&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A1%86%E6%9E%B6&quot; title=&quot;#自定义框架&quot;&gt;#自定义框架&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vercel%E9%83%A8%E7%BD%B2&quot; title=&quot;#Vercel部署&quot;&gt;#Vercel部署&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者 Max Leiter 用 Claude Code（Fable 5 架构、Opus 实现）在约 3 小时内把个人博客从 Next.js 迁移到了一个为站点量身定制的静态构建框架。新方案把全站编译成纯 HTML，按需加载少量 Preact islands，结果页面体积、Lighthouse 分数、构建时间全面大幅优于 Next.js；代价是放弃了框架生态的无数隐性优化，后续维护与安全问题也由自己承担。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 作者让 AI “按需造一个比 Next.js 更快的专属框架”，核心思路是只保留这个网站真正用到的 Next.js 功能，而不是继续背着整个框架跑。&lt;br /&gt;&lt;br /&gt;2. 新框架本质上是一个构建脚本：读取文章目录，用 React 在服务端渲染每条路由为静态 index.html，再按 Vercel Build Output API 输出，M2 MacBook 上热构建只要约 0.5 秒。&lt;br /&gt;&lt;br /&gt;3. 性能提升非常夸张：首页 JS 从 208 KB 降到 2.3 KB（约 -99%），移动端 LCP 从 2.4 秒降到 1.3 秒，整页重量从 1153 KB 降到 78 KB，Lighthouse 直接冲到 100 分。&lt;br /&gt;&lt;br /&gt;4. 博客文章页同样收益明显：HTML 更小、JS 只剩 2.3 KB，移动端 LCP 从 2.2 秒降到 1.1 秒，页面重量从 405 KB 降到 57 KB，软导航也改成更轻的 partial/prerender 方案。&lt;br /&gt;&lt;br /&gt;5. 交互没有消失，而是改成“islands”模式：桌面窗口管理器和命令面板用 Preact 组件按需水合，命令面板首次按 Cmd+K 才加载，Preact 兼容层只有约 7 KB，比 React 的 52 KB 轻很多。&lt;br /&gt;&lt;br /&gt;6. 构建链路保留原有体验：MDX 仍在构建期用同一套 remark/rehype 插件编译，shiki 在构建时同时输出两套主题的代码高亮，所以切换主题不需要额外 JS。&lt;br /&gt;&lt;br /&gt;7. AI 还写了一个“parity harness”，对旧站 101 条路由做快照，对比 head、正文和代码块，结果抓出了 8 篇未发布文章泄漏进 RSS、以及一张 404 的 OG 图这类真实问题。&lt;br /&gt;&lt;br /&gt;8. 整个实验花费约 669 美元，API 运行 8 小时 27 分，代码新增 20914 行、删除 2022 行，大约用掉 Claude Code 20x 订阅额度的 10%。&lt;br /&gt;&lt;br /&gt;9. 作者认为这种做法的意义在于“只 vendor 你真正需要的东西”：框架被压缩到约 5000 行，人和模型都更容易审查，也能减少供应链攻击面。&lt;br /&gt;&lt;br /&gt;10. 缺点也很直白：Next.js 里成百上千个小优化和边界处理 AI 未必都知道或能复现；没有现成的 agent 工具链集成；安全修复不再自动从上游来；而且网站一旦有问题，bug、安全、功能需求都归你自己管。&lt;br /&gt;&lt;br /&gt;11. 文章还记录了两个浏览器层面的坑：Chrome 的跨文档 view transitions 会因 head 里的外部 module script 静默跳过入场动画，所以 runtime 必须内联；Safari 对 Speculation Rules 的 feature detection 需要同时检查 API 支持和 document.prerendering。&lt;br /&gt;&lt;br /&gt;12. 作者最后判断：未来可能会出现更多“vendoring”和 agentic rewrite，也就是所谓“slop forks”；更激进的猜测是，框架本身可能会消亡，因为框架真正值钱的是沉淀下来的庞大知识，而这些知识未来可能被蒸馏成 skills 或某种新标准。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://maxleiter.com/blog/thank-u-next&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://maxleiter.com/blog/thank-u-next&quot;&gt;https://maxleiter.com/blog/thank-u-next&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://maxleiter.com/blog/thank-u-next&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Replacing Next.js with a vibe-coded &amp;quot;framework&amp;quot;&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Max Leiter&apos;s website&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;thank u, next | Max Leiter&quot; src=&quot;/static/https://cdn4.telesco.pe/file/lG5FMNv17i3wvekDtonMVE8VgQmo1zkH-xhzv0LBxLYJ4nMAxHzeMsZJkC9Tkm0irAJJ3ht1LkOFf2ldCgoptkfR9eZV6Omu1VLodVKIsRm8u-KKsTKlkae-Pc-QKc_ECN9PQxsjfhEJwTb-RNTCYEStkPcFvte3hVstASegjtJ2IasaljF-CmlxyVA7VmIiMOxllPQBWzFfxjEsJPCxQuEXIEPZhZZuBCZ3rnerdLUkyF49hojpv2bBa-wYE5uTqYcFypPDPqS-RATBnDgRa5dhoMvSJEE2L2t8615g0r4-TMzDfYp8KhZ5kpIa57gq8BFTfObwNhp90gaIlomOgg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;thank u, next | Max Leiter&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Replacing Next.js with a vibe-coded &quot;framework&quot;&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《unbash：零依赖的 Bash 解析器》</title><link>https://channel.meo-ai.com/posts/692</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/692</guid><pubDate>Sat, 15 Aug 2026 12:55:27 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《unbash：零依赖的 Bash 解析器》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NodeJs&quot; title=&quot;#NodeJs&quot;&gt;#NodeJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Bash%E8%A7%A3%E6%9E%90&quot; title=&quot;#Bash解析&quot;&gt;#Bash解析&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AST&quot; title=&quot;#AST&quot;&gt;#AST&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; title=&quot;#命令行工具&quot;&gt;#命令行工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E5%88%86%E6%9E%90&quot; title=&quot;#静态分析&quot;&gt;#静态分析&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 定位清晰：unbash 是一个用 TypeScript 编写的、零依赖的 Bash 解析器，能将 Bash 源码（命令、脚本或嵌入在其他格式中的 shell 代码）解析为带类型和源码位置的 AST，且不执行代码&lt;br /&gt;2. 适用场景丰富：可用于权限审核、静态盘点脚本中的可执行文件和依赖引用、将 &lt;code&gt;curl&lt;/code&gt; 等命令结构化导入、为粘贴的 Bash 代码附加诊断信息、构建可视化解释、以及安全地查找和迁移命令调用&lt;br /&gt;3. 语法支持全面：涵盖命令、控制流、管道、重定向、赋值、复合语句、参数扩展、进程替换、heredoc、算术表达式等，嵌套命令在参数、数组索引、算术表达式中仍保持结构化&lt;br /&gt;4. 容错能力强：对于畸形或不完整的输入，会返回尽力而为的部分 AST，并附带带源码位置的错误信息，适合处理编辑器输入或用户粘贴内容&lt;br /&gt;5. 性能碾压对手：在多个基准测试中，解析吞吐量远超 tree-sitter-bash（约 717 倍）、sh-syntax（约 92870 倍）和 bash-parser（约 275291 倍），包体积仅 80KB 压缩后 19KB&lt;br /&gt;6. 与竞品差异化明显：相比 tree-sitter-bash 提供的是可执行语法的类型化 AST 而非 CST；相比 sh-syntax 无需 WASM 且 API 更轻量；相比 bash-parser 支持更多 Bash 特性（如 &lt;code&gt;[[ ]]&lt;/code&gt;、&lt;code&gt;(( ))&lt;/code&gt;、herestrings、process substitution 等）且具备错误恢复能力&lt;br /&gt;7. 与 shellcheck 的互补关系：unbash 专注于&quot;解析结构&quot;，不做语义分析；以下场景推荐用 shellcheck 而非 unbash：&lt;br /&gt;   - 检查变量是否已定义或是否被引用（如未引用变量 &lt;code&gt;$var&lt;/code&gt; 可能引发 word splitting）&lt;br /&gt;   - 检测命令是否存在及其参数合法性（如 &lt;code&gt;git --不存在的参数&lt;/code&gt; 语法正确但运行会报错）&lt;br /&gt;   - 识别常见陷阱和反模式（如 &lt;code&gt;cat file | grep pattern&lt;/code&gt; 可简化为 &lt;code&gt;grep pattern file&lt;/code&gt;）&lt;br /&gt;   - 检查权限相关风险（如 &lt;code&gt;rm -rf /$undefined_var&lt;/code&gt; 的潜在危险）&lt;br /&gt;   - 提供可操作的修复建议（shellcheck 会直接给出 SC 规则编号和修复方案）&lt;br /&gt;   - 对脚本进行全面的最佳实践审查（POSIX 兼容性、可移植性建议等）&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/webpro-nl/unbash&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/webpro-nl/unbash&quot;&gt;https://github.com/webpro-nl/unbash&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/webpro-nl/unbash&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Fast 0-deps bash parser written in TypeScript. Contribute to webpro-nl/unbash development by creating an account on GitHub.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - webpro-nl/unbash: Fast 0-deps bash parser written in TypeScript&quot; src=&quot;/static/https://cdn4.telesco.pe/file/BaE033I9zRgXTSsSCy6iHGQ9io1NYetTcqn_wqYKlVTjsxBwNUXlhRDZ6VfcNsxY_8zV8euTjvXWN5JEnia1UyW9TVyX_BFxDV_5y0XrQd2SR0DAoVqc7KESfCh3IX453yePnX5H6-8s6UuHwynpSDq4vJoe6WNWCCyLaPrTYBZldP3edfrcvkAZPc1KWU3-nHwVUTXVA9W-qP10qV9vfVIU4kL6lkARCT381xp4QhyWkpJv21XJx_1JKit6LD3BM5Wz1L8__JRtzOAiLqIZuaSQGI2PRXmFN5RJyYyTxzLEvVMIbtIvzGrPlIkq70ODLOWoNApoqokT5jsbGtmnCA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - webpro-nl/unbash: Fast 0-deps bash parser written in TypeScript&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Fast 0-deps bash parser written in TypeScript. Contribute to webpro-nl/unbash development by creating an account on GitHub.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《为什么我放弃Next.js和RSC，回归传统SPA与独立后端》</title><link>https://channel.meo-ai.com/posts/654</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/654</guid><pubDate>Mon, 01 Jun 2026 00:06:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《为什么我放弃Next.js和RSC，回归传统SPA与独立后端》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJS&quot; title=&quot;#NextJS&quot;&gt;#NextJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React_Server_Components&quot; title=&quot;#React_Server_Components&quot;&gt;#React_Server_Components&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA&quot; title=&quot;#SPA&quot;&gt;#SPA&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1&quot; title=&quot;#架构设计&quot;&gt;#架构设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%89%E5%85%A8&quot; title=&quot;#安全&quot;&gt;#安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Hono&quot; title=&quot;#Hono&quot;&gt;#Hono&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者回顾了自己从Next.js忠实用户到拥抱App Router/RSC，最终回归传统SPA+独立后端的完整历程。文章深入分析了RSC架构带来的心智负担、序列化开销和安全风险，结合2025-2026年多起严重CVE漏洞，论证了将渲染框架与安全边界解耦的必要性，并分享了当前基于React Router+Vite+Hono的简洁技术栈。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Next.js的黄金时代&lt;/b&gt;：Pages Router时期心智模型清晰，服务端/客户端边界一目了然，文件路由简单易懂，部署零成本&lt;br /&gt;2. &lt;b&gt;App Router带来的混乱&lt;/b&gt;：Server/Client Component区分成为负担，&quot;use client&quot;指令传染性强，开发/构建/生产环境缓存行为不一致，服务端客户端边界变得不可见&lt;br /&gt;3. &lt;b&gt;安全漏洞敲响警钟&lt;/b&gt;：2025年CVE-2025-29927中间件绕过(CVSS 9.1)、2025年底RSC核心包10分满分漏洞CVE-2025-55182、2026年初多起Server Function DoS漏洞，攻击面集中在服务端渲染和反序列化环节&lt;br /&gt;4. &lt;b&gt;TanStack并非避风港&lt;/b&gt;：2026年5月TanStack遭遇供应链攻击，42个包被投毒，说明换框架不能免疫风险，减少依赖面才是关键&lt;br /&gt;5. &lt;b&gt;序列化是根本原因&lt;/b&gt;：RSC的&quot;无缝&quot;本质是分布式系统的序列化问题，函数、类实例、错误栈都无法透明穿越边界，反序列化不可信输入成为高危攻击面&lt;br /&gt;6. &lt;b&gt;当前架构选择&lt;/b&gt;：React Router框架模式+Vite纯SPA（仅营销页预渲染）+ Hono独立后端，API通过显式HTTP调用，无RSC负载，无服务端序列化&lt;br /&gt;7. &lt;b&gt;安全设计原则&lt;/b&gt;：认证授权在API层强制执行，前端中间件只做UX跳转，CORS/CSRF/验证码/限流全部在可控的后端实现，与渲染框架彻底解耦&lt;br /&gt;8. &lt;b&gt;核心收获&lt;/b&gt;：架构清晰可指认、无序列化税、前端攻击面趋近于零、后端语言自由选型、依赖更少爆炸半径更小——&quot;无聊&quot;在软件工程里是赞美&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&quot;&gt;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&lt;/a&gt;</content:encoded></item></channel></rss>