<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SPA | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《React Router v8 发布：最&quot;无聊&quot;的一次大版本升级》</title><link>https://channel.meo-ai.com/posts/666</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/666</guid><pubDate>Sun, 21 Jun 2026 08:48:50 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《React Router v8 发布：最&quot;无聊&quot;的一次大版本升级》&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=%23React_Router&quot; title=&quot;#React_Router&quot;&gt;#React_Router&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Remix&quot; title=&quot;#Remix&quot;&gt;#Remix&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vite&quot; title=&quot;#Vite&quot;&gt;#Vite&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React19&quot; title=&quot;#React19&quot;&gt;#React19&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA_SSR&quot; title=&quot;#SPA_SSR&quot;&gt;#SPA_SSR&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%A1%86%E6%9E%B6%E5%8D%87%E7%BA%A7&quot; title=&quot;#框架升级&quot;&gt;#框架升级&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;React Router v8 正式发布，主打&quot;最无聊的大版本升级&quot;理念。v7 引入的 Framework Mode 已成熟，v8 在此基础上将多个 future flags 转正为默认行为，带来 40+ 项改进，包括中间件增强、路由模块拆分、类型安全的 href、Link 遮罩等。破坏性变更极少，升级路径平滑。团队同时宣布采用年度大版本发布节奏，并正式将 React Router v6 和 Remix v2 标记为生命周期结束（EOL）。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 升级超省心：v8 的破坏性变更极少，大部分改动在 v7 中就能提前完成，团队的目标是&quot;让大版本升级尽可能无聊&quot;&lt;br /&gt;2. 基线要求更新：最低支持 Node 22.22+、React 19.2.7+、Vite 7+，且改为纯 ESM 发布，tsconfig 目标更新至 ES2022&lt;br /&gt;3. Future Flags 转正：v8 移除了多个 future flags，其对应功能现在默认启用，比如中间件、透传请求、Vite Environment API 支持等&lt;br /&gt;4. Remix 走向新方向：Remix v0.x-2.x 的功能已合并回 React Router，Remix 3 将转型为真正的全栈零依赖 JS 框架，与 React Router 并行发展&lt;br /&gt;5. 年度发布节奏：从 v8 开始采用每年一次大版本发布，让升级更可预测、更稳定&lt;br /&gt;6. v6/v7 生命周期：v6 和 Remix v2 正式 EOL，不再接收安全更新；v7 继续接收安全补丁&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://remix.run/blog/react-router-v8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://remix.run/blog/react-router-v8&quot;&gt;https://remix.run/blog/react-router-v8&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://remix.run/blog/react-router-v8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;React Router v8 is available now.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;remix.run&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;React Router v8&quot; src=&quot;/static/https://cdn4.telesco.pe/file/spAB9WMv1R2jc0yUDNKpBSo2kkzNekzbhKlhZQMlGXdoF19Yksj4x8eroj1oQrdimTd312ZI0sejk7H9-J9M1UeKaLQsLJw-RTSmF5yjxQr6dK9W3cuFkTzsVDAABR8_VTxbOF56Ij_fuZF-27gkkgM3I2meCzsKHuwIk8aDMk4aIbOszBgCcLO3CPooMcCyTJCbLlL0yeENiI9Po6qnv2EUSi_EcPxC3jyp_fmawCrDV9pVey93yXYv7SQO7NYkXyforBPgRKcTNbgHbG8NVzq1xwkDf4yy4aUFRaUcAe6AczappwewUGzl4kjdzfQoMyVRXqyLeSBfcaSWVtGbhw.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;React Router v8&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;React Router v8 is available now.&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><item><title>《利用浏览器Canvas进行数据压缩》</title><link>https://channel.meo-ai.com/posts/565</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/565</guid><pubDate>Fri, 27 Feb 2026 02:29:12 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《利用浏览器Canvas进行数据压缩》&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=%23JavaScript&quot; title=&quot;#JavaScript&quot;&gt;#JavaScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CanvasAPI&quot; title=&quot;#CanvasAPI&quot;&gt;#CanvasAPI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9&quot; title=&quot;#数据压缩&quot;&gt;#数据压缩&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23PNG%E7%BC%96%E7%A0%81&quot; title=&quot;#PNG编码&quot;&gt;#PNG编码&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7&quot; title=&quot;#浏览器兼容性&quot;&gt;#浏览器兼容性&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA&quot; title=&quot;#SPA&quot;&gt;#SPA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：本文介绍了一种利用浏览器Canvas API将任意数据压缩为PNG图像格式的技术方案。通过将字节数据编码为像素颜色值并生成PNG图像，可以间接调用浏览器内置的压缩算法，实现无需外部依赖的数据压缩。该方法特别适用于需要在旧版浏览器中压缩数据、或需要将SPA状态序列化到URL中的场景，提供了Compression Streams API不可用时的替代方案。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 背景需求：在静态网站和SPA中，有时需要将状态数据序列化到URL hash中，因此需要前端数据压缩方案；虽然2023年5月后Compression Streams API已普及，但旧版浏览器仍需替代方案&lt;br /&gt;- 核心原理：浏览器内置了优化的压缩库用于HTTP请求和图片处理，通过将数据编码为PNG像素数据，可间接利用浏览器的无损压缩能力&lt;br /&gt;- 技术实现：将Uint8Array数据按RGB通道编码到Canvas像素中（首字节存储最后一像素的有效字节数），Alpha通道固定为255以确保跨浏览器一致性，最终通过toDataURL(&quot;image/png&quot;)获取base64编码的压缩数据&lt;br /&gt;- 解压流程：异步加载生成的PNG图片，读取像素数据后过滤Alpha通道，根据首字节指示的有效长度提取原始字节数据&lt;br /&gt;- 方案特点：即使考虑PNG格式开销，压缩后的数据通常仍小于原始数据；完全基于浏览器原生API，无需外部库依赖&lt;br /&gt;- 应用场景：旧浏览器兼容性支持、URL状态序列化、纯前端数据压缩需求&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://jstrieb.github.io/posts/canvas-compress/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://jstrieb.github.io/posts/canvas-compress/&quot;&gt;https://jstrieb.github.io/posts/canvas-compress/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://jstrieb.github.io/posts/canvas-compress&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Old browsers don’t have JavaScript compression APIs, so we store data in pixel color channels and export to PNG to compress data.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;jstrieb.github.io&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Using the Browser’s &amp;lt;canvas&amp;gt; for Data Compression&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Old browsers don’t have JavaScript compression APIs, so we store data in pixel color channels and export to PNG to compress data.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>