Now vibe coding, so learning hammer FE ?
《Storybook 10.4 发布》
标签:#前端 #DevTools #Storybook #React #TanStackReact #ReactNative #AIAgent #MCP
总结:
Storybook 10.4 聚焦 AI 辅助开发与团队协作提效。AI Agent 现在能自动完成复杂项目的初始化、Mock 配置、Stories 编写与测试验证;侧边栏新增变更检测过滤器,帮你秒速锁定受代码改动影响的组件;一键分享让非技术成员无需等待 PR 或 CI 就能即时查看工作进度。此外还带来 TanStack React 官方支持、React Native 隔离优化,以及实验性的 React Component Meta 分析器,组件识别率达 100%,热更新速度最高提升 81 倍。
文章要点:
1. AI 全自动配置:只需一句 Prompt,AI Agent 就能分析项目结构、生成 Storybook 配置、编写 MSW Mock 和交互测试,并自动验证渲染效果。已在 Excalidraw、Bluesky 等复杂项目验证可行。
2. 侧边栏变更检测:新增 New、Modified、Related 三种过滤器,帮你秒速锁定代码变更波及的所有 Stories,特别适合 AI 生成代码后的快速审阅。
3. 一键云端分享:点击 Share 按钮即可将当前 Storybook 发布到 Chromatic,设计师和产品经理不用等 PR 或 CI,点开链接就能直接看效果、提反馈。
4. TanStack React 官方支持:全新 @storybook/tanstack-react 包,零配置接入类型安全路由与 Server Functions,由 Storybook 与 TanStack 核心团队联合打造。
5. React Native 隔离升级:新增独立应用入口,通过环境变量自动切换,Storybook 代码与业务代码完全隔离,零配置起步且向后兼容。
6. React Component Meta 实验特性:基于 Volar 和 TS Language Server 的新一代 Docgen,组件检出率 100%,开发模式热更新比旧方案快 43 到 81 倍,为 AI 提供更精准的组件元数据。
URL:https://storybook.js.org/blog/storybook-10-4/
标签:#前端 #DevTools #Storybook #React #TanStackReact #ReactNative #AIAgent #MCP
总结:
Storybook 10.4 聚焦 AI 辅助开发与团队协作提效。AI Agent 现在能自动完成复杂项目的初始化、Mock 配置、Stories 编写与测试验证;侧边栏新增变更检测过滤器,帮你秒速锁定受代码改动影响的组件;一键分享让非技术成员无需等待 PR 或 CI 就能即时查看工作进度。此外还带来 TanStack React 官方支持、React Native 隔离优化,以及实验性的 React Component Meta 分析器,组件识别率达 100%,热更新速度最高提升 81 倍。
文章要点:
1. AI 全自动配置:只需一句 Prompt,AI Agent 就能分析项目结构、生成 Storybook 配置、编写 MSW Mock 和交互测试,并自动验证渲染效果。已在 Excalidraw、Bluesky 等复杂项目验证可行。
2. 侧边栏变更检测:新增 New、Modified、Related 三种过滤器,帮你秒速锁定代码变更波及的所有 Stories,特别适合 AI 生成代码后的快速审阅。
3. 一键云端分享:点击 Share 按钮即可将当前 Storybook 发布到 Chromatic,设计师和产品经理不用等 PR 或 CI,点开链接就能直接看效果、提反馈。
4. TanStack React 官方支持:全新 @storybook/tanstack-react 包,零配置接入类型安全路由与 Server Functions,由 Storybook 与 TanStack 核心团队联合打造。
5. React Native 隔离升级:新增独立应用入口,通过环境变量自动切换,Storybook 代码与业务代码完全隔离,零配置起步且向后兼容。
6. React Component Meta 实验特性:基于 Volar 和 TS Language Server 的新一代 Docgen,组件检出率 100%,开发模式热更新比旧方案快 43 到 81 倍,为 AI 提供更精准的组件元数据。
URL:https://storybook.js.org/blog/storybook-10-4/
《TanStack中的React服务端组件》
标签:#前端 #React_Server_Components #TanStack_Start #NextJs #Bundle_Optimization
总结:
TanStack Start实现了与Next.js截然不同的React服务端组件方案,通过显式API将组件渲染保留在服务端,避免将繁重代码发送至客户端。文章以应用外壳为例,展示RSC如何将客户端Bundle从308KB缩减至203KB,并说明其适合大型非交互式组件树的场景,同时澄清RSC并非数据加载或SSR的替代品,而是针对性的性能优化工具。
文章要点:
1. RSC是只在服务端运行的React组件,可以直接在组件里写await查数据,而且组件代码不会发送到浏览器,不用担心数据库密码暴露给前端
2. TanStack实现RSC的方式特别直白,通过renderServerComponent这类API就能显式声明,作者认为比Next.js的实现更好懂
3. 别误会,RSC不是用来替代数据加载或SSR的,TanStack的loader和原有的服务端渲染已经做得很好了,RSC真正的价值是帮浏览器"减肥"
4. 文章举了个生动的例子:故意引入整个图标库来模拟大型组件树,结果RSC把客户端JS从308KB砍到了203KB,省了不少流量
5. 更妙的是RSC还能接收客户端组件当"插槽"传进来,配合Suspense实现流式渲染,让页面边加载边呈现,体验很丝滑
6. 不过作者也提醒,RSC不是银弹,如果你的组件树不大、依赖不多,用它带来的收益可能微乎其微,得看场景取舍
URL:https://frontendmasters.com/blog/react-server-components-in-tanstack/
标签:#前端 #React_Server_Components #TanStack_Start #NextJs #Bundle_Optimization
总结:
TanStack Start实现了与Next.js截然不同的React服务端组件方案,通过显式API将组件渲染保留在服务端,避免将繁重代码发送至客户端。文章以应用外壳为例,展示RSC如何将客户端Bundle从308KB缩减至203KB,并说明其适合大型非交互式组件树的场景,同时澄清RSC并非数据加载或SSR的替代品,而是针对性的性能优化工具。
文章要点:
1. RSC是只在服务端运行的React组件,可以直接在组件里写await查数据,而且组件代码不会发送到浏览器,不用担心数据库密码暴露给前端
2. TanStack实现RSC的方式特别直白,通过renderServerComponent这类API就能显式声明,作者认为比Next.js的实现更好懂
3. 别误会,RSC不是用来替代数据加载或SSR的,TanStack的loader和原有的服务端渲染已经做得很好了,RSC真正的价值是帮浏览器"减肥"
4. 文章举了个生动的例子:故意引入整个图标库来模拟大型组件树,结果RSC把客户端JS从308KB砍到了203KB,省了不少流量
5. 更妙的是RSC还能接收客户端组件当"插槽"传进来,配合Suspense实现流式渲染,让页面边加载边呈现,体验很丝滑
6. 不过作者也提醒,RSC不是银弹,如果你的组件树不大、依赖不多,用它带来的收益可能微乎其微,得看场景取舍
URL:https://frontendmasters.com/blog/react-server-components-in-tanstack/
《Orval:从OpenAPI规范自动生成类型安全客户端代码》
标签:#前端 #全栈 #OpenAPI #TypeScript #CodeGeneration #ReactQuery #Swagger #APIClient
总结:
Orval 是一个代码生成工具,能读取 OpenAPI v3 或 Swagger v2 规范(支持 yaml 和 json 格式),自动生成带完整 TypeScript 类型签名的客户端代码。它支持 React Query、SWR、Vue Query、Svelte Query、Solid Query、Angular、Hono、Zod、原生 fetch 和 MCP 等多种框架与库,同时还能生成模型、请求函数、Hooks 和 Mock 数据。项目提供在线 Playground 快速体验,开发时使用 Bun 构建,社区活跃且有赞助支持。
文章要点:
1. Orval 的核心能力是从 OpenAPI / Swagger 文档一键生成类型安全的 TS 客户端,告别手写接口代码的繁琐工作
2. 生态支持非常全面,覆盖了 React、Vue、Svelte、Solid、Angular 等主流前端框架,还有 React Query、SWR 等数据获取方案
3. 不只是生成请求函数,还能顺带产出数据模型(Models)、React Hooks、以及用于测试的 Mock 数据,一条龙服务
4. 项目内置了在线 Playground,不用安装就能上手体验,对新手和想快速验证的同学很友好
5. 开发侧使用 Bun 作为包管理工具,测试流程完善,包含单元测试、快照测试和 CLI 验证
URL:https://github.com/orval-labs/orval
标签:#前端 #全栈 #OpenAPI #TypeScript #CodeGeneration #ReactQuery #Swagger #APIClient
总结:
Orval 是一个代码生成工具,能读取 OpenAPI v3 或 Swagger v2 规范(支持 yaml 和 json 格式),自动生成带完整 TypeScript 类型签名的客户端代码。它支持 React Query、SWR、Vue Query、Svelte Query、Solid Query、Angular、Hono、Zod、原生 fetch 和 MCP 等多种框架与库,同时还能生成模型、请求函数、Hooks 和 Mock 数据。项目提供在线 Playground 快速体验,开发时使用 Bun 构建,社区活跃且有赞助支持。
文章要点:
1. Orval 的核心能力是从 OpenAPI / Swagger 文档一键生成类型安全的 TS 客户端,告别手写接口代码的繁琐工作
2. 生态支持非常全面,覆盖了 React、Vue、Svelte、Solid、Angular 等主流前端框架,还有 React Query、SWR 等数据获取方案
3. 不只是生成请求函数,还能顺带产出数据模型(Models)、React Hooks、以及用于测试的 Mock 数据,一条龙服务
4. 项目内置了在线 Playground,不用安装就能上手体验,对新手和想快速验证的同学很友好
5. 开发侧使用 Bun 作为包管理工具,测试流程完善,包含单元测试、快照测试和 CLI 验证
URL:https://github.com/orval-labs/orval
《React应用安全指南》
标签:#前端 #React #WebSecurity #XSS_Prevention #Content_Security_Policy #Server_Side_Validation
总结:
React内置的JSX自动转义机制能有效防御常见XSS攻击,但随着Server Components普及,前端开发者需承担更多安全责任。本文系统梳理了React应用的安全实践:正确使用dangerouslySetInnerHTML的消毒策略、采用HttpOnly Cookie的安全认证方案、服务端输入验证与参数化查询、以及CSP策略的纵深防御配置,帮助开发者构建多层防护体系。
文章要点:
1. React的JSX表达式会自动将
2. 一旦使用 dangerouslySetInnerHTML 这个"逃生舱",就必须先用 DOMPurify 对HTML做彻底消毒,剥离危险标签和
3. 认证令牌千万别往 localStorage 里塞,XSS漏洞一出现令牌就会被顺走;改用 HttpOnly Cookie,配合 Secure 和 SameSite=Strict 属性,再辅以CSRF Token,才能守住登录态
4. 客户端验证只是改善体验,真正的安全防线在服务端;用 Zod 做类型安全的Schema校验,数据库查询坚持用参数化占位符(如
5. Content Security Policy 是最后一道保险,通过HTTP头限制资源加载来源,用 nonce 管理必要的内联脚本,配合 strict-dynamic 支持React代码分割,上线前记得先用 Report-Only 模式测试策略
URL:
https://certificates.dev/blog/security-in-react-applications
标签:#前端 #React #WebSecurity #XSS_Prevention #Content_Security_Policy #Server_Side_Validation
总结:
React内置的JSX自动转义机制能有效防御常见XSS攻击,但随着Server Components普及,前端开发者需承担更多安全责任。本文系统梳理了React应用的安全实践:正确使用dangerouslySetInnerHTML的消毒策略、采用HttpOnly Cookie的安全认证方案、服务端输入验证与参数化查询、以及CSP策略的纵深防御配置,帮助开发者构建多层防护体系。
文章要点:
1. React的JSX表达式会自动将
< > & 等特殊字符转义为HTML实体,这是抵御XSS的第一道防线,所有通过 {} 渲染的内容默认都是安全的2. 一旦使用 dangerouslySetInnerHTML 这个"逃生舱",就必须先用 DOMPurify 对HTML做彻底消毒,剥离危险标签和
javascript: 等恶意协议,Markdown渲染也建议转成React元素而非原始HTML3. 认证令牌千万别往 localStorage 里塞,XSS漏洞一出现令牌就会被顺走;改用 HttpOnly Cookie,配合 Secure 和 SameSite=Strict 属性,再辅以CSRF Token,才能守住登录态
4. 客户端验证只是改善体验,真正的安全防线在服务端;用 Zod 做类型安全的Schema校验,数据库查询坚持用参数化占位符(如
$1 $2),永远不要把用户输入拼进SQL字符串5. Content Security Policy 是最后一道保险,通过HTTP头限制资源加载来源,用 nonce 管理必要的内联脚本,配合 strict-dynamic 支持React代码分割,上线前记得先用 Report-Only 模式测试策略
URL:
https://certificates.dev/blog/security-in-react-applications
《为特定场景"投影"React:从60KB到7KB的极致裁剪实验》
标签:#前端 #工程化 #React #TanStackStart #AICoding #PerformanceOptimization #Vite #RSC #BundleSize
总结:
TanStack作者Tanner Linsley发现React 19在Vite打包后仍占约60KB gzip,远大于TanStack全家桶总和。受"代码即物化视图"理念启发,他借助AI代理在一天内生成了一个针对TanStack Start需求定制的React"投影"——保留完整公共API,但移除并发调度、时间切片等不需要的功能,核心仅7.08KB gzip。该项目已在其个人博客和tanstack.com生产环境运行,JS体积减少33%至85%,渲染性能提升2到3倍,验证了当代码生成成本骤降时,为特定场景定制依赖库投影的可行性。
文章要点:
- 作者发现React打包后仍有约60KB,比TanStack全家桶加起来还"胖",成了整个技术栈里"最不能删却又最大块头"的存在
- 本想用Preact"瘦身",但它和React 19在use()、服务端动作、hydration等边缘地带已经"渐行渐远",补丁叠补丁让人望而却步
- 一个超酷的观点启发了他:如果写代码能像查数据库一样"按需生成",那代码本身只是"理念"的一种展示形式,我们完全可以为不同场景生成不同版本的React
- 借助AI代理,只用一天就"捏"出了一个迷你版React,保留了你熟悉的hooks、JSX、Suspense和SSR,但扔掉了并发调度、时间切片这些TanStack Start用不上的"重型装备"
- 设计得像乐高一样:7KB核心底座 + 8个可插拔功能(context、suspense、portal等),不需要的模块在构建时直接替换成空实现,不会混进最终包
- 真刀真枪上了生产环境:个人博客JS少了三分之一,首屏快了近两成;tanstack.com这种"重火力"站点也成功扛住,客户端JS砍掉近1MB
- 作者抛出思考题:当定制一个库的成本从几个月降到几天,继续默认 shipped 全套通用库,反而成了一种需要掂量的选择
- 他强调这不是要"取代React",更像是Linux发行版或歌曲混音——同一个内核,根据不同听众的口味调出不同版本
文章URL:https://tannerlinsley.com/posts/projecting-react
标签:#前端 #工程化 #React #TanStackStart #AICoding #PerformanceOptimization #Vite #RSC #BundleSize
总结:
TanStack作者Tanner Linsley发现React 19在Vite打包后仍占约60KB gzip,远大于TanStack全家桶总和。受"代码即物化视图"理念启发,他借助AI代理在一天内生成了一个针对TanStack Start需求定制的React"投影"——保留完整公共API,但移除并发调度、时间切片等不需要的功能,核心仅7.08KB gzip。该项目已在其个人博客和tanstack.com生产环境运行,JS体积减少33%至85%,渲染性能提升2到3倍,验证了当代码生成成本骤降时,为特定场景定制依赖库投影的可行性。
文章要点:
- 作者发现React打包后仍有约60KB,比TanStack全家桶加起来还"胖",成了整个技术栈里"最不能删却又最大块头"的存在
- 本想用Preact"瘦身",但它和React 19在use()、服务端动作、hydration等边缘地带已经"渐行渐远",补丁叠补丁让人望而却步
- 一个超酷的观点启发了他:如果写代码能像查数据库一样"按需生成",那代码本身只是"理念"的一种展示形式,我们完全可以为不同场景生成不同版本的React
- 借助AI代理,只用一天就"捏"出了一个迷你版React,保留了你熟悉的hooks、JSX、Suspense和SSR,但扔掉了并发调度、时间切片这些TanStack Start用不上的"重型装备"
- 设计得像乐高一样:7KB核心底座 + 8个可插拔功能(context、suspense、portal等),不需要的模块在构建时直接替换成空实现,不会混进最终包
- 真刀真枪上了生产环境:个人博客JS少了三分之一,首屏快了近两成;tanstack.com这种"重火力"站点也成功扛住,客户端JS砍掉近1MB
- 作者抛出思考题:当定制一个库的成本从几个月降到几天,继续默认 shipped 全套通用库,反而成了一种需要掂量的选择
- 他强调这不是要"取代React",更像是Linux发行版或歌曲混音——同一个内核,根据不同听众的口味调出不同版本
文章URL:https://tannerlinsley.com/posts/projecting-react
《编写可维护CSS的实践指南》
标签:#前端 #CSS #TailwindCSS #AtomicCSS #StyleX #CSSModules #CSS_Scoping #CSS_Variables #CSS_Layers #Fluid_Typography #StyleLint #Component_Scoped_CSS
总结:
两位前端老兵Wes Bos和Scott Tolinski畅聊如何让CSS不变成"垃圾场"。核心思路是选一个系统坚持到底、用变量代替硬编码、保持组件独立可移植,并善用现代CSS原生能力(如@scope、@layer、clamp流体排版)减少媒体查询的重复劳动。他们还对比了Tailwind、StyleX、CSS Modules等主流方案,强调好CSS要"有弹性"——能自适应容器变化,而不是在每个断点重写一遍样式。
文章要点:
- **样式别"漏"出去**:好CSS要像密封舱,组件拆下来放在白纸上照样好看;如果样式太宽泛、到处泄漏,代码很快就会腐烂发臭
- **变量是救命稻草**:颜色、字体、阴影全进变量里,别写死数值;不然一年后你会在代码里挖出40种不同的灰色,改起来想哭
- **给CSS分层控权**:用`@layer`把重置、主题、组件样式分楼层,告别"加权重、加!important"的 specificity 战争,心里踏实多了
- **原生作用域来了**:`@scope`已经登陆主流浏览器,甚至可以把`<style>`直接丢进组件里自动限定范围,Vue和Svelte用户听了直呼"终于等到你"
- **流体排版超省心**:用`clamp()`做字体大小,让文字在手机和桌面之间丝滑缩放,很多时候连媒体查询都可以省了
- **Tailwind vs CSS Modules vs StyleX**:Tailwind像速记本,上手快但类名堆成山;CSS Modules稳扎稳打;StyleX走构建时优化路线,但媒体查询语法劝退不少人——选哪个不重要,关键是别混着用
- **上StyleLint当"坏人"**:让工具自动拦住"用硬编码颜色"这类操作,比你在PR里当挑刺老哥体面多了,团队协作必备
文章URL:https://syntax.fm/show/999/writing-maintainable-css/transcript
标签:#前端 #CSS #TailwindCSS #AtomicCSS #StyleX #CSSModules #CSS_Scoping #CSS_Variables #CSS_Layers #Fluid_Typography #StyleLint #Component_Scoped_CSS
总结:
两位前端老兵Wes Bos和Scott Tolinski畅聊如何让CSS不变成"垃圾场"。核心思路是选一个系统坚持到底、用变量代替硬编码、保持组件独立可移植,并善用现代CSS原生能力(如@scope、@layer、clamp流体排版)减少媒体查询的重复劳动。他们还对比了Tailwind、StyleX、CSS Modules等主流方案,强调好CSS要"有弹性"——能自适应容器变化,而不是在每个断点重写一遍样式。
文章要点:
- **样式别"漏"出去**:好CSS要像密封舱,组件拆下来放在白纸上照样好看;如果样式太宽泛、到处泄漏,代码很快就会腐烂发臭
- **变量是救命稻草**:颜色、字体、阴影全进变量里,别写死数值;不然一年后你会在代码里挖出40种不同的灰色,改起来想哭
- **给CSS分层控权**:用`@layer`把重置、主题、组件样式分楼层,告别"加权重、加!important"的 specificity 战争,心里踏实多了
- **原生作用域来了**:`@scope`已经登陆主流浏览器,甚至可以把`<style>`直接丢进组件里自动限定范围,Vue和Svelte用户听了直呼"终于等到你"
- **流体排版超省心**:用`clamp()`做字体大小,让文字在手机和桌面之间丝滑缩放,很多时候连媒体查询都可以省了
- **Tailwind vs CSS Modules vs StyleX**:Tailwind像速记本,上手快但类名堆成山;CSS Modules稳扎稳打;StyleX走构建时优化路线,但媒体查询语法劝退不少人——选哪个不重要,关键是别混着用
- **上StyleLint当"坏人"**:让工具自动拦住"用硬编码颜色"这类操作,比你在PR里当挑刺老哥体面多了,团队协作必备
文章URL:https://syntax.fm/show/999/writing-maintainable-css/transcript
《Datatype:用字体把文字变成图表的魔法》
标签:#前端 #OpenType #可变字体 #数据可视化 #字体设计
总结:
Datatype 是一款开源可变字体,利用 OpenType 连字替换技术,将纯文本表达式(如
文章要点:
- **纯字体驱动,零 JS 依赖**:利用 OpenType 的
- **三种图表,一句话搞定**:支持条形图
- **可变字体,随意调节**:通过 `wdth`(字宽 50–150)和 `wght`(字重 100–900)两个轴,可以像调音量一样控制图表的间距和线条粗细,适配不同排版场景
- **轻到不可思议**:WOFF2 格式仅 73KB,TTF 4MB,覆盖 Google Fonts Latin Core 字符集,对网页性能几乎零负担
- **开箱即用,跨平台友好**:Web 端一行 `@font-face` 即可;桌面端安装 TTF 后,在 Adobe 等支持 OpenType 连字的软件里直接粘贴文本就能出图
- **开源可定制**:基于 Python + fontTools 构建,提供完整的构建脚本和开发服务器,方便开发者二次修改或扩展新的图表类型
文章URL:https://github.com/franktisellano/datatype
标签:#前端 #OpenType #可变字体 #数据可视化 #字体设计
总结:
Datatype 是一款开源可变字体,利用 OpenType 连字替换技术,将纯文本表达式(如
{b:30,70,50,90}`)实时渲染为条形图、折线图和饼图,无需任何 JavaScript 或图片资源。它通过 CSS 的 `font-variation-settings 控制字宽和字重,WOFF2 仅 73KB,兼容所有现代浏览器,为网页和桌面应用提供了一种零依赖、高性能的轻量级数据可视化方案。文章要点:
- **纯字体驱动,零 JS 依赖**:利用 OpenType 的
calt`(上下文替换)和 `liga`(标准连字)特性,把 {b:1,3,7}` 这类文本直接变成条形图,不需要加载任何图表库或图片- **三种图表,一句话搞定**:支持条形图
{b:...}`、折线图 {l:...} 和饼图 {p:...}`,每种最多支持 20 个数据点,数值范围 0–100,语法简单得像在聊天- **可变字体,随意调节**:通过 `wdth`(字宽 50–150)和 `wght`(字重 100–900)两个轴,可以像调音量一样控制图表的间距和线条粗细,适配不同排版场景
- **轻到不可思议**:WOFF2 格式仅 73KB,TTF 4MB,覆盖 Google Fonts Latin Core 字符集,对网页性能几乎零负担
- **开箱即用,跨平台友好**:Web 端一行 `@font-face` 即可;桌面端安装 TTF 后,在 Adobe 等支持 OpenType 连字的软件里直接粘贴文本就能出图
- **开源可定制**:基于 Python + fontTools 构建,提供完整的构建脚本和开发服务器,方便开发者二次修改或扩展新的图表类型
文章URL:https://github.com/franktisellano/datatype
《用 React、GSAP 和 AI 打造 Maxima Therapy 网站》
标签:#前端 #React #GSAP #TailwindCSS #ReactRouter #AI辅助开发 #创意编程 #Lottie #MatterJS #ScrollTrigger
总结:
本文是 Codrops 上的一篇案例复盘,记录了团队为神经多样性支持机构 Maxima Therapy 打造高互动、高插画风格网站的全过程。文章详细介绍了技术栈选型(Sanity + React Router + GSAP + TailwindCSS)、多个核心交互模块的实现思路(可拖拽轮播、SVG 水波纹、物理绳索、形状变形、贴纸动效),以及 AI(Claude Code)在实际开发中的辅助作用与局限。对于想在前端项目中融合创意动画与 AI 提效的开发者来说,这是一份非常接地气的实战参考。
文章要点:
- 技术栈选型很务实:团队选了 React Router(而非 Next.js)做静态生成,搭配 Sanity 做 CMS、Cloudflare Pages 托管,理由是配置更轻量;GSAP + Lenis 负责动画和滚动平滑,TailwindCSS 负责样式,TypeScript 做类型检查
- 首页轮播的交互设计很巧妙:把四个节目板块拆成四个旋转的
- SVG 水波纹效果用 AI 辅助生成:Claude Code 帮忙把原始 SVG 路径转换成带 50 个控制点的系统,再结合 GSAP 实现鼠标触发的涟漪动画——AI 在创意编码这类"繁琐但规则明确"的任务上表现不错
- Lottie 动画与 Canvas 背景混合:通过离屏 Canvas 绘制固定图案,再用 Lottie 的 Canvas 渲染模式做遮罩,最后用
- 物理引擎让页面更有生命力:招聘页用 Matter.js 模拟"supports"单词被两根绳索悬挂的物理效果,绳索由复合体堆叠而成,SVG 文字根据物理模拟结果实时位移
- AI 是"得力助手"但不是"万能替身":Claude Code 在 SVG 优化、Sanity 数据模型扩展、TypeScript 类型生成上帮了大忙,但也会出现结果不一致、擅自改动数据获取模式、甚至"幻觉"出不存在 SVG 路径的情况;团队建议把 AI 用在范围明确的小任务上
- ScrollTrigger 让滚动交互管理很轻松:配合
文章URL:
https://tympanus.net/codrops/2026/04/06/building-the-maxima-therapy-website-react-gsap-and-dabbling-with-ai/
标签:#前端 #React #GSAP #TailwindCSS #ReactRouter #AI辅助开发 #创意编程 #Lottie #MatterJS #ScrollTrigger
总结:
本文是 Codrops 上的一篇案例复盘,记录了团队为神经多样性支持机构 Maxima Therapy 打造高互动、高插画风格网站的全过程。文章详细介绍了技术栈选型(Sanity + React Router + GSAP + TailwindCSS)、多个核心交互模块的实现思路(可拖拽轮播、SVG 水波纹、物理绳索、形状变形、贴纸动效),以及 AI(Claude Code)在实际开发中的辅助作用与局限。对于想在前端项目中融合创意动画与 AI 提效的开发者来说,这是一份非常接地气的实战参考。
文章要点:
- 技术栈选型很务实:团队选了 React Router(而非 Next.js)做静态生成,搭配 Sanity 做 CMS、Cloudflare Pages 托管,理由是配置更轻量;GSAP + Lenis 负责动画和滚动平滑,TailwindCSS 负责样式,TypeScript 做类型检查
- 首页轮播的交互设计很巧妙:把四个节目板块拆成四个旋转的
<div>,只有当前可见的板块才响应交互;切换时触发路由变化,但轮播组件通过布局隔离避免了不必要的重渲染- SVG 水波纹效果用 AI 辅助生成:Claude Code 帮忙把原始 SVG 路径转换成带 50 个控制点的系统,再结合 GSAP 实现鼠标触发的涟漪动画——AI 在创意编码这类"繁琐但规则明确"的任务上表现不错
- Lottie 动画与 Canvas 背景混合:通过离屏 Canvas 绘制固定图案,再用 Lottie 的 Canvas 渲染模式做遮罩,最后用
globalCompositeOperation 合成,实现了滚动联动的背景效果- 物理引擎让页面更有生命力:招聘页用 Matter.js 模拟"supports"单词被两根绳索悬挂的物理效果,绳索由复合体堆叠而成,SVG 文字根据物理模拟结果实时位移
- AI 是"得力助手"但不是"万能替身":Claude Code 在 SVG 优化、Sanity 数据模型扩展、TypeScript 类型生成上帮了大忙,但也会出现结果不一致、擅自改动数据获取模式、甚至"幻觉"出不存在 SVG 路径的情况;团队建议把 AI 用在范围明确的小任务上
- ScrollTrigger 让滚动交互管理很轻松:配合
useGSAP hook 自动清理,避免了手动写 Intersection Observer 的繁琐,实现了文字显现、图片揭示、SVG 播放等丰富的滚动动效文章URL:
https://tympanus.net/codrops/2026/04/06/building-the-maxima-therapy-website-react-gsap-and-dabbling-with-ai/
《在本地终端预览OpenGraph卡片》
标签:#前端 #OpenGraph #CLI工具 #Zig #Kitty图形协议 #开发工具
总结:
作者为解决OpenGraph调试痛点,开发了CLI工具
文章要点:
- 传统OG调试流程繁琐:需要部署到公网或使用隧道工具,且Facebook等平台的调试器缓存机制会导致反复迭代困难
-
- 终端图片渲染基于Kitty图形协议,兼容Ghostty、iTerm2、WezTerm等主流终端,不支持的终端会自动降级为文本输出
- 工具内部使用Zig的
- 提供四种输出模式:OpenGraph预览(默认)、Twitter Card预览、表格视图、JSON格式,后者支持管道操作(如配合jq使用)
- 具备校验功能:当缺少必需的OG字段(title、type、image、url)时会输出错误并返回非零退出码,适合集成到CI流程作为布局模板检查
- 安装方式灵活:支持预编译二进制、源码编译(Zig 0.15+)和mise工具管理
文章URL:https://simonhartcher.com/posts/2026-04-15-testing-opengraph-on-localhost-from-the-cli/
标签:#前端 #OpenGraph #CLI工具 #Zig #Kitty图形协议 #开发工具
总结:
作者为解决OpenGraph调试痛点,开发了CLI工具
og-check,可直接在终端内渲染本地开发环境的OG卡片预览,无需部署到公网或使用隧道服务。工具基于Zig编写,支持Kitty图形协议在终端内显示图片,并提供OpenGraph、Twitter Card、表格和JSON四种输出格式,同时可作为CI检查工具确保OG标签完整性。文章要点:
- 传统OG调试流程繁琐:需要部署到公网或使用隧道工具,且Facebook等平台的调试器缓存机制会导致反复迭代困难
-
og-check支持在本地终端直接预览OG卡片,包含图片渲染,将反馈周期从分钟级缩短到秒级- 终端图片渲染基于Kitty图形协议,兼容Ghostty、iTerm2、WezTerm等主流终端,不支持的终端会自动降级为文本输出
- 工具内部使用Zig的
std.http.Client抓取页面,解析meta标签并按命名空间分类(og:、twitter:等),通过zigdown渲染Markdown到终端- 提供四种输出模式:OpenGraph预览(默认)、Twitter Card预览、表格视图、JSON格式,后者支持管道操作(如配合jq使用)
- 具备校验功能:当缺少必需的OG字段(title、type、image、url)时会输出错误并返回非零退出码,适合集成到CI流程作为布局模板检查
- 安装方式灵活:支持预编译二进制、源码编译(Zig 0.15+)和mise工具管理
文章URL:https://simonhartcher.com/posts/2026-04-15-testing-opengraph-on-localhost-from-the-cli/
《用TanStack_Start构建博客(上篇)》
标签:#前端 #TanStack_Start #TanStack_Router #Server_Functions #静态预渲染 #Markdown博客 #代码高亮
总结:
本文通过实战案例演示如何使用 TanStack Start 框架构建一个 Markdown 博客系统。文章重点介绍了 Server Functions 解决同构加载器无法访问文件系统的问题、动态路由参数处理、以及使用 markdown-it 和 Shiki 实现带行号的高亮代码块,为开发者提供了完整的技术实现路径。
文章要点:
- TanStack Start 是基于 TanStack Router 的轻量级服务端框架,支持 SSR、API 端点和 Server Functions
- 使用
- Server Functions 是同构应用的关键——无论 loader 在服务端还是客户端运行,都能保证文件读取逻辑始终在服务端执行
- 动态路由通过
- 使用 markdown-it + Shiki 实现代码高亮,通过自定义 transformer 支持
- 文章预告下篇将介绍静态生成和部署策略
文章URL:https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/
标签:#前端 #TanStack_Start #TanStack_Router #Server_Functions #静态预渲染 #Markdown博客 #代码高亮
总结:
本文通过实战案例演示如何使用 TanStack Start 框架构建一个 Markdown 博客系统。文章重点介绍了 Server Functions 解决同构加载器无法访问文件系统的问题、动态路由参数处理、以及使用 markdown-it 和 Shiki 实现带行号的高亮代码块,为开发者提供了完整的技术实现路径。
文章要点:
- TanStack Start 是基于 TanStack Router 的轻量级服务端框架,支持 SSR、API 端点和 Server Functions
- 使用
import.meta.glob 动态扫描 Markdown 文件,配合 gray-matter 解析文章元数据- Server Functions 是同构应用的关键——无论 loader 在服务端还是客户端运行,都能保证文件读取逻辑始终在服务端执行
- 动态路由通过
$slug.tsx 文件命名实现,配合 createFileRoute 和 head 函数设置页面标题- 使用 markdown-it + Shiki 实现代码高亮,通过自定义 transformer 支持
line-numbers 语法标记,结合 CSS counter 渲染行号- 文章预告下篇将介绍静态生成和部署策略
文章URL:https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/
《垂直代码库:告别按类型分层,拥抱按业务域组织》
标签:#前端 #代码组织 #架构设计 #Monorepo #React #软件工程
总结:
本文主张前端代码库应从"水平分层"(按 components/hooks/utils 技术类型划分)转向"垂直切片"(按业务域/功能域组织)。作者以 Sentry 代码库十年演进为例,指出水平分层会导致代码分散、认知负荷高、耦合混乱;而垂直组织将同一业务域的组件、工具、类型内聚到一起,配合 Monorepo 的显式边界(exports/eslint-plugin-boundaries),能显著提升可维护性。虽然确定正确的垂直划分需要更多团队沟通,但这是支撑代码库长期演进的必要投资。
文章要点:
- 水平分层的隐患:把代码按 components / hooks / utils / types 分类虽然上手简单,但随着项目膨胀,同一业务逻辑会被拆得七零八落——比如 PageFilters 的组件、类型、工具函数散落在三个目录,改一个小需求要跳来跳去, cognitive load 直接拉满
- 垂直切片的核心思想:不按"技术类型"而按"业务域"分组,把同一个功能域(如 dashboard、profiling、billing)相关的组件、Hook、工具、类型全部收进一个目录;就像当年我们把 HTML/CSS/JS 从三层文件合并成组件一样,这次是更高维度的"关注点内聚"
- 与团队结构天然对齐:现代产品团队通常是端到端的功能团队(dashboard 团队、replay 团队),垂直代码结构让 CODEOWNERS 和包边界直接对应团队职责,谁负责什么一目了然
- 解决跨域复用焦虑:不是所有代码都严格属于某个页面,像 PageFilters 这种被多页面使用的通用能力,完全可以作为独立垂直域存在;关键是按"逻辑关联"而非"物理位置"来划分
- 用边界守护架构:垂直化后还需降低耦合,推荐通过 Monorepo + package.json#exports 显式暴露公共 API,或借助 eslint-plugin-boundaries 禁止深路径导入,把"私有实现"真正保护起来
- 没有银弹,但值得投入:确定合理的垂直域确实比"丢进 utils"更难,也可能出现不同团队重复造轮子;但作者认为这恰恰促进了团队沟通,而沟通本就是软件工程最难也最重要的部分
文章URL:
https://tkdodo.eu/blog/the-vertical-codebase
标签:#前端 #代码组织 #架构设计 #Monorepo #React #软件工程
总结:
本文主张前端代码库应从"水平分层"(按 components/hooks/utils 技术类型划分)转向"垂直切片"(按业务域/功能域组织)。作者以 Sentry 代码库十年演进为例,指出水平分层会导致代码分散、认知负荷高、耦合混乱;而垂直组织将同一业务域的组件、工具、类型内聚到一起,配合 Monorepo 的显式边界(exports/eslint-plugin-boundaries),能显著提升可维护性。虽然确定正确的垂直划分需要更多团队沟通,但这是支撑代码库长期演进的必要投资。
文章要点:
- 水平分层的隐患:把代码按 components / hooks / utils / types 分类虽然上手简单,但随着项目膨胀,同一业务逻辑会被拆得七零八落——比如 PageFilters 的组件、类型、工具函数散落在三个目录,改一个小需求要跳来跳去, cognitive load 直接拉满
- 垂直切片的核心思想:不按"技术类型"而按"业务域"分组,把同一个功能域(如 dashboard、profiling、billing)相关的组件、Hook、工具、类型全部收进一个目录;就像当年我们把 HTML/CSS/JS 从三层文件合并成组件一样,这次是更高维度的"关注点内聚"
- 与团队结构天然对齐:现代产品团队通常是端到端的功能团队(dashboard 团队、replay 团队),垂直代码结构让 CODEOWNERS 和包边界直接对应团队职责,谁负责什么一目了然
- 解决跨域复用焦虑:不是所有代码都严格属于某个页面,像 PageFilters 这种被多页面使用的通用能力,完全可以作为独立垂直域存在;关键是按"逻辑关联"而非"物理位置"来划分
- 用边界守护架构:垂直化后还需降低耦合,推荐通过 Monorepo + package.json#exports 显式暴露公共 API,或借助 eslint-plugin-boundaries 禁止深路径导入,把"私有实现"真正保护起来
- 没有银弹,但值得投入:确定合理的垂直域确实比"丢进 utils"更难,也可能出现不同团队重复造轮子;但作者认为这恰恰促进了团队沟通,而沟通本就是软件工程最难也最重要的部分
文章URL:
https://tkdodo.eu/blog/the-vertical-codebase
《2026年JavaScript生态全景指南》
标签:#前端 #JavaScript #ECMAScript2025 #ECMAScript2026 #React #Vue #Svelte #NodeJS #TypeScript #Vite #Bun #Deno #TemporalAPI #IteratorHelpers #ImportAttributes
总结:
本文全面梳理了2026年JavaScript生态系统的最新发展,涵盖ECMAScript 2025(迭代器助手、Set方法、Promise.try等)和2026预期特性(Temporal API、资源管理),React/Vue/Svelte框架动态,Node.js原生TypeScript支持、Bun和Deno运行时竞争,Vite 8与Turbopack构建工具演进,TypeScript v6及AI编程趋势。文章强调掌握基础原理比追逐工具更重要,特别是在AI辅助编程时代,架构能力和代码品味尤为关键。
文章要点:
- **ECMAScript 2025超实用新玩具**:迭代器终于能链式调用`.map()
- **2026年最期待的Temporal API**:Date对象终于被拯救了!处理时区和日期计算不会再莫名其妙多出几天,浏览器原生支持即将到来,告别 moment.js 大礼包的时代要来啦~
- **框架圈的大新闻**:React 19的Server Components和Compiler还在消化中,Vue 3.6祭出Vapor Mode性能大招,Svelte 5的Runes API让响应式更细粒度; Next.js 16默认切到Turbopack,Astro被Cloudflare抱走,Remix正在酝酿去React化的大胆实验~
- **运行时三国杀**:Node.js 22+能直接跑.ts文件啦(虽然只是剥离类型),Bun被Anthropic(Claude家)收编后1.3版本速速飞起,Deno 2稳如老狗主打安全牌,三足鼎立格局越来越有意思~
- **TypeScript登顶GitHub第一**:v6严格模式默认开启,v7要用Go重写编译器提速10倍;92%的开发者都在用AI写代码,但文章提醒我们——基础原理和架构品味才是AI时代真正的护城河呀!
文章URL:https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/
标签:#前端 #JavaScript #ECMAScript2025 #ECMAScript2026 #React #Vue #Svelte #NodeJS #TypeScript #Vite #Bun #Deno #TemporalAPI #IteratorHelpers #ImportAttributes
总结:
本文全面梳理了2026年JavaScript生态系统的最新发展,涵盖ECMAScript 2025(迭代器助手、Set方法、Promise.try等)和2026预期特性(Temporal API、资源管理),React/Vue/Svelte框架动态,Node.js原生TypeScript支持、Bun和Deno运行时竞争,Vite 8与Turbopack构建工具演进,TypeScript v6及AI编程趋势。文章强调掌握基础原理比追逐工具更重要,特别是在AI辅助编程时代,架构能力和代码品味尤为关键。
文章要点:
- **ECMAScript 2025超实用新玩具**:迭代器终于能链式调用`.map()
和.filter()`啦,而且是惰性求值不耗内存;Set之间可以玩集合运算,轻松找出技能交集和差集;`Promise.try()`让同步异步错误一网打尽;还有`RegExp.escape()`终于解决了用户搜索时特殊字符炸正则的问题~- **2026年最期待的Temporal API**:Date对象终于被拯救了!处理时区和日期计算不会再莫名其妙多出几天,浏览器原生支持即将到来,告别 moment.js 大礼包的时代要来啦~
- **框架圈的大新闻**:React 19的Server Components和Compiler还在消化中,Vue 3.6祭出Vapor Mode性能大招,Svelte 5的Runes API让响应式更细粒度; Next.js 16默认切到Turbopack,Astro被Cloudflare抱走,Remix正在酝酿去React化的大胆实验~
- **运行时三国杀**:Node.js 22+能直接跑.ts文件啦(虽然只是剥离类型),Bun被Anthropic(Claude家)收编后1.3版本速速飞起,Deno 2稳如老狗主打安全牌,三足鼎立格局越来越有意思~
- **TypeScript登顶GitHub第一**:v6严格模式默认开启,v7要用Go重写编译器提速10倍;92%的开发者都在用AI写代码,但文章提醒我们——基础原理和架构品味才是AI时代真正的护城河呀!
文章URL:https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/
《设计高性能表单:5个基于研究的UX原则》
标签:#UX设计 #表单设计 #前端开发 #Web可用性 #交互设计 #用户研究
总结:
本文基于Baymard Institute等权威机构的可用性研究,提出了5个提升表单性能的核心UX原则:精简字段数量、采用单列布局、明确标注必填与选填字段、实施正确的即时验证时机,以及优化移动端输入体验。这些原则能有效降低用户放弃率(约26%用户因表单复杂而放弃),提升完成效率与满意度,是构建高转化率表单的设计基石。
文章要点:
- 精简字段数量:平均电商结账流程包含11.3个字段,但高性能网站仅需6-8个即可完成交易。多余的字段会增加认知负担,约26%的用户因表单复杂而放弃购买。建议移除或折叠可选字段,除非确有必要
- 单列布局更友好:多列布局在静态设计稿中看起来美观,但可用性测试表明用户容易误读字段顺序。人眼不会自然地"之字形"扫描多列表单,单列布局提升可读性,支持自然阅读习惯,在桌面和移动端都表现可靠
- 明确标注必填与选填字段:不要假设用户能推断哪些字段是必填的。研究显示,近三分之一用户在仅标注选填字段时会遗漏必填项。可靠的做法是统一标注所有字段状态("必填"或"选填"),标签应紧邻字段标签放置
- 即时验证的时机很重要:正确实施的即时验证可提升表单成功率约22%,缩短完成时间40%以上,提高用户满意度30%以上。但不要在每输入一个字符时就验证(会增加认知负荷),建议在失焦时或字段完成后验证。错误提示应具体说明问题及修正方法,验证指示器应紧邻字段显示
- 优化移动端输入体验:避免将电话号码等输入拆分为多个字段,这会提高错误率和完成时间。确保触发合适的键盘类型(数字键盘用于卡号、邮箱键盘用于邮箱输入)。启用自动填充功能,Google研究显示这可减少30%以上的完成时间。允许粘贴完整值,不要阻止粘贴操作
文章URL:
https://designmybit.com/designing-high-performance-forms-5-research-backed-ux-principles/
标签:#UX设计 #表单设计 #前端开发 #Web可用性 #交互设计 #用户研究
总结:
本文基于Baymard Institute等权威机构的可用性研究,提出了5个提升表单性能的核心UX原则:精简字段数量、采用单列布局、明确标注必填与选填字段、实施正确的即时验证时机,以及优化移动端输入体验。这些原则能有效降低用户放弃率(约26%用户因表单复杂而放弃),提升完成效率与满意度,是构建高转化率表单的设计基石。
文章要点:
- 精简字段数量:平均电商结账流程包含11.3个字段,但高性能网站仅需6-8个即可完成交易。多余的字段会增加认知负担,约26%的用户因表单复杂而放弃购买。建议移除或折叠可选字段,除非确有必要
- 单列布局更友好:多列布局在静态设计稿中看起来美观,但可用性测试表明用户容易误读字段顺序。人眼不会自然地"之字形"扫描多列表单,单列布局提升可读性,支持自然阅读习惯,在桌面和移动端都表现可靠
- 明确标注必填与选填字段:不要假设用户能推断哪些字段是必填的。研究显示,近三分之一用户在仅标注选填字段时会遗漏必填项。可靠的做法是统一标注所有字段状态("必填"或"选填"),标签应紧邻字段标签放置
- 即时验证的时机很重要:正确实施的即时验证可提升表单成功率约22%,缩短完成时间40%以上,提高用户满意度30%以上。但不要在每输入一个字符时就验证(会增加认知负荷),建议在失焦时或字段完成后验证。错误提示应具体说明问题及修正方法,验证指示器应紧邻字段显示
- 优化移动端输入体验:避免将电话号码等输入拆分为多个字段,这会提高错误率和完成时间。确保触发合适的键盘类型(数字键盘用于卡号、邮箱键盘用于邮箱输入)。启用自动填充功能,Google研究显示这可减少30%以上的完成时间。允许粘贴完整值,不要阻止粘贴操作
文章URL:
https://designmybit.com/designing-high-performance-forms-5-research-backed-ux-principles/
《TypeScript 6.0 正式发布:迈向原生编译器的重要桥梁》
标签:#前端 #TypeScript #TS6 #TS7 #ESM #NodeJS #Compiler
总结:
TypeScript 6.0 是连接 5.9 与即将发布的 Go 语言重写版 7.0 的关键过渡版本,也是基于当前 JavaScript 代码库的最后一个主要版本。本次更新带来多项实用新特性,包括更智能的无
文章要点:
- 过渡版本定位**:TS 6.0 是基于 JS 代码库的最后一个版本,TS 7.0(Go 重写版)已接近完成,6.0 的改动主要为 7.0 铺路
- **类型推断更聪明**:不再把未使用 `this` 的方法语法函数视为上下文敏感函数,让属性顺序不影响类型推导,写代码更随心所欲
- **子路径导入更简洁**:终于支持 `#/*` 这种干净的别名写法,告别之前必须写 `#root/*` 的冗余,和打包工具里的 `@/` 习惯更接近了
- **全新内置类型**:Temporal API 正式入驻(处理日期时间更靠谱),Map 新增 `getOrInsert` 和 `getOrInsertComputed` 方法,告别繁琐的"有则取无则设"模式
- **配置默认值现代化**:`strict` 默认开启,`module` 默认 `esnext`,`target` 默认当前年份(es2025),新项目开箱即用更严格、更现代
- **性能优化相关**:`types` 默认改为空数组(需显式声明如 `["node"]`),`libReplacement` 默认关闭,构建速度有望提升 20-50%
- **大量废弃项需留意**:`target: es5`、`baseUrl`、`moduleResolution node`、AMD/UMD/SystemJS 模块、`outFile`、`module` 关键字声明命名空间等都将退出历史舞台,建议尽早迁移
- **迁移辅助工具**:提供 `--stableTypeOrdering` 标志帮助对比 6.0 与 7.0 的差异,`ts5to6` 工具可自动调整 `baseUrl` 和 `rootDir` 配置
**文章URL:
https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/
标签:#前端 #TypeScript #TS6 #TS7 #ESM #NodeJS #Compiler
总结:
TypeScript 6.0 是连接 5.9 与即将发布的 Go 语言重写版 7.0 的关键过渡版本,也是基于当前 JavaScript 代码库的最后一个主要版本。本次更新带来多项实用新特性,包括更智能的无
this 函数类型推断、支持 #/ 开头的子路径导入、内置 Temporal API 类型、Map 的 getOrInsert 方法等。同时,大量旧配置项被标记为废弃(如 target: es5`、`baseUrl`、AMD/UMD 模块等),`strict 和 module 等选项的默认值也更现代化。这些调整旨在帮助开发者提前适配 TypeScript 7.0 的全新架构。文章要点:
- 过渡版本定位**:TS 6.0 是基于 JS 代码库的最后一个版本,TS 7.0(Go 重写版)已接近完成,6.0 的改动主要为 7.0 铺路
- **类型推断更聪明**:不再把未使用 `this` 的方法语法函数视为上下文敏感函数,让属性顺序不影响类型推导,写代码更随心所欲
- **子路径导入更简洁**:终于支持 `#/*` 这种干净的别名写法,告别之前必须写 `#root/*` 的冗余,和打包工具里的 `@/` 习惯更接近了
- **全新内置类型**:Temporal API 正式入驻(处理日期时间更靠谱),Map 新增 `getOrInsert` 和 `getOrInsertComputed` 方法,告别繁琐的"有则取无则设"模式
- **配置默认值现代化**:`strict` 默认开启,`module` 默认 `esnext`,`target` 默认当前年份(es2025),新项目开箱即用更严格、更现代
- **性能优化相关**:`types` 默认改为空数组(需显式声明如 `["node"]`),`libReplacement` 默认关闭,构建速度有望提升 20-50%
- **大量废弃项需留意**:`target: es5`、`baseUrl`、`moduleResolution node`、AMD/UMD/SystemJS 模块、`outFile`、`module` 关键字声明命名空间等都将退出历史舞台,建议尽早迁移
- **迁移辅助工具**:提供 `--stableTypeOrdering` 标志帮助对比 6.0 与 7.0 的差异,`ts5to6` 工具可自动调整 `baseUrl` 和 `rootDir` 配置
**文章URL:
https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/
《关于协作编辑的谎言(第二部分):为什么我们不用Yjs》
标签:#前端 #ProseMirror #CRDT #协作编辑 #性能优化 #Yjs #实时协作
总结:
本文是Moment.dev团队关于协作编辑算法分析的第二部分,作者详细阐述了为何在生产环境中放弃Yjs而选择基于ProseMirror-collab的简单方案。文章指出Yjs存在严重的性能问题(每次协作编辑会销毁重建整个文档)、与文档Schema冲突、权限控制困难、调试困难以及墓碑数据占用内存等问题。作者认为,除非真正需要无主节点的P2P架构,否则40行代码的"简单方案"在性能、可维护性和开发体验上都优于复杂的CRDT实现。
文章要点:
- Yjs存在严重性能缺陷:每次协作编辑会销毁并重建整个文档,导致60fps目标难以达成,影响NodeView、插件状态、撤销功能和光标位置管理
- 简单方案仅需40行代码:使用prosemirror-collab库,通过单一权威节点管理文档版本和事务,支持乐观更新、离线编辑和网络中断恢复
- Yjs与文档Schema冲突:在无主节点架构下难以验证事务有效性,可能导致数据永久丢失,升级时尤其危险
- 权限控制复杂化:需要将Yjs的XML更新预测转换为ProseMirror事务来判断权限,实现难度大
- 墓碑数据问题:Yjs需保留删除标记,导致内存持续增长或数据丢失风险,而简单方案通过数据库存储步骤即可解决
- 调试困难:CRDT仅保证最终一致性,难以区分暂时分歧与真正错误,调试工具受限
- 核心观点:技术选型应从最终用户体验出发,而非算法本身;如无P2P刚需,简单方案在各方面均优于CRDT
文章URL:https://www.moment.dev/blog/lies-i-was-told-pt-2
标签:#前端 #ProseMirror #CRDT #协作编辑 #性能优化 #Yjs #实时协作
总结:
本文是Moment.dev团队关于协作编辑算法分析的第二部分,作者详细阐述了为何在生产环境中放弃Yjs而选择基于ProseMirror-collab的简单方案。文章指出Yjs存在严重的性能问题(每次协作编辑会销毁重建整个文档)、与文档Schema冲突、权限控制困难、调试困难以及墓碑数据占用内存等问题。作者认为,除非真正需要无主节点的P2P架构,否则40行代码的"简单方案"在性能、可维护性和开发体验上都优于复杂的CRDT实现。
文章要点:
- Yjs存在严重性能缺陷:每次协作编辑会销毁并重建整个文档,导致60fps目标难以达成,影响NodeView、插件状态、撤销功能和光标位置管理
- 简单方案仅需40行代码:使用prosemirror-collab库,通过单一权威节点管理文档版本和事务,支持乐观更新、离线编辑和网络中断恢复
- Yjs与文档Schema冲突:在无主节点架构下难以验证事务有效性,可能导致数据永久丢失,升级时尤其危险
- 权限控制复杂化:需要将Yjs的XML更新预测转换为ProseMirror事务来判断权限,实现难度大
- 墓碑数据问题:Yjs需保留删除标记,导致内存持续增长或数据丢失风险,而简单方案通过数据库存储步骤即可解决
- 调试困难:CRDT仅保证最终一致性,难以区分暂时分歧与真正错误,调试工具受限
- 核心观点:技术选型应从最终用户体验出发,而非算法本身;如无P2P刚需,简单方案在各方面均优于CRDT
文章URL:https://www.moment.dev/blog/lies-i-was-told-pt-2
《前端内存泄漏:500仓库静态分析与五场景基准测试实证研究》
标签:#前端 #内存泄漏 #性能优化 #React #Vue #Angular #useEffect #静态分析 #基准测试
总结(一段话概括)
该研究对500个开源前端仓库(React/Vue/Angular)进行AST静态分析,发现86%的代码库存在至少一处缺失清理的内存泄漏模式,共识别55,864个潜在泄漏点,其中定时器清理缺失占比最高(43.9%)。通过五个控制变量的基准测试(各50轮×100次挂载循环)证实:每处未清理模式每次挂载/卸载循环平均泄漏约8KB内存,呈线性累积趋势;而正确清理的版本内存增长接近零(约2KB总计)。研究揭示了内存泄漏在前端生产代码中的普遍性及其对长会话应用(如仪表板、视频会议)的性能威胁,并提供了针对性的修复方案。
文章要点:
- 高普遍性:扫描714,217个文件发现55,864处潜在泄漏,430/500个仓库(86%)存在至少一处缺失清理模式,涵盖Kibana、Next.js等知名项目
- 主要泄漏源:定时器未清理(43.9%,22,384处)居首,其次是事件监听器(19.0%)、订阅未取消(13.9%)、useEffect无清理函数(9.3%)
- 统一泄漏成本:五个跨框架场景(React useEffect、Vue onMounted、Angular subscribe、Vue watch、RAF)均显示每循环约8KB线性内存增长,标准差极小(±0.6–37KB),而正确清理版本仅2-3KB噪声基线
- 统计显著性:效应量Cohen's d > 200(BAD与GOOD分布零重叠),p < 0.001,统计功效超99.99%,证实清理缺失是内存占用的主导变量
- 框架差异:React占发现总量62.3%(样本加权),Vue的
- 高危上下文:组件生命周期代码(32.9%)和事件绑定(24.5%)是高发区,因路由切换、标签页切换会频繁触发挂载/卸载
- 实际影响:单泄漏模式200次导航累积1.6MB,多模式叠加可达8MB/会话,足以触发移动端浏览器(iOS Safari 80-120MB阈值)杀标签页
- 修复成本低:92.3%的修复仅需单行代码(返回清理函数、存储stop handle、takeUntil模式),ROI极高
- 工具链缺口:现有ESLint规则(如react-hooks/exhaustive-deps)无法检测清理函数缺失,需借助AST级静态分析或生产环境堆内存监控
文章URL
https://stackinsight.dev/blog/memory-leak-empirical-study/
标签:#前端 #内存泄漏 #性能优化 #React #Vue #Angular #useEffect #静态分析 #基准测试
总结(一段话概括)
该研究对500个开源前端仓库(React/Vue/Angular)进行AST静态分析,发现86%的代码库存在至少一处缺失清理的内存泄漏模式,共识别55,864个潜在泄漏点,其中定时器清理缺失占比最高(43.9%)。通过五个控制变量的基准测试(各50轮×100次挂载循环)证实:每处未清理模式每次挂载/卸载循环平均泄漏约8KB内存,呈线性累积趋势;而正确清理的版本内存增长接近零(约2KB总计)。研究揭示了内存泄漏在前端生产代码中的普遍性及其对长会话应用(如仪表板、视频会议)的性能威胁,并提供了针对性的修复方案。
文章要点:
- 高普遍性:扫描714,217个文件发现55,864处潜在泄漏,430/500个仓库(86%)存在至少一处缺失清理模式,涵盖Kibana、Next.js等知名项目
- 主要泄漏源:定时器未清理(43.9%,22,384处)居首,其次是事件监听器(19.0%)、订阅未取消(13.9%)、useEffect无清理函数(9.3%)
- 统一泄漏成本:五个跨框架场景(React useEffect、Vue onMounted、Angular subscribe、Vue watch、RAF)均显示每循环约8KB线性内存增长,标准差极小(±0.6–37KB),而正确清理版本仅2-3KB噪声基线
- 统计显著性:效应量Cohen's d > 200(BAD与GOOD分布零重叠),p < 0.001,统计功效超99.99%,证实清理缺失是内存占用的主导变量
- 框架差异:React占发现总量62.3%(样本加权),Vue的
watch未存储stop handle(3,989处)和Angular的.subscribe()未取消(5,327处)均为高危模式- 高危上下文:组件生命周期代码(32.9%)和事件绑定(24.5%)是高发区,因路由切换、标签页切换会频繁触发挂载/卸载
- 实际影响:单泄漏模式200次导航累积1.6MB,多模式叠加可达8MB/会话,足以触发移动端浏览器(iOS Safari 80-120MB阈值)杀标签页
- 修复成本低:92.3%的修复仅需单行代码(返回清理函数、存储stop handle、takeUntil模式),ROI极高
- 工具链缺口:现有ESLint规则(如react-hooks/exhaustive-deps)无法检测清理函数缺失,需借助AST级静态分析或生产环境堆内存监控
文章URL
https://stackinsight.dev/blog/memory-leak-empirical-study/
《理解 React Fiber 存在的意义》
标签:#前端 #React #React_Fiber #性能优化 #并发渲染 #Virtual_DOM
总结(一段话概括)
React Fiber 是 React 16 对核心协调算法的彻底重写,旨在解决 React 15 中 Stack Reconciler 同步递归更新导致的主线程阻塞问题。通过将组件树重构为链表结构的 Fiber 节点,React 实现了可中断的异步更新、任务优先级调度和时间切片机制,使高优先级任务(如用户输入)能插队执行,避免页面卡顿,并为 Concurrent Mode、Suspense 等现代特性奠定基础。
文章要点:
- React 15 的瓶颈:Stack Reconciler 采用递归遍历,更新一旦开始无法中断,复杂组件树会导致主线程长时间阻塞,造成掉帧和交互卡顿
- Fiber 的本质:将同步更新改为可中断的异步更新,每个 Fiber 节点是一个执行单元,通过
- 时间切片(Time Slicing):利用
- 优先级调度:引入 Lanes 机制,区分 Immediate(最高)、UserBlocking、Normal、Low、Idle 五级优先级,确保紧急更新优先处理
- 双缓冲机制:维护
- Phase 分离:将更新分为 Render 阶段(可中断,构建 Fiber 树)和 Commit 阶段(不可中断,同步执行 DOM 操作),支持错误边界(Error Boundaries)捕获
- 架构演进:从 React 15 的两层(Reconciler + Renderer)增至 React 16+ 的三层(Scheduler + Reconciler + Renderer),调度器负责任务分配和中断控制
文章URL:https://inside-react.vercel.app/blog/understanding-why-react-fiber-exists
标签:#前端 #React #React_Fiber #性能优化 #并发渲染 #Virtual_DOM
总结(一段话概括)
React Fiber 是 React 16 对核心协调算法的彻底重写,旨在解决 React 15 中 Stack Reconciler 同步递归更新导致的主线程阻塞问题。通过将组件树重构为链表结构的 Fiber 节点,React 实现了可中断的异步更新、任务优先级调度和时间切片机制,使高优先级任务(如用户输入)能插队执行,避免页面卡顿,并为 Concurrent Mode、Suspense 等现代特性奠定基础。
文章要点:
- React 15 的瓶颈:Stack Reconciler 采用递归遍历,更新一旦开始无法中断,复杂组件树会导致主线程长时间阻塞,造成掉帧和交互卡顿
- Fiber 的本质:将同步更新改为可中断的异步更新,每个 Fiber 节点是一个执行单元,通过
child、sibling、return 指针形成链表树,取代递归调用栈- 时间切片(Time Slicing):利用
requestIdleCallback polyfill(基于 MessageChannel),在浏览器每帧(16.6ms)中预留时间(默认 5ms)给 React,超时即让出主线程控制权- 优先级调度:引入 Lanes 机制,区分 Immediate(最高)、UserBlocking、Normal、Low、Idle 五级优先级,确保紧急更新优先处理
- 双缓冲机制:维护
current Fiber 和 workInProgress Fiber 两棵树,通过 alternate 指针关联,渲染完成后直接切换指针指向,避免重复创建对象- Phase 分离:将更新分为 Render 阶段(可中断,构建 Fiber 树)和 Commit 阶段(不可中断,同步执行 DOM 操作),支持错误边界(Error Boundaries)捕获
- 架构演进:从 React 15 的两层(Reconciler + Renderer)增至 React 16+ 的三层(Scheduler + Reconciler + Renderer),调度器负责任务分配和中断控制
文章URL:https://inside-react.vercel.app/blog/understanding-why-react-fiber-exists
《人生苦短,何必手写 API 类型:OpenAPI 驱动的 React 开发》
标签:#前端 #React #OpenAPI #TypeScript #Hey_API #MSW #Nanoquery #Contract_First
总结
本文是 Evil Martians 团队"契约优先"系列第三篇,介绍如何通过 OpenAPI 规范驱动 React 前端开发。核心思路是将 OpenAPI Spec 作为单一事实来源,利用 Hey API 自动生成 TypeScript 类型、SDK 客户端和 Zod 验证模式,配合 Nanostores 与 Nanoquery 实现类型安全的状态管理,并使用 MSW 在浏览器层面拦截网络请求进行模拟,实现前后端并行开发。当后端契约变更时,重新生成代码即可让 TypeScript 立即暴露所有需要更新的地方,避免生产环境出现类型不匹配错误。
文章要点:
- **手写 API 类型的痛点**:类型与后端脱节、缺乏运行时验证、重复样板代码、错误只能在生产环境发现
- **Hey API 自动生成**:通过
- **Nanostores + Nanoquery 状态管理**:将 API 数据视为全局状态存储在组件外,支持缓存、自动重取、跨组件共享,避免传统 Hooks 的数据获取陷阱
- **MSW 网络层模拟**:在浏览器层面拦截真实 HTTP 请求返回模拟数据,支持随机延迟、分页、过滤、错误场景,实现不依赖后端的功能开发
- **完整实战示例**:包含酒店管理系统代码,展示表单验证、CRUD 操作、路由集成、环境配置切换等完整开发流程
- **契约优先工作流**:后端更新 Spec → 前端重新生成 → TypeScript 报错定位 → 修复代码,确保集成一次成功
文章URL:https://evilmartians.com/chronicles/lifes-too-short-to-hand-write-api-types-openapi-driven-react
标签:#前端 #React #OpenAPI #TypeScript #Hey_API #MSW #Nanoquery #Contract_First
总结
本文是 Evil Martians 团队"契约优先"系列第三篇,介绍如何通过 OpenAPI 规范驱动 React 前端开发。核心思路是将 OpenAPI Spec 作为单一事实来源,利用 Hey API 自动生成 TypeScript 类型、SDK 客户端和 Zod 验证模式,配合 Nanostores 与 Nanoquery 实现类型安全的状态管理,并使用 MSW 在浏览器层面拦截网络请求进行模拟,实现前后端并行开发。当后端契约变更时,重新生成代码即可让 TypeScript 立即暴露所有需要更新的地方,避免生产环境出现类型不匹配错误。
文章要点:
- **手写 API 类型的痛点**:类型与后端脱节、缺乏运行时验证、重复样板代码、错误只能在生产环境发现
- **Hey API 自动生成**:通过
openapi-ts 从 OpenAPI Spec 生成 TypeScript 类型、SDK 函数、Zod 验证模式和客户端配置,实现编译时与运行时双重安全- **Nanostores + Nanoquery 状态管理**:将 API 数据视为全局状态存储在组件外,支持缓存、自动重取、跨组件共享,避免传统 Hooks 的数据获取陷阱
- **MSW 网络层模拟**:在浏览器层面拦截真实 HTTP 请求返回模拟数据,支持随机延迟、分页、过滤、错误场景,实现不依赖后端的功能开发
- **完整实战示例**:包含酒店管理系统代码,展示表单验证、CRUD 操作、路由集成、环境配置切换等完整开发流程
- **契约优先工作流**:后端更新 Spec → 前端重新生成 → TypeScript 报错定位 → 修复代码,确保集成一次成功
文章URL:https://evilmartians.com/chronicles/lifes-too-short-to-hand-write-api-types-openapi-driven-react
《使用 SurveyJS 在 React 中构建动态 JSON 驱动表单》
标签:#前端 #React #SurveyJS #JSON_Schema #Form_Builder #Dynamic_Forms #No_Code
总结
本文介绍了 SurveyJS 表单构建器在 React 应用中的集成与使用方法。通过 JSON Schema 定义表单结构,开发者可实现运行时动态渲染表单,避免硬编码。文章详细讲解了安装配置、组件初始化、主题定制、数据持久化(localStorage/服务端)、图片上传处理、PDF 导出等核心功能,并提供了完整的 Next.js 集成示例代码,帮助开发者快速搭建自托管、数据可控的动态表单解决方案。
文章要点:
- **JSON Schema 驱动**:表单结构通过 JSON 定义,支持运行时动态加载和修改,实现真正的数据驱动表单渲染
- **可视化构建器**:Survey Creator 提供拖拽式界面,非技术人员也能设计表单,实时生成对应 JSON 配置
- **React 集成方案**:需安装
- **数据持久化**:通过
- **扩展功能**:支持 Ace 编辑器集成(JSON 编辑)、图片上传至服务器(非 Base64 存储)、PDF 导出、自定义主题等高级功能
- **商业化许可**:Survey Creator 商用需购买许可证,否则界面会显示警告横幅
文章URL:https://surveyjs.hashnode.dev/build-dynamic-json-driven-forms-react
标签:#前端 #React #SurveyJS #JSON_Schema #Form_Builder #Dynamic_Forms #No_Code
总结
本文介绍了 SurveyJS 表单构建器在 React 应用中的集成与使用方法。通过 JSON Schema 定义表单结构,开发者可实现运行时动态渲染表单,避免硬编码。文章详细讲解了安装配置、组件初始化、主题定制、数据持久化(localStorage/服务端)、图片上传处理、PDF 导出等核心功能,并提供了完整的 Next.js 集成示例代码,帮助开发者快速搭建自托管、数据可控的动态表单解决方案。
文章要点:
- **JSON Schema 驱动**:表单结构通过 JSON 定义,支持运行时动态加载和修改,实现真正的数据驱动表单渲染
- **可视化构建器**:Survey Creator 提供拖拽式界面,非技术人员也能设计表单,实时生成对应 JSON 配置
- **React 集成方案**:需安装
survey-creator-react 和 survey-creator-core`,组件不支持 SSR,在 Next.js 中需使用动态导入并设置 `ssr: false- **数据持久化**:通过
saveSurveyFunc 回调可将表单配置保存至 localStorage 或后端服务,支持加载已有 JSON 配置继续编辑- **扩展功能**:支持 Ace 编辑器集成(JSON 编辑)、图片上传至服务器(非 Base64 存储)、PDF 导出、自定义主题等高级功能
- **商业化许可**:Survey Creator 商用需购买许可证,否则界面会显示警告横幅
文章URL:https://surveyjs.hashnode.dev/build-dynamic-json-driven-forms-react
《利用浏览器Canvas进行数据压缩》
标签:#前端 #JavaScript #CanvasAPI #数据压缩 #PNG编码 #浏览器兼容性 #SPA
总结:本文介绍了一种利用浏览器Canvas API将任意数据压缩为PNG图像格式的技术方案。通过将字节数据编码为像素颜色值并生成PNG图像,可以间接调用浏览器内置的压缩算法,实现无需外部依赖的数据压缩。该方法特别适用于需要在旧版浏览器中压缩数据、或需要将SPA状态序列化到URL中的场景,提供了Compression Streams API不可用时的替代方案。
文章要点:
- 背景需求:在静态网站和SPA中,有时需要将状态数据序列化到URL hash中,因此需要前端数据压缩方案;虽然2023年5月后Compression Streams API已普及,但旧版浏览器仍需替代方案
- 核心原理:浏览器内置了优化的压缩库用于HTTP请求和图片处理,通过将数据编码为PNG像素数据,可间接利用浏览器的无损压缩能力
- 技术实现:将Uint8Array数据按RGB通道编码到Canvas像素中(首字节存储最后一像素的有效字节数),Alpha通道固定为255以确保跨浏览器一致性,最终通过toDataURL("image/png")获取base64编码的压缩数据
- 解压流程:异步加载生成的PNG图片,读取像素数据后过滤Alpha通道,根据首字节指示的有效长度提取原始字节数据
- 方案特点:即使考虑PNG格式开销,压缩后的数据通常仍小于原始数据;完全基于浏览器原生API,无需外部库依赖
- 应用场景:旧浏览器兼容性支持、URL状态序列化、纯前端数据压缩需求
文章URL:https://jstrieb.github.io/posts/canvas-compress/
标签:#前端 #JavaScript #CanvasAPI #数据压缩 #PNG编码 #浏览器兼容性 #SPA
总结:本文介绍了一种利用浏览器Canvas API将任意数据压缩为PNG图像格式的技术方案。通过将字节数据编码为像素颜色值并生成PNG图像,可以间接调用浏览器内置的压缩算法,实现无需外部依赖的数据压缩。该方法特别适用于需要在旧版浏览器中压缩数据、或需要将SPA状态序列化到URL中的场景,提供了Compression Streams API不可用时的替代方案。
文章要点:
- 背景需求:在静态网站和SPA中,有时需要将状态数据序列化到URL hash中,因此需要前端数据压缩方案;虽然2023年5月后Compression Streams API已普及,但旧版浏览器仍需替代方案
- 核心原理:浏览器内置了优化的压缩库用于HTTP请求和图片处理,通过将数据编码为PNG像素数据,可间接利用浏览器的无损压缩能力
- 技术实现:将Uint8Array数据按RGB通道编码到Canvas像素中(首字节存储最后一像素的有效字节数),Alpha通道固定为255以确保跨浏览器一致性,最终通过toDataURL("image/png")获取base64编码的压缩数据
- 解压流程:异步加载生成的PNG图片,读取像素数据后过滤Alpha通道,根据首字节指示的有效长度提取原始字节数据
- 方案特点:即使考虑PNG格式开销,压缩后的数据通常仍小于原始数据;完全基于浏览器原生API,无需外部库依赖
- 应用场景:旧浏览器兼容性支持、URL状态序列化、纯前端数据压缩需求
文章URL:https://jstrieb.github.io/posts/canvas-compress/