呜啦!日常碎碎念,偶尔掉落优质前端博文推荐、学习资源等
网页:https://tg.cosine.ren
本频道的搜索Bot 来辣 👉 @cosSearchBot
私聊直接发消息就可以搜索啦~
🔖tags
#优质博文 #资源推荐 #博客更新 #碎碎念 #项目更新 #手工 #书摘 #阮一峰的科技周刊 #新动态
图频:Cosine 🎨 Gallery @CosineGallery
猫片: @cosine_cat
联系频道主:@cosine_yu
网页:https://tg.cosine.ren
本频道的搜索Bot 来辣 👉 @cosSearchBot
私聊直接发消息就可以搜索啦~
🔖tags
#优质博文 #资源推荐 #博客更新 #碎碎念 #项目更新 #手工 #书摘 #阮一峰的科技周刊 #新动态
图频:Cosine 🎨 Gallery @CosineGallery
猫片: @cosine_cat
联系频道主:@cosine_yu
#优质博文 #AI #编程
好文,我也是这样转变的(?)或者说没有转变。
有趣的是 AI 出来之后我觉得编码热情或者说想构建产品的欲望越来越强烈了。
How I use AI agents to write code
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Nolan
好文,我也是这样转变的(?)或者说没有转变。
有趣的是 AI 出来之后我觉得编码热情或者说想构建产品的欲望越来越强烈了。
How I use AI agents to write code
AI 摘要:作者从一个“反 AI 狂热者”转变为 AI 代理的使用者,因为他发现 AI 在代码编写上的生产力惊人。他详细介绍了如何设置 AI 代理(以 Claude Code 为例),强调了配置清晰的 CLAUDE.md 文件(包括项目架构和个人编码习惯)的重要性。在整体策略上,他强调了结合自动化测试提供反馈循环,以及在复杂任务中使用“计划模式”来让 AI 进行思考。作者还分享了处理 AI 常见错误(如删除注释、代码重复)的方法,即开启新会话让 AI 进行“代码审查”。此外,他还提到 AI 代理能在夜间持续工作,实现“睡着也能完成额外工作”的优势。尽管作者对 AI 代理仍抱有复杂情感,认为它们剥夺了编程乐趣,但他承认 AI 显著提升了编码效率,将自己的角色比作软件架构师,主要负责设计和审查,而非亲手编写所有代码。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 对 AI 编码态度的转变
• 从“反 AI 狂热者”到接受者:作者承认尽管曾强烈反对 AI,但其同事的生产力提升以及 AI 工具(如 Claude Code、OpenAI Codex、Gemini CLI)的发布,使其无法再忽视。
• 承认 AI 的高效性:尽管作者有 20 年的编程经验和对代码质量的“老派”看法,但 AI 在许多时候比他写得更好。
• 强调正确使用 AI:将 AI 比作“锋利的菜刀与电锯的组合”,强调不当使用可能造成伤害。
2. AI 代理的基本设置
• 选择工具:作者主要使用 Claude Code,因其足够好用,虽然市面上有许多其他选择。
• CLAUDE.md 文件的作用:
• 项目级 CLAUDE.md:用于描述项目概况、整体架构、注意事项等,帮助 AI 理解代码库。
• 个人级 CLAUDE.md:记录个人编码习惯和偏好(例如:在 map() 或 filter() 函数中使用 _ 变量名)。
3. 整体使用策略
• 吸取教训:作者承认在 AI 上浪费了大量时间,AI 代理可能会“引你走弯路”,导致创建出“勉强能用”的“怪物”。
• 建立反馈循环:
• 自动化测试:通过自动化测试让 AI 代理验证其解决方案,纠正错误。
• “计划模式”(plan mode):对于复杂任务,让 AI 在执行前先“思考”并制定计划,可以有效避免盲目尝试。
• AI 在 UI 方面的局限性:AI 在处理 UI 任务时效率较低,因为需要消耗大量 token 进行 DOM 检查或通过截屏检查,导致速度缓慢且容易出错。
4. 处理 AI 产生的错误
• AI 常见的错误类型:
• 删除有用的注释:将重要信息移除或修改。
• 代码重复:AI 代理倾向于复制粘贴代码,违反 DRY (Don't Repeat Yourself) 原则。
• 引入细微的错误:在重构时无意中改变代码原意(例如:添加多余的空值检查)。
• 解决策略:
• 重启会话进行“代码审查”:开启新的 AI 会话,让其对比 origin/main 进行纯重构检查,并查找功能性错误。
• 伪装代码来源:为了获得更客观的反馈,可以谎称审查的是同事的 PR (Pull Request)。
• 重复检查:多次运行相同的审查流程,确保所有错误都被发现和修复。
5. AI 带来的额外价值
• “睡着也能完成额外工作”:AI 代理不知疲倦,可以持续迭代解决问题,为作者节省时间。
• “自动化盲区”(automation blindness)的风险:长时间对 AI 的输出无条件“同意”,可能导致忽视潜在问题。
• “yolo 模式”下的试验:在 Podman 容器中运行 AI 代理,以减少对人工干预的依赖,但作者仅在不重要的副项目中使用,以防潜在的安全问题。
• 工作与生活平衡的挑战:AI 可能导致工作侵入非工作时间,需警惕。
6. 结论与个人感受
• 复杂的情感:作者对 AI 代理仍抱有复杂甚至“厌恶”的情感,认为它们让编程变得不那么有趣,但其有效性是不可否认的。
• 效率的巨大提升:AI 极大地提高了代码编写速度。
• 适用场景:AI 不适合处理复杂、新颖或涉及代码库多个分散部分的模糊项目,这类任务仍需人工完成。
• 角色转变:作者将自己的新角色比作软件架构师,更多地参与规范编写和代码审查,而非纯粹的编码。
• 对开源项目的影响:作者在开源项目中不使用 AI,因为缺乏“所有权”感,认为代码不是自己亲手写的。
• “不那么有趣,但最优”的选择:尽管 AI 让编程乐趣减少,但它作为“最优策略”,仍会被选择使用,就像游戏中玩家会选择最有效率而非最有趣的玩法。
• 接受现状:作者认为大多数开发者已经接受 AI,并正在向前发展。
author Nolan
#优质博文 #CSS #前端 #新特性
MDN:text-decoration-inset 兼容性:实验性,文中仅提到 Firefox 146+
text-decoration-inset is Like Padding for Text Decorations | CSS-Tricks:CSS 中的 text-decoration-inset 允许开发者像设置内边距一样裁剪文字装饰(如下划线)的左右边缘,从而实现文字装饰与文字内容的精确对齐。该属性支持 em 等相对单位,使装饰能随字体大小缩放,并且可以配合动画和过渡效果,创造出更多原生的、引人注目的文字装饰动态效果。
author Daniel Schwarz
MDN:text-decoration-inset 兼容性:实验性,文中仅提到 Firefox 146+
text-decoration-inset is Like Padding for Text Decorations | CSS-Tricks:CSS 中的 text-decoration-inset 允许开发者像设置内边距一样裁剪文字装饰(如下划线)的左右边缘,从而实现文字装饰与文字内容的精确对齐。该属性支持 em 等相对单位,使装饰能随字体大小缩放,并且可以配合动画和过渡效果,创造出更多原生的、引人注目的文字装饰动态效果。
author Daniel Schwarz
#优质博文 #前端 #CSS
Frontend Wrapped 2025: The 10 storylines that defined the year
以下是方便搜索索引的大纲(AI 生成),请读原文
author Chizaram Ken
Frontend Wrapped 2025: The 10 storylines that defined the year
AI 摘要:文章回顾了 2025 年前端领域的十大关键事件,涵盖了 TypeScript 和 Tailwind CSS 的持续普及、服务端渲染(SSR)的全面应用、CSS 新特性的爆发式发展、Rust 在前端工具链中的崛起,以及 TanStack 生态系统的蓬勃发展。文章还提到了 React 19.2 带来的异步(Async)编程范式转变,但同时也揭示了 npm 供应链攻击和 React2Shell 漏洞等严重安全问题。最重要的是,AI 编码工具的快速演进被视为年度最重要的趋势,它们极大提升了开发效率并改变了开发方式。
以下是方便搜索索引的大纲(AI 生成),请读原文
1. 技术普及与成熟(Tech Adoption & Maturity)
• TypeScript 持续主导:2025 年 TypeScript 的使用量和下载量持续飙升,成为 JavaScript 开发的事实标准,尤其在 AI 辅助编程中表现更优。
• Tailwind CSS 巩固地位:Tailwind CSS 大规模普及,成为现代 React 应用的首选样式方案,彻底终结了关于其“内联样式”的争议。
• 服务端渲染(SSR)普及化:SSR 不再是“可有可无”的功能,各大框架(Next.js, Remix, TanStack Start, SvelteKit, Astro)全面拥抱,通过局部水合(Partial Hydration)、流式 SSR(Streaming SSR)和选择性水合(Selective Hydration)等技术实现了高性能和 SEO 优化。
2. 前端核心技术演进(Frontend Core Tech Evolution)
• CSS 新特性大爆发:CSS 在 2025 年获得了革命性进展,引入了锚点定位(Anchor Positioning)、滚动驱动动画(Scroll-Driven Animations)、容器查询(Container Queries)和 CSS if() 函数等新特性,减少了对 JavaScript 的依赖。
• Rust 在前端工具链中的崛起:Rust 凭借其卓越的性能,在前端构建工具(Rspack, Turbopack)、转译器(SWC)和代码格式化/Linter(Biome, Oxc)领域占据主导地位,显著提升了开发效率和构建速度。
3. 生态系统与框架革新(Ecosystems & Frameworks Innovation)
• TanStack 生态系统崛起:TanStack 从数据获取库(React Query)发展成为一个全面的生态系统,覆盖路由(TanStack Router)、表格、表单等,以其无头(Headless)、类型安全(Type-safe)和框架无关(Framework-agnostic)的特性成为 React 开发的新标准。
• React 19.2 带来的异步革新:React 19.2 引入了“Async React”概念,通过 useTransition、useOptimistic 和 use() 等新原语,结合 Suspense 和并发特性,极大地简化了异步协调,减少了样板代码,提升了用户体验。
4. 安全挑战与应对(Security Challenges & Responses)
• npm 供应链攻击:2025 年 npm 生态系统遭遇了“Shai Halud”蠕虫等大规模供应链攻击,通过钓鱼和自传播恶意软件感染了大量流行库,引发了对依赖审计和凭证安全的广泛关注。
• React2Shell 漏洞(CVE-2025-55182):React 服务器组件(React Server Components)被发现存在严重的远程代码执行(RCE)漏洞,CVSS 评分高达 10.0,对金融和企业应用造成巨大威胁,尽管 React 团队迅速发布了补丁。
5. AI 编码工具的持续演进(Continued Evolution of AI Coding Tools)
• AI 模型与工具激增:2025 年见证了 30 多个 AI 模型(如 GPT 5, Claude Opus 4.5, Gemini 3 Pro)的发布以及中国公司(DeepSeek, Qwen, ByteDance, Moonshot)的崛起。
• Agentic AI 的竞争:Windsurf 与 Cursor 之间的“agentic war”引发了投资者的竞购战,同时 Bolt 和 v0 等工具实现了从编程到生产的一站式应用开发。
• 命令行界面(CLI)中的 AI:Claude Code、Gemini CLI 等 AI 助手被整合到命令行工具中,极大地提高了开发效率,尽管作者半开玩笑地指出它们似乎“一心想取代开发者”。
author Chizaram Ken
#优质博文 #AI #前端 #React #调试
How AI Coding Agents Hid a Timebomb in Our App
以下是方便搜索索引的大纲(AI 生成),请读原文
author Andrew Patton
How AI Coding Agents Hid a Timebomb in Our App
AI 摘要: 作者分享了他们在开发 Outlyne 这款 AI 驱动的网站构建器时遇到的一个诡异 Bug:一个由 AI 编程助手(AI Coding Agent)删除的代码注释,导致一个关键的 readOnly 属性被移除,进而引发了 React 组件的无限递归渲染。更糟的是,React 19 的 <Activity> 组件将这个 Bug 隐藏了起来,使其在数分钟内都不会崩溃,极大增加了调试难度。作者通过痛苦的调试过程,最终发现罪魁祸首是 AI 删除了注释,以及自己没有为关键的结构性约束编写测试。文章强调了在 AI 辅助开发背景下,测试而非注释,才是确保代码质量和安全的关键。
以下是方便搜索索引的大纲(AI 生成),请读原文
1. Bug 的出现与表现
• 应用程序崩溃:用户在使用应用时,浏览器会无故冻结并崩溃。
• 内存无限增长:后台一个无限递归的 React 组件树在内存中不断增长,最终耗尽内存。
• React 19 的 <Activity> 组件掩盖了问题:新引入的 <Activity> 组件在关闭状态下会以低优先级模式渲染隐藏的 UI,导致无限递归的组件树在后台缓慢构建,而前端页面保持响应,延迟了 Bug 的暴露时间。
2. 问题根源:AI 编程助手与被删除的注释
• Outlyne 的组件架构:页面组件包含头部(header)和底部(footer),它们渲染了自身的变体(variants)作为预览,这本身就是递归的。为了避免无限递归,预览组件设置了 readOnly={true} 属性。
• 重要的安全注释:作者曾添加注释警告,如果 readOnly 属性为 false 会导致无限递归。
• AI 编程助手的操作:在一次重构中,AI 编程助手删除了这个关键注释,可能是出于“清理”目的。
• readOnly 属性被移除:在后续的更新中,由于缺乏注释的上下文,AI 编程助手移除了 readOnly 属性,导致了无限递归的发生。
3. 艰难的调试过程
• 难以复现:Bug 不会立即崩溃,使得调查非常困难,应用在几分钟后才会崩溃。
• 虚假线索:Chrome 调试器显示问题出在 Motion 库中,作者花费数天时间调查,但发现 Motion 只是受害者。
• 关键突破:通过检查内存溢出时的调用栈,发现了与页脚编辑器相关的 layoutId,并最终通过移除 <Activity> 组件,使 Bug 立即暴露,确认了问题所在。
4. 经验教训与启示
• 注释与测试:注释是文档,而测试是约束。在 AI 辅助的代码库中,仅仅依靠注释不足以保证关键结构性约束。
• AI 辅助开发带来的挑战:AI 编程助手能够提高生产力,但它们也会无意中移除关键信息,这要求开发者重新思考“足够好”的代码标准。
• 重要的结构性约束需要测试:文章强调,任何可能导致应用崩溃或违反结构性不变性的地方,都应该编写测试来强制执行,而不是仅仅依靠注释。
• 示例测试代码:作者提供了一段简单的测试代码,说明如何用大约 20 行代码来断言 readOnly 属性的正确性,从而避免了整个 Bug。
author Andrew Patton
#优质博文 #前端 #react #工程化
React Compiler 的静默失败 (以及如何修复它们)
author Andrew Patton
React Compiler 的静默失败 (以及如何修复它们)
AI 摘要:作者分享了在使用 React Compiler 过程中遇到的“静默失败”问题,即编译器在无法优化组件时不会报错,而是回退到标准 React 行为,这可能导致性能下降。为了解决这个问题,作者发现并利用了一个未文档化的 ESLint 规则 `react-hooks/todo`,通过将其设置为错误级别,可以在编译失败时中断构建过程。
author Andrew Patton
#优质博文 #CSS #设计系统 #前端
Exploring Multi-Brand Systems with Tokens and Composability
以下是方便搜索索引的大纲 (AI 生成),请读原文:
author Adam Sedwick
Exploring Multi-Brand Systems with Tokens and Composability
AI 摘要:文章深入探讨了如何利用代币(tokens)、组合(composition)和配置(configuration)来构建灵活且可扩展的多品牌设计系统。作者通过一个“卡片”组件的实例,详细演示了如何使用 CSS 自定义属性(Custom Properties)实现主题切换,如何通过插槽(slots)和局部组件(partials)实现内容的灵活定制,以及如何结合这些方法来创建高度适应不同品牌和用例的组件,最终达到减少代码重复、提高开发效率和保持系统一致性的目标。
以下是方便搜索索引的大纲 (AI 生成),请读原文:
1. 设计系统核心理念
• 系统灵活性与可扩展性:设计系统不仅要保证一致性,更要具备灵活性,以适应多品牌和多样化的使用场景。
• 三大核心要素:代币(tokens)、组合(composition)和配置(configuration)是实现组件灵活性的关键。
2. 基础卡片组件结构
• 组件需求:一个包含横幅、图片、标题、描述和按钮的简单卡片。
• 技术栈:示例使用 Vue 编写,但其原则适用于任何基于组件的设计系统,包括原生 Web Components。
• 初始代码实现:展示了卡片组件的模板、脚本和样式。
3. 使用代币(Tokens)支持多品牌/主题
• 基本修改:通过代币(变量)来支持不同品牌或主题的切换。
• CSS 自定义属性(Custom Properties):文章以 CSS 自定义属性为例,但代币不仅限于 CSS,Design Tokens Community Group 提供了更全面的定义。
• 代码优化:将硬编码值转换为变量,提高代码可维护性和复用性。
• 主题切换实现:通过更改 CSS 变量或添加主题类来轻松切换卡片样式,无需修改组件结构。
4. 使用可组合插槽(Composable Slots)定制内容
• 解决内容多样性问题:当需要展示不同类型的内容(如列表而非描述)时,插槽提供了一种灵活的解决方案。
• 插槽(Slots)的引入:将组件中的特定区域定义为插槽,允许外部传入自定义内容。
• 示例:将描述区域替换为名为 card-details 的插槽,并展示如何传入不同的内容(如段落或列表)。
• 组织化实践:为了避免插槽内容过于随意,可以提供“预制”的子组件或局部组件(partials),作为推荐的插槽内容,以维护代码整洁和一致性。
5. 扩展配置与组合实现更深层次的定制
• 进阶应用:组合和配置不仅限于组件的某个特定区域,可以应用于更广泛的布局和样式。
• 可配置元素与可组合部分:区分通过属性(attributes)控制的可配置元素和通过插槽控制的可组合部分。
• 示例:将横幅位置设置为可配置属性,并将整个内容区域设为插槽,实现更自由的布局组合。
• 拆分局部组件:将复杂的组件拆分为更小的局部组件(如 CardMedia),提高复用性和可维护性。
• 高度适应性:通过灵活运用配置和组合,可以创建高度适应不同布局和内容需求的卡片组件。
6. 将原则付诸实践
• 核心原则总结:再次强调代币、组合和配置在构建灵活设计系统中的重要作用。
• 代币(Tokens):集中管理设计决策,实现品牌快速切换。
• 组合(Composition):通过插槽和局部组件提供结构化的内容扩展能力。
• 配置(Configuration):通过属性暴露常用选项,确保组件适应性。
• 实践效益:减少重复组件、加速交付、保持系统一致性,使设计系统更具弹性。
author Adam Sedwick
#优质博文 #前端 #性能优化 #调试 #新动态
Chrome DevTools 144 版本可以让你单独对每个网络请求限速。
Throttle individual network requests
AI 摘要:Chrome DevTools 在 144 版本中引入了“Individual Request Throttling”功能,允许开发者为单个网络请求设置独立的限速(throttling)或阻断(blocking)条件。这一改进使得在不影响整个页面加载速度的情况下,测试特定资源(如第三方 API 或大型图片)在慢速网络条件下的表现成为可能。新功能整合在“Request conditions”面板中,用户可以自定义限速模式和 URL 匹配规则,并清晰地在“Network”和“Performance”面板中识别被限速或阻断的请求,从而更精准高效地进行前端性能调试。
Chrome DevTools 144 版本可以让你单独对每个网络请求限速。
Throttle individual network requests
AI 摘要:Chrome DevTools 在 144 版本中引入了“Individual Request Throttling”功能,允许开发者为单个网络请求设置独立的限速(throttling)或阻断(blocking)条件。这一改进使得在不影响整个页面加载速度的情况下,测试特定资源(如第三方 API 或大型图片)在慢速网络条件下的表现成为可能。新功能整合在“Request conditions”面板中,用户可以自定义限速模式和 URL 匹配规则,并清晰地在“Network”和“Performance”面板中识别被限速或阻断的请求,从而更精准高效地进行前端性能调试。
#优质博文 #CSS #JavaScript #前端 #视图转换 #course
Different Page Transitions For Different Circumstances
以下是方便搜索索引的大纲(AI 生成),请读原文
author Chris Coyier
Different Page Transitions For Different Circumstances
AI 摘要:文章探讨了如何利用 Web API 中的 View Transitions (视图过渡)API 为多页应用程序(MPA)创建差异化的页面切换动画。作者通过 JavaScript 事件监听 pageswap 和 pagereveal,结合 e.viewTransition.types.add() 方法,实现根据特定 URL 条件设置自定义视图过渡类型。接着,文章演示了如何在 CSS 中使用 :active-view-transition-type() 伪类,针对不同的视图过渡类型应用不同的动画效果,从而覆盖默认过渡动画。最后,作者分享了一些关于这种 JS 与 CSS 协同控制的见解,并提及了相关学习资源和浏览器兼容性信息。
以下是方便搜索索引的大纲(AI 生成),请读原文
1. View Transitions API 基础
• DOM 事件监听: 介绍 pageswap 和 pagereveal 这两个事件,它们在页面卸载和加载时触发,并提供 e.viewTransition 对象用于自定义视图过渡。
• 条件设置过渡类型: 讲解如何通过 JavaScript 在 pagereveal 事件中,根据 document.location.pathname 等条件,使用 e.viewTransition.types.add() 方法为当前页面设置一个自定义的视图过渡类型。
2. 默认页面过渡动画配置
• CSS 定义默认动画: 演示如何使用 ::view-transition-old(main) 和 ::view-transition-new(main) 伪元素,结合 @keyframes 定义网站的默认页面切换动画效果,如滑动出入。
• 元素命名: 强调需要为要过渡的元素(如 <main> 内容区)设置 view-transition-name 属性,以便在 CSS 中精准控制。
3. 定制特定页面的过渡动画
• CSS 覆盖默认动画: 展示如何利用 :active-view-transition-type() CSS 伪类,根据在 JavaScript 中设置的自定义视图过渡类型,为特定页面定义一套专属的动画,从而覆盖默认的动画效果。
• 动画优先级: 解释自定义类型动画如何通过更高的 CSS 特异性(specificity)来覆盖默认动画。
4. 学习资源与浏览器支持
• 参考资料: 推荐 Bramus 的《Cross-document view transitions for multi-page applications》作为进一步学习的优秀资源。
• CSS 类型声明: 提及 view-transition-types CSS 属性,但作者对其具体用途表示疑问,推测可能用于限制允许的过渡类型。
• 浏览器兼容性: 指出 JavaScript ViewTransitionTypeSet 和 CSS :active-view-transition-type() 在 Chrome 和 Safari 中得到支持,Firefox 则需开启 flag(标志)。
author Chris Coyier
#优质博文 #React #TypeScript #前端 #course
How to type React children correctly in TypeScript
以下是方便搜索索引的大纲(AI 生成),请读原文:
author Ohans Emmanuel
How to type React children correctly in TypeScript
AI 摘要:本文深入探讨了在 React 应用中如何正确使用 TypeScript 定义 children prop 的类型。文章首先介绍了 children prop 的基本用法和支持的各种内容类型,并强调了避免手动定义复杂 children 类型的必要性。随后,详细讲解了 ReactNode 超集类型、PropsWithChildren 和 React.ComponentProps 等实用工具类型,以及 ReactElement 和 JSX.Element 等具体类型的使用场景。文章还特别提到了 React 18/19 版本中关于 React.FC 和 children 类型定义的最新变化,建议显式定义 children prop,并展示了如何安全地处理 refs 和构建包装组件(wrapper components)。通过学习这些方法,开发者可以更有效地在 TypeScript 中管理 React 组件的 children prop,提升代码的类型安全性和可维护性。
以下是方便搜索索引的大纲(AI 生成),请读原文:
1. children prop 基础
• JSX 中的 children :解释 children prop 是如何接收并操作 JSX 表达式中标签之间的内容的。
• 支持的 children 类型:列举了 children prop 可以接受的常见内容类型,包括字符串(Strings)、JSX 元素、JavaScript 表达式(JavaScript expressions)和函数(Functions)。
• 避免手动定义复杂 children 类型:指出手动为 children 定义类型容易遗漏,推荐使用官方支持的类型。
2. children prop 的类型定义方法
• ReactNode 超集类型:介绍 ReactNode 是包含 React 所有可渲染值的超集类型,是定义 children 类型时的首选,并详细解释了 ReactNode 的内部定义。
• PropsWithChildren 类型:讲解 PropsWithChildren 如何方便地为现有 props 添加 children prop,避免手动定义。
• React.ComponentProps 类型:说明 ComponentProps 如何提取现有组件的 props 类型,尤其适用于构建可复用组件和 UI 库。
• React.ReactElement 类型:介绍 ReactElement 作为 ReactNode 的子集,在特定场景下如何用于定义 children prop。
• JSX.Element 类型:说明 JSX.Element 如何作为 children prop 的类型,并指出它只代表单个 React 元素且不包含假值。
• 类组件的 Component 类型:演示在类组件中如何使用 React.Component 定义 children prop,并说明 children 默认是可选的。
3. React 18/19 中 children prop 类型定义的最新变化
• 不再推荐使用 React.FC / FunctionComponent :解释了 React.FC 因不再自动包含 children prop 而不再被推荐,并倡导显式定义 children。
• 在 TypeScript 中将组件作为 props 传递:展示了如何在不依赖 React.FC 的情况下,安全地将组件作为 props 传递并保持完整的类型安全。
• React 19 中 Refs 和 forwardRef :比较了 React 18 及更早版本与 React 19 中处理 refs 和 children prop 时的类型定义方式的变化。
4. TypeScript 中的包装组件(Wrapper Components)
• 包装组件在类型安全方面的优势:通过一个待办事项应用示例,展示了包装组件如何通过定义接口来增强类型安全,并在编译时捕获类型错误。
• 处理复杂数据结构:说明 TypeScript 如何确保在组件间传递复杂数据结构时,所有必需属性都存在且类型正确。
author Ohans Emmanuel
#优质博文 #安全 #Storybook #前端
Security advisory
又一个 CVE-2025-68429 7.3/10, Storybook v7+ 版本构建时可能会不小心把 .env 打包进去。
Security advisory
又一个 CVE-2025-68429 7.3/10, Storybook v7+ 版本构建时可能会不小心把 .env 打包进去。
AI 摘要:Storybook 团队发布安全公告,披露 Storybook 在特定条件下,可能将 .env 文件中的敏感环境变量意外打包到构建产物中,导致这些秘密信息在发布到网络后泄露。受影响的项目需满足使用 Storybook 7.0.0 及以上版本、在构建时存在包含敏感信息的 .env 文件,并使用特定 process.env 代码模式。官方建议所有受影响用户立即审计并轮换密钥,并将 Storybook 升级至已打补丁的版本,同时调整环境变量的引用方式。部分流行的 Storybook 插件可能触发此漏洞,但漏洞本身存在于 Storybook 核心。
#优质博文 #CSS #React #RSC #前端 #tools
工具:https://rscexplorer.dev/
开源在:https://github.com/gaearon/rscexplorer
文章:Introducing RSC Explorer
author Dan Abramov
工具:https://rscexplorer.dev/
开源在:https://github.com/gaearon/rscexplorer
文章:Introducing RSC Explorer
AI 摘要:本文介绍了 Dan Abramov 发布的新工具 RSC Explorer,旨在帮助开发者直观理解 React Server Components (RSC) 的底层工作原理。由于最近 React Server Components 披露了一个严重的安全漏洞,RSC 协议引起了广泛关注。RSC Explorer 是一个开源的单页应用,通过模拟 RSC 协议的读写过程,展示了数据流、代码传输、流式渲染、服务器操作以及无框架路由刷新等核心概念,让开发者能够“所见即所得”地学习 RSC。
author Dan Abramov
#优质博文 #前端 #CSS #新特性
State, Logic, And Native Power: CSS Wrapped 2025 — Smashing Magazine
author Brecht De Ruyte
State, Logic, And Native Power: CSS Wrapped 2025 — Smashing Magazine
AI 摘要:本文深入解读了 Chrome 团队发布的“CSS Wrapped 2025”年度总结报告,重点介绍了 CSS 在逻辑处理、状态管理和复杂交互方面的新进展。文章详细阐述了可定制的 <select> 元素、纯 CSS 实现的轮播图(Carousel)以及滚动状态查询等功能,并探讨了 CSS 中引入 if() 语句、@function 函数和 sibling-index()/sibling-count() 等逻辑处理工具,这些新特性将大大提升 CSS 的开发体验和应用能力。作者还展望了锚定容器查询(Anchored Container Queries)、嵌套视图过渡组(Nested View Transition Groups)以及文本框修剪(Text Box Trim)等未来特性,强调 CSS 正从单纯的样式语言向构建动态、强大应用的原生工具集转变,开启了一个激动人心的前端新时代。
author Brecht De Ruyte
#优质博文 #前端 #WebGPU #WebGL
用 WebGPU 来造一场雪 | Cyandev
author Cyandev
用 WebGPU 来造一场雪 | Cyandev
AI 摘要:本文详细介绍了作者如何利用 WebGPU 为个人博客实现下雪背景效果。文章从 WebGPU 的基本概念、与 Metal 等现代图形 API 的对比入手,逐步深入到 Metal 的基础知识,再结合 WebGPU 的实际应用,例如 Bind Group 和 Compute Shader,展示了如何高效地绘制雪花粒子并计算其运动。为了进一步提升性能,作者还分享了如何将渲染逻辑转移到 Web Worker 中的 OffscreenCanvas 进行,确保动画流畅不卡顿。文末展望了 WebGPU 在未来前端动画和机器学习领域的应用潜力。
author Cyandev
#优质博文 #前端 #CSS #JavaScript #GSAP #动画
好工具:Paths & Control Points
文章:Building Responsive, Scroll-Triggered Curved Path Animations with GSAP | Codrops
author Ross Anderson
好工具:Paths & Control Points
文章:Building Responsive, Scroll-Triggered Curved Path Animations with GSAP | Codrops
AI 摘要:这篇博文详细介绍了如何使用 GSAP (GreenSock Animation Platform) 的 ScrollTrigger 和 MotionPath 插件,实现响应式的、滚动触发的曲线路径动画。文章不仅阐述了核心的设计挑战和 Bezier 曲线原理,还提供了动态计算控制点、构建 SVG 路径、动画插值以及响应式处理的完整代码示例。更令人惊喜的是,作者还分享了一个实用的可视化配置工具,让开发者能够拖拽控制点实时调整曲线,极大地提升了开发效率和精度。最后,文章还探讨了可访问性 (Accessibility) 和生产工作流程,为读者提供了全面的解决方案。
author Ross Anderson
这个不错,还兼顾了可访问性。
工具地址:Andy Clarke’s Toon Text
文章介绍:Toon Title Text Generator | CSS-Tricks
AI 摘要:这篇博文介绍了 Andy Clarke 开发的一款有趣的卡通标题文本生成器,它可以生成具有卡通风格的文本,并提供 CSS 代码。文章还重点介绍了其核心功能 Splinter.js,它通过包裹每个字符的 <span> 标签,并加入 ARIA 属性,在实现逐字样式控制的同时,增强了可访问性,解决了传统工具可能导致辅助技术识别障碍的问题。
#优质博文 #前端 #css #动画
Creating Scroll-Based Animations in Full view() | CSS-Tricks
以下是方便搜索索引的大纲(AI 生成),请读原文:
author Preethi
Creating Scroll-Based Animations in Full view() | CSS-Tricks
AI 摘要:本文深入探讨了 CSS animation-timeline 属性中的 view() 函数,它允许开发者创建基于元素在滚动容器(scrollport)中可见性(visibility)的动画。文章通过一个图片轮播(carousel)示例,详细演示了如何结合传统 CSS 动画、关键帧(keyframes)和 view() 函数,实现元素进入/退出视图时的缩放、模糊等动态效果。此外,文章还比较了 view() 与 scroll() 函数的区别,并介绍了 view() 函数的轴(axis)和插入(inset)参数,以及 animation-range 属性,帮助读者更精细地控制动画的触发时机和范围,为制作交互式滚动动画提供了实用的指导。
以下是方便搜索索引的大纲(AI 生成),请读原文:
1. view() 函数简介与核心概念
• animation-timeline 属性接受 view() 函数,实现基于元素可见性的动画。
• 类比 JavaScript 的 Intersection Observer,动画随元素进入和退出滚动视口(scrollport)而触发。
• 示例:图片轮播中,图片在中间时清晰放大,在边缘时模糊缩小。
2. 搭建基本布局
• 创建一个 <main> 元素作为 carousel 容器。
• 使用 flexbox 使图片横向排列,并设置 overflow-x: auto 实现滚动。
• 定义 carousel-slide 元素作为图片项,设置其宽度为容器的 1/3,实现一次显示三张图片。
3. 实现滚动与滚动捕捉(Scroll Snapping)
• 在 carousel 容器上设置 scroll-snap-type: x mandatory 实现滚动捕捉。
• 使用 scroll-behavior: smooth 实现平滑滚动(可选)。
• 设置 scrollbar-width: none 隐藏滚动条(可选)。
• 为 carousel-slide 设置 scroll-snap-align: center,确保图片居中对齐。
4. 创建基于视图的动画
• 定义 slide 关键帧动画,实现图片在不同阶段的缩放、圆角和模糊效果。
• 将 slide 动画应用于 carousel-slide 元素。
• 使用 animation-timeline: view(inline) 将动画绑定到元素的视图时间线。
• 强调 animation-timeline 需单独声明在 animation 速记属性之后,以避免被覆盖。
5. view() 与 scroll() 函数的比较
• view() 函数创建基于元素在容器中可见性的视图进度时间线,适用于元素特定的显示效果。
• scroll() 函数创建基于容器滚动位置的滚动进度时间线。
• view() 更适合实现当特定元素滚动到视口时触发的动画。
6. view() 函数的参数与 animation-range 属性
• view() 接受 axis (block, inline, x, y)和 inset 参数。
• inset 参数定义滚动视口边缘的偏移量,精确控制动画触发范围。
• animation-range 属性进一步控制动画的开始和结束点,可使用 entry、exit、cover、contain 等关键词。
• 示例:通过 inset 控制动画在元素从底部进入滚动视口时才开始。
7. 创意轮播动画拓展
• 鼓励探索更多 CSS 属性的动画可能性,如背景位置(background position)动画,创造独特的轮播效果。
• 提及注册 CSS 属性(registered CSS properties)可以使更多属性动画化。
author Preethi
#优质博文 #CSS #Tailwind #前端
Tailwind CSS: Targeting Child Elements (when you have to)
以下是方便搜索索引的大纲 (AI 生成),请读原文:
author Christian Ekrem
Tailwind CSS: Targeting Child Elements (when you have to)
AI 摘要:本文探讨了在 Tailwind CSS 中如何针对无法直接控制的子元素(如来自 CMS 或第三方组件的内容)应用样式。尽管作者推荐在多数情况下使用传统的自定义 CSS 样式表,但文章详细介绍了如何利用 Tailwind 的任意变体 (Arbitrary Variants) 和 [&_selector] 语法来实现子元素样式控制。文中通过具体示例展示了如何使用 & 符号结合 CSS 选择器来定位直接子元素、所有后代元素以及处理伪状态 (pseudo-states),并讨论了这种方法适用的场景,最后通过一个实际案例(CMS 内容样式)对比了传统 CSS 和 Tailwind 方式的实现。
以下是方便搜索索引的大纲 (AI 生成),请读原文:
1. 遇到的问题:为什么需要定位子元素
• 传统 Tailwind CSS 的局限性:通常将工具类直接应用于元素,但对于无法控制的嵌套 HTML (如 CMS 内容) 无法直接应用。
• 典型场景:CMS 内容、第三方组件、动态生成的 HTML。
• 解决方案预告:虽然普通 CSS 样式表是首选,但本文将探索 Tailwind CSS 的任意变体 (Arbitrary Variants) 方案。
2. 传统 CSS 解决方案
• 示例:使用 .cms-content a 等选择器为嵌套链接和列表项添加样式。
• 优点:简单、可读、易维护,通常是最佳实践。
3. Tailwind CSS 的任意变体 (Arbitrary Variants)
• 核心概念:使用方括号 [] 在类名中直接编写 CSS 选择器。
• 语法示例:[&_a]:font-semibold。
• & 符号的含义:在 Tailwind 任意变体中,& 代表当前应用类的元素,类似于 Sass/SCSS 或 CSS 嵌套中的 &。
• 生成的 CSS:通过 & 符号,Tailwind 会将类名自身转换为选择器,再拼接我们自定义的子元素选择器,从而实现后代元素样式控制。
4. 常见的子元素定位模式 (Common Patterns)
• 直接子元素 (Direct Children):使用 [&>div] 定位直接子元素,例如为所有直接 div 添加边框和内边距。
• 所有后代元素 (All Descendants):使用 [&_a] 定位所有后代元素,例如为所有链接添加悬停下划线。
• 子元素的伪状态 (Pseudo-states on Children):使用 [&>button:hover] 或 [&_input:disabled] 为子元素在特定状态下应用样式。
5. 何时选择使用任意变体 (When This Makes Sense)
• 场景一:已完全投入 Tailwind 生态,不愿切换到普通 CSS。
• 场景二:只需少量样式规则,为之创建单独的样式表显得过度。
• 场景三:构建流程难以集成额外 CSS 文件。
• 场景四:希望样式与渲染内容的组件协同放置。
• 注意:对于可控内容,直接应用 Tailwind 类依然是最佳实践。
6. 实际案例:CMS 内容样式
• 背景:处理来自无头 CMS 的预渲染 HTML,无法控制内部标记。
• 传统 CSS 方案:展示了为 .cms-content 下的 a、img、li 元素编写的简洁 CSS 样式。
• Tailwind 方案:演示了如何在 Elm 和 React 组件中,通过将所有子元素样式规则整合到父容器的 className 属性中,利用任意变体实现同样的效果。
• 相关插件:提及 @tailwindcss/typography 插件的 prose 类可以处理富文本样式,但有时需要更精细控制。
7. 总结 (The Takeaway)
• 任意变体允许在 Tailwind 框架内使用任意 CSS 选择器,& 代表当前元素,_ 代表空格。
• 强调了通常情况下,独立的普通 CSS 样式表对于嵌入内容来说更简单、更可读、更易维护。
• Tailwind 和传统 CSS 可以良好共存。
• 鼓励读者了解这种方法的可能性,以备不时之需。
author Christian Ekrem
#前端 #优质博文 #CSS #动画 #新特性
CSS Scroll-Triggered Animations are coming to Chrome!
以下是方便搜索索引的大纲 (AI 生成),请读原文:
author Bramus!
CSS Scroll-Triggered Animations are coming to Chrome!
AI 摘要:Chrome 浏览器将在明年初推出纯 CSS 实现的滚动触发动画。这是一种基于时间,并在特定滚动偏移量(scroll offset)触发的动画,与现有的滚动驱动动画不同。这项功能有望在 Chrome 145 版本正式发布,它将替代部分 IntersectionObserver 的用途。
以下是方便搜索索引的大纲 (AI 生成),请读原文:
1. 新特性发布预告
• Chrome 浏览器即将支持纯 CSS 实现的滚动触发动画(Scroll-Triggered Animations)。
• 预计在明年初推出,并在 Chrome 145 版本正式发布。
2. 滚动相关动画的区别
• 滚动驱动动画(Scroll-Driven Animations):动画进度随滚动条移动从 0% 到 100%,停止滚动则暂停,反向滚动则倒退。
• 滚动触发动画(Scroll-Triggered Animations):在达到特定的滚动偏移量时触发,是基于时间的动画。
3. 替代传统实现方式
• 新特性将允许开发者以声明式(declaratively)的 CSS 方式实现,替代部分对 IntersectionObserver 的依赖。
4. 资源与演示
• 为 timeline-trigger 的范围(ranges)创建了一个可视化工具,解释激活范围(activation range)和活动范围(active range)的概念。
• 激活范围(activation range)是触发器被激活的区域,活动范围(active range)是触发器保持激活状态的区域,活动范围必须包含激活范围。
5. 体验方式
• 用户可以在 Chrome Canary 中启用“Experimental Web Platform Features”旗标来提前体验该功能。
author Bramus!
#优质博文 #前端 #CSS #AI #MCP #debug
这个好啊,Chrome DevTools MCP 终于能直接介入浏览器调试了。
Let your Coding Agent debug your browser session with Chrome DevTools MCP
以下是方便搜索索引的大纲(AI 生成),请读原文
author Sebastian Benz
这个好啊,Chrome DevTools MCP 终于能直接介入浏览器调试了。
Let your Coding Agent debug your browser session with Chrome DevTools MCP
AI 摘要:Chrome DevTools MCP 迎来了重大更新,现在允许 AI 编程助手直接连接到活跃的浏览器会话。这项新功能极大地提升了调试效率,编程助手可以重用现有登录会话、访问活跃的调试面板(如网络面板和元素面板),从而实现手动调试与 AI 辅助调试的无缝切换。文章详细介绍了这一功能的实现原理、安全措施(如用户授权弹窗和控制横幅)以及如何配置和使用,为开发者提供了更智能、更便捷的调试体验。
以下是方便搜索索引的大纲(AI 生成),请读原文
1. Chrome DevTools MCP 新功能概述
• 核心更新:Chrome DevTools MCP 服务器现在支持 AI 编程助手直接连接到活跃的浏览器会话。
• 主要优势
• 重用现有浏览器会话:编程助手可以直接访问已登录的会话,无需重新登录。
• 访问活跃调试会话:编程助手可以直接从 DevTools UI 访问并调查选定的元素或网络请求。
• 工作流改进:实现手动调试与 AI 辅助调试的无缝切换。
2. Chrome DevTools MCP 连接方式
• 现有连接方式
• 使用特定用户配置文件运行 Chrome。
• 通过远程调试端口连接到运行中的 Chrome 实例。
• 在独立临时配置文件中运行多个 Chrome 实例。
• 新增自动连接功能:通过 --autoConnect 选项,MCP 服务器可以请求远程调试连接。
3. 远程调试工作原理及安全措施
• 基础机制:基于 Chrome 现有的远程调试能力。
• 启用步骤:用户需在 chrome://inspect#remote-debugging 中手动启用远程调试。
• 连接流程:
• MCP 服务器配置 --autoConnect 选项后,将尝试连接活跃的 Chrome 实例。
• 用户授权:Chrome 会弹出对话框,要求用户授权远程调试会话,以防止滥用。
• 状态提示:调试会话激活时,Chrome 顶部会显示“Chrome is being controlled by automated test software”横幅。
4. 如何开始使用
• 步骤一:在 Chrome 中设置远程调试
• 导航至 chrome://inspect/#remote-debugging。
• 根据对话框提示允许或禁止传入的调试连接。
• 步骤二:配置 Chrome DevTools MCP 服务器
• 在 MCP 服务器配置中,为 chrome-devtools 服务添加 --autoConnect 命令行参数。
• 示例配置适用于 gemini-cli。
• 步骤三:测试设置
• 运行 gemini-cli 并输入性能检查指令。
• 允许 Chrome 弹窗中的远程调试请求。
• 验证 MCP 服务器是否能成功打开网页并执行性能追踪。
• 更多信息:可参考 GitHub 上的 README 文档获取完整说明。
5. 未来展望
• 调试任务交接:AI 编程助手可以接管调试任务,提升效率。
• 面板数据暴露:计划逐步向编程助手暴露更多 DevTools 面板数据。
author Sebastian Benz
#优质博文 #React #前端 #course
Do's and Don'ts of useEffectEvent in React
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Slicker
Do's and Don'ts of useEffectEvent in React
AI 摘要:useEffectEvent 是 React 新增的 Hook,用来在 Effect 中获取最新的 props / state 而不触发 Effect 重新执行。它通过保持函数引用稳定,解决了“依赖列表必须包含所有变量”导致的频繁重渲染问题。文章列举了它的使用场景、可做与不可做的细节,以及最佳实践和迁移建议,帮助开发者在合适的场景安全使用该特性。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 什么是 useEffectEvent
• 介绍了 useEffectEvent 的核心概念:创建一个始终读取最新值的稳定函数引用
• 说明它如何在不触发 Effect 重跑的情况下访问最新的 props / state
2. 解决的问题
• 通过聊天应用示例,展示传统写法需把所有变量加入依赖导致不必要的重跑
• 对比使用 useEffectEvent 后,仅在真正需要的依赖(如 roomId)变化时才重新执行 Effect
3. Do's 与 Don'ts
• ✅ Do:在 Effect 内直接调用、用于读取最新值、用于需要 Effect 上下文的事件处理、分离响应式与非响应式逻辑、同步调用
• ❌ Don't:在普通 UI 事件处理器中使用、在渲染阶段调用、作为 props 传递、异步或延时调用、替代正常的 memoization
4. 详细示例
• ✅ 正确:在 Effect 中抽离非响应式逻辑(如主题变化)保持连接仅在 roomId 改变时重建
• ❌ 错误:在按钮点击等普通事件中使用 useEffectEvent,建议使用普通函数或 useCallback
• ✅ 正确:在定时器或轮询中读取最新的回调函数(如 onTick)
• ❌ 错误:在异步 fetch 回调中调用 useEffectEvent,可能在组件卸载后仍被调用
• ✅ 正确:在清理函数中也可使用 useEffectEvent 记录页面退出事件
• ❌ 错误:把 useEffectEvent 作为其他 Hook(如 useMemo)的依赖,破坏其稳定性
5. 常见使用场景
• 日志与分析:在路径变化时记录页面访问,内部使用最新的主题、语言、用户 ID 等信息
• 第三方回调:向消息服务订阅回调,回调内部使用最新的用户偏好而无需重新订阅
• 防抖实现:在防抖定时器中使用最新的搜索参数和过滤条件
6. 最佳实践
• 只在确实需要读取非响应式值时使用
• 考虑逻辑是否应该放在 Effect 之外的普通事件处理器里
• 保持 Event 函数单一职责,写清使用原因以便维护
• 等待 stable 版本发布再用于生产环境
7. 迁移路径
• 对比使用 useCallback 并频繁更改依赖或通过 eslint-disable 抑制警告的情形,说明 useEffectEvent 可作为更清晰的替代方案
• 建议先重构组件逻辑,确认是否真的需要该 Hook
author Slicker