呜啦!日常碎碎念,偶尔掉落优质前端博文推荐、学习资源等
网页: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
#优质博文 #CSS #SVG #前端 #动画 #course
How to animate SVG with CSS: Tutorial with examples
很详细的 svg 动画教程。
How to animate SVG with CSS: Tutorial with examples
很详细的 svg 动画教程。
AI 摘要:文章深入探讨了使用 CSS 动画化 SVG 的基础知识与进阶技巧。作者 Hope Armstrong 首先解释了 SVG 的优势及多种嵌入方式,指出内联(Inline)方式是实现 CSS 控制的最佳选择。随后展示了如何通过 transition 和 keyframes 属性操作 SVG 特有的属性(如 fill、stroke 等),并重点解析了路径绘制动画(Line drawing animation)的实现原理。最后,文章强调了在制作动画时需兼顾无障碍访问(Accessibility)以及选择合适工具的重要性。
#优质博文 #前端 #锚点定位 #CSS #JavaScript #course #动画
介绍如何利用 CSS 锚点定位(CSS Anchor Positioning)实现元素跟随交互目标移动的“随动”(Follow-the-leader)模式。
una.im | Follow-the-leader pattern with CSS anchor positioning
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
author una.im
介绍如何利用 CSS 锚点定位(CSS Anchor Positioning)实现元素跟随交互目标移动的“随动”(Follow-the-leader)模式。
una.im | Follow-the-leader pattern with CSS anchor positioning
AI 摘要:文章探讨了 CSS 锚点定位(CSS Anchor Positioning)API 的一种高级用法:通过动态更新 anchor-name(锚点名称),让一个定位元素(Follower)在多个潜在锚点之间平滑切换。这种“随动”模式不仅支持纯 CSS 的悬浮(hover)和焦点(focus)触发,还能结合 JavaScript 状态管理或最新的 ::scroll-marker 伪元素,实现极简且高性能的导航高亮、焦点跟随等视觉交互效果。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 技术核心原理 (The Technique)
• 动态锚点绑定:创建一个具有固定 position-anchor 名称的跟随元素,并在交互(如 :hover )时将对应的 anchor-name 赋值给当前目标,实现定位目标的动态切换。
• 平滑过渡动画:利用 CSS transition 作用于 top、left 等属性,使跟随元素在不同锚点间移动时产生平滑的动画效果。
• 定位限制:目前 position-area 属性尚不支持动画过渡,因此实现平滑移动仍需依赖绝对定位属性(如 top, left, right, bottom)。
2. 实际应用案例
• 操作栏 (Action Bar):结合 JavaScript 处理点击状态,并利用 CSS 处理悬浮和焦点态,实现一个类似“放大镜”或“高亮框”在导航项间流转的视觉效果。
• 轮播图滚动指示器 (Carousel Scroll Markers):展示了纯 CSS 的方案,利用 ::scroll-marker 伪元素和 :target-current 伪类,在用户滚动时自动更新锚点名称,驱动指示器跟随。
3. 兼容性与进阶技巧 (Compatibility & Tips)
• 浏览器支持:该技术基于 CSS Anchor Positioning API,目前已在 Chromium 内核浏览器上线,并被列入 Interop 2025,WebKit (Safari) 也即将支持。
• 体验优化:通过伪元素技巧(Pseudo element trick)可以防止鼠标在元素间移动时因间隙导致的状态丢失。
• 性能优势:相比于传统依赖 JS 计算 getBoundingClientRect() 的方案,该方法将布局计算交给浏览器内核,性能更优且代码更简洁。
author una.im
#优质博文 #React #性能优化 #JavaScript #course
How to Measure and Optimize React Performance | DebugBear:全面介绍了衡量和优化 React 应用性能的工具与技术,重点讲解了 React 19.2 的新特性以及各类运行时和构建时的优化策略。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
How to Measure and Optimize React Performance | DebugBear:全面介绍了衡量和优化 React 应用性能的工具与技术,重点讲解了 React 19.2 的新特性以及各类运行时和构建时的优化策略。
AI 摘要:文章深入探讨了如何应对 React 应用随规模增长而出现的性能退化问题。内容涵盖了从 React 19.2 新引入的性能轨道(Performance Tracks)到经典的 Profiler 工具的使用方法。作者详细讲解了运行时优化(如记忆化、虚拟列表和状态管理)、并发特性(useTransition 和 useDeferredValue)、包体积控制、服务端渲染(SSR)以及最新的 React Compiler。最后,文章强调了在生产环境中使用真实用户监控(RUM)来持续跟踪性能表现的重要性。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 衡量 React 性能的工具
• React 性能轨道 (React Performance Tracks):介绍了 React 19.2 引入的新功能,在 Chrome DevTools 的性能面板中可视化调度器、组件渲染及服务器请求。
• React DevTools Profiler:讲解了如何使用火焰图(Flame Chart)定位瓶颈,并利用“记录组件渲染原因”功能排除不必要的重绘。
• Profiler API 与 Chrome 性能面板:介绍如何通过代码编程式地收集渲染时长,以及如何在主线程时间线中分析 JavaScript 的执行耗时。
2. 运行时优化策略
• 记忆化:详细对比了 memo()、 useMemo() 和 useCallback() 的使用场景,强调避免对简单计算过度使用。
• 代码分割:利用 lazy() 和 Suspense 实现组件按需加载,减少初始加载负担。
• 列表虚拟化:推荐使用 react-window 等库处理长列表,仅渲染可视区域内的 DOM 节点。
• 状态管理优化:提倡状态共存(State Colocation)原则,并建议在复杂场景下使用 Zustand 或 Jotai 等支持选择器优化的轻量库。
3. 并发特性与编译器
• 并发渲染挂钩 (Concurrency Hooks):讲解了 useTransition 如何标记非紧急更新以保持 UI 响应,以及 useDeferredValue 如何延迟处理从父级传递的频繁变动的值。
• React Compiler:介绍了 2025 年推出的自动记忆化工具,它能在构建时自动优化组件,减少手动编写 useMemo 的需求。
4. 交付与架构优化
• 包体积控制:使用 Lighthouse Treemap 和 Webpack Bundle Analyzer 分析依赖,提倡按需引入(Tree Shaking)以减少解析耗时。
• 服务端渲染与流式传输 (SSR & Streaming):探讨了 renderToPipeableStream 带来的流式 HTML 交付,以及 React 服务端组件(RSC)如何通过零客户端 JavaScript 提升性能。
#优质博文 #开源 #前端 #TypeScript #course
📘 《The Concise TypeScript Book》 是一本简短精炼的 TypeScript 指南,免费开源。
📘 《The Concise TypeScript Book》 是一本简短精炼的 TypeScript 指南,免费开源。
《简明 TypeScript 入门指南》全面而简洁地概述了 TypeScript 的功能。它清晰地解释了最新版本语言的各个方面,从强大的类型系统到高级特性,无所不包。无论您是初学者还是经验丰富的开发者,本书都是提升您 TypeScript 理解和技能的宝贵资源。
#优质博文 #CSS #前端 #course
纯 CSS 实现两个元素之间折线自动相连
author 张鑫旭
纯 CSS 实现两个元素之间折线自动相连
AI 摘要:张鑫旭的这篇博文展示了如何纯粹利用 CSS 锚点定位 (CSS Anchor Positioning API) 来实现两个元素之间自动相连的折线效果。文章从回顾锚点定位的设想开始,通过具体的代码示例详细阐述了定义锚点、计算线条位置、以及利用渐变和遮罩绘制连接线的实现原理。作者也坦诚指出了当前方案在特定对齐情况下的局限性,并简要提及了更复杂的解决思路,但认为其实现成本可能已超出 JavaScript (JS) 方案。
author 张鑫旭
#优质博文 #前端 #新特性 #CSS #锚点定位 #course
Connecting Circles With Anchor Positioning II
以下是方便搜索索引的大纲(AI 生成),请读原文:
author Temani Afif
Connecting Circles With Anchor Positioning II
AI 摘要:本文是作者关于使用 CSS 锚点定位技术连接圆圈系列的第二部分,主要关注在连接两个圆圈的箭头内部计算并显示它们之间的距离。文章展示了改进后的 HTML 结构和 CSS 变量定义,并通过交互式 CodePen 示例演示了拖动圆圈时距离实时更新的效果,但目前该功能仅支持 Chrome 浏览器。
以下是方便搜索索引的大纲(AI 生成),请读原文:
1. 引言与目的
• 前言回顾:基于前一篇关于连接圆圈的实现。
• 核心改进:在箭头形状内增加计算并显示两个圆圈之间距离的功能。
2. 技术实现细节
• HTML 结构:展示了使用 div 元素分别表示圆圈 (circle) 和连接箭头 (arrow) 的基本结构,其中 arrow 元素通过 x, y 等属性引用圆圈。
• CSS 变量:定义了用于控制箭头尺寸(--r, --a, --d)、圆圈与箭头间距(--g)以及颜色(--c)的关键 CSS 变量。
3. 交互式演示与局限性
• 实时更新:通过 CodePen 演示,用户可以拖动圆圈,观察距离值如何在箭头内部实时更新。
• 多圆圈示例:提供了一个包含多个圆圈的 CodePen 演示,展示了该技术在更复杂场景下的应用潜力。
• 浏览器兼容性:目前该功能仅在 Chrome 浏览器中支持。
4. 相关资源与拓展阅读
• 前作链接:提供了《Connecting Circles With Anchor Positioning》的链接,方便读者了解原始实现。
• 其他 CSS 技巧:列举了作者的其他 CSS 技巧文章,如《Fizz Buzz using Modern CSS (no HTML)》。
author Temani Afif
#优质博文 #前端 #工程化 #测试 #course
Vitest Browser Mode - The Future of Frontend Testing
太帅了
Vitest Browser Mode - The Future of Frontend Testing
太帅了
AI 摘要:本文全面介绍了 Vitest Browser Mode,这是一种在真实浏览器环境中运行前端测试的新兴技术。它结合了端到端(E2E)测试的真实性与组件测试的隔离性,能够直接利用所有 Web API,无需模拟,并提供可视化的调试界面。作者预测 Vitest Browser Mode 将在未来几年内成为前端工程师必备的测试工具。文章详细阐述了 Vitest Browser Mode 的工作原理、测试编写方式(类比 React Testing Library 和 Playwright)、核心概念、配置方法(推荐使用 Playwright provider)、安装步骤以及如何运行测试,并提供了一个完整的示例。
#优质博文 #React #前端 #性能优化 #异步编程 #course
讲了怎么使用 TanStack Pacer 来管理前端应用中的异步事件时序,以优化性能并避免 RxJS 的复杂性。
Moving beyond RxJS: A guide to TanStack Pacer - LogRocket Blog
author Emmanuel John
讲了怎么使用 TanStack Pacer 来管理前端应用中的异步事件时序,以优化性能并避免 RxJS 的复杂性。
Moving beyond RxJS: A guide to TanStack Pacer - LogRocket Blog
AI 摘要:TanStack Pacer 是一个专为前端应用设计的轻量级库,旨在解决常见的异步事件时序问题,例如防抖、节流、批处理和速率限制。文章通过构建一个类似 Pinterest 的无限滚动图片画廊,详细展示了如何在 React 应用中集成并使用 Pacer 的核心功能,以优化用户界面性能并避免 RxJS 带来的复杂性,从而提供了一个更易学、更小巧、更符合 React 生态的解决方案。
author Emmanuel John
#优质博文 #前端 #工程化 #性能优化 #JavaScript #BundleSize #TreeShaking #course
相当实用的好文,教你怎么减小打包体积(PS:初学者友好)
Bundle Size Investigation: A Step-by-Step Guide to Shrinking Your JavaScript
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Nadia Makarevich
相当实用的好文,教你怎么减小打包体积(PS:初学者友好)
Bundle Size Investigation: A Step-by-Step Guide to Shrinking Your JavaScript
AI 摘要:本文提供了一份详细的逐步指南,旨在帮助开发者调查并缩减 JavaScript 打包文件的大小,以提高网页性能。作者通过一个实际项目案例,展示了如何使用打包分析器来识别大型或冗余的代码块。文章深入探讨了摇树优化(tree-shaking)的工作原理和局限性,特别是针对 CommonJS 模块和 * 导入模式。此外,还介绍了如何通过识别和移除重复库、以及处理由第三方依赖引入的传递依赖(transitive dependencies)来进一步优化代码体积,最终将示例项目的 bundle size 从 5MB 显著减少到 600KB 左右。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 初始项目设置 (Initial Project Setup)
• 作者创建了一个故意膨胀的示例项目(其 JavaScript 包大小为 5MB),作为演示如何调查和缩小打包体积的起点。
• 提供项目 GitHub 仓库链接,鼓励读者通过实际操作来验证文章内容。
2. 分析打包大小 (Analyzing Bundle Size)
• 介绍了打包分析器(bundle analyzer)工具的使用,例如 Vite 项目中的 Rollup Plugin Visualizer。
• 解释如何解读打包分析图(treemap),识别出项目中最大的代码块,尤其是供应商(vendor)代码和应用程序自身代码。
• 指出可以通过配置更改可视化模板(template),如使用火焰图(flamegraph),以获得不同视角的分析。
3. 调查流程 (Investigation Process)
• 确定要移除的包 (Step 1: Identify a Package to Eliminate):通过打包分析图识别出体积巨大且可能存在问题的包,如 @mui 相关的包。
• 理解包 (Step 2: Understand the Package):快速研究包的功能和用途,以理解其在项目中的角色。
• 理解包的使用方式 (Step 3: Understand the Usage of the Package):通过代码搜索确定包在项目中的导入和使用模式,特别是是否存在 * 导入所有内容的模式。
• 确认问题 (Step 4: Confirm That This is the Problem):通过临时注释掉问题包的导入代码并重建项目,验证其对打包大小的实际影响。
4. 摇树优化和死代码消除 (Tree Shaking and Dead Code Elimination)
• 解释摇树优化(tree-shaking)的原理:现代打包工具如何识别并移除未使用的代码(dead code)。
• 通过示例代码展示了 tree-shaking 在原生 ESM 模块中的有效性。
• 揭示了 * 导入模式( import * as Something from 'library')会阻止 tree-shaking 对外部库生效,导致整个库被打包。
• 提出解决方案:避免使用 * 导入,改为精确导入所需模块,以确保 tree-shaking 正常工作。
5. ES 模块和非摇树优化库 (ES Modules and Non-tree-shakable Libraries)
• 解释 JavaScript 模块格式(如 ESM, CommonJS)对 tree-shaking 能力的影响。
• 强调 ESM 格式易于 tree-shaking ,而 CommonJS 等旧格式则难以优化。
• 介绍 is-esm 工具,用于检查一个 npm 包是否为 ESM 格式。
• 以 lodash 库为例,展示了非 ESM 格式导致 tree-shaking 失败的问题,即使是精确导入特定函数也无济于事。
• 提供解决方案:使用库提供的精确子路径导入(import trim from 'lodash/trim')来只引入所需部分,或在功能允许的情况下替换为原生 JavaScript 函数。
6. 常识和重复库 (Common Sense and Repeating Libraries)
• 指出在大型项目中,多个库可能实现相同功能,导致代码冗余。
• 以日期处理库 date-fns、moment 和 luxon 为例,展示了如何识别并移除这些重复的库。
• 强调选择替换库时需考虑 tree-shaking 能力、API 易用性、维护状态以及对打包大小的影响。
• 通过将 moment 和 luxon 的使用重构为 date-fns,显著减少了打包体积。
7. 传递依赖 (Transitive Dependencies)
• 解释传递依赖:当项目直接依赖的库又依赖了其他库时,这些间接依赖也会被打包。
• 介绍 npm-why 工具,用于追溯一个包的所有依赖路径,从而识别其作为传递依赖的来源。
• 以 @emotion 库为例,即使从项目中移除了直接使用,它仍可能通过 @mui 等库作为传递依赖存在。
• 说明移除传递依赖可能需要移除其上游所有依赖,这是一项需要权衡成本和收益的复杂任务。
• 通过将 @mui 组件替换为 Radix UI 组件并替换图标,成功移除了 @mui 及其传递依赖 @emotion。
8. 结果 (The Result)
• 总结了整个优化过程的成果:示例项目的 JavaScript 包大小从 5MB 显著减少到 600.98 KB。
• 指出尽管取得了巨大进步,但仍有进一步的优化空间,例如通过懒加载(lazy loading)处理 tiptap 和 prosemirror 等大型库。
author Nadia Makarevich
Infinite Canvas: Building a Seamless, Pan-Anywhere Image Space | Codrops
AI 摘要:本教程深入探讨了如何利用 React Three Fiber 构建一个无缝、可无限平移的 3D 图像画布。文章核心在于通过“区块” (chunk) 分块渲染、确定性 (deterministic) 内容生成、基于距离的剔除 (culling) 与渐隐,以及惯性 (inertia) 驱动的相机控制器等技术,创造出无限探索的视觉错觉,同时确保在高性能设备上达到 120 帧的流畅体验。它还详细介绍了包括延迟加载、像素密度限制、禁用抗锯齿等多种性能优化策略,为开发者提供了构建响应式、沉浸式 3D 体验的实用指南和未来扩展方向。
author Edoardo Lunardi
#优质博文 #前端 #CSS #渐进增强 #新特性 #course
一篇关于
Directional CSS with scroll-state(scrolled)
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Una
一篇关于
scroll-state(scrolled) 很详细的介绍,该查询允许开发者根据用户最新的滚动方向来应用样式,从而实现响应式用户界面。Directional CSS with scroll-state(scrolled)
AI 摘要:本文详细介绍了 Chrome 144 中新增的 scroll-state(scrolled) CSS 查询。作为 scroll-state() 容器查询 (container queries) 家族的一部分,它使开发者能够根据用户最近的滚动方向动态调整页面元素的样式。文章首先解释了其工作原理,包括如何设置 container-type: scroll-state 以及 scrolled 查询接受的不同方向值。随后,通过几个实用的案例演示了其应用,包括在用户向下滚动时隐藏顶部导航栏并在向上滚动时重新显示(使用 fixed 或 sticky 定位),以及结合滚动触发动画 (scroll-triggered animations) 实现方向性的元素进入效果。文章强调了这种新特性在渐进增强 (Progressive Enhancement) 方面的优势,展示了无需 JavaScript 即可实现复杂交互的可能性。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. scroll-state(scrolled) 查询介绍
• 新特性:Chrome 144 中引入的 CSS 新查询,用于根据用户滚动方向应用样式。
• 核心功能:允许开发者基于用户最新的滚动方向来动态修改元素的样式。
2. 工作原理
• scroll-state() 查询家族:scrolled 是 scroll-state() 容器查询 (container queries) 的一个新成员,同系列还包括 stuck、snapped 和 scrollable。
• 启用方式:需在父元素上设置 container-type: scroll-state。
• 查询语法:通过 @container scroll-state(<type>: <value>) 规则块来应用基于滚动状态的样式。
3. scrolled 查询的详细说明
• 检测目标:检测最近期的相对滚动方向。
• 支持值:
• 方向性值:top、right、bottom、left。
• 逻辑方向值:block-start、inline-start、block-end、inline-end。
• 轴向速记:x、y、block、inline。
• 初始状态:none,表示容器尚未发生相对滚动。
• 动态性:浏览器会实时更新此状态,允许根据用户滚动方向(向上、向下、向左、向右)来为子元素设置样式。
4. 实际应用案例
• 案例一:使用固定定位 (fixed positioning) 实现的隐藏导航栏 (Hidey-bar)
• 功能描述:当用户向下滚动时隐藏顶部导航栏,向上滚动时重新显示。
• 优势:增加屏幕可视空间,且无需完全滚动回顶部即可访问导航。
• 渐进增强 (Progressive Enhancement):不支持此特性的浏览器将始终显示导航栏,不影响基本功能。
• 案例二:使用粘性定位 (sticky positioning) 实现的隐藏导航栏 (Hidey-bar)
• 作者偏好方案:采用 position: sticky 实现类似的导航栏隐藏/显示功能。
• 渐进增强优势:对于不支持的浏览器,导航栏保持原有的粘性定位行为,不破坏现有用户体验。
• 用户体验:导航栏在开始滚动时动画隐藏,向上滚动时动画出现。
• 案例三:方向性滚动进入动画 (Directional scroll entry animation)
• 实现原理:结合 scroll-state(scrolled) 和实验性的滚动触发动画 (scroll-triggered animations) API,根据滚动方向改变元素的进入动画效果。
• 示例:根据是向上滚动还是向下滚动,使卡片从不同的方向(例如,从底部或从顶部)滑入视图。
• 发展前景:尽管当前的滚动触发动画 API 仍处于早期阶段并存在一些限制(如动画重播问题),但其潜力巨大,有望实现更自然的用户界面动效。
author Una
Demo 这个也很酷。
How to Create a Pixel-to-Voxel Video Drop Effect with Three.js and Rapier
AI 摘要:本教程详细介绍了如何利用 Three.js、着色器 (shaders) 和 Rapier 物理引擎,将 2D 视频流转化为动态的 3D 体素 (voxel) 下落效果。文章从核心概念——像素和重力——出发,逐步讲解了如何构建一个由 InstancedMesh 和刚体 (rigid bodies) 组成的平面,通过着色器实现平铺像素到 3D 体素的涟漪 (ripple) 变形效果,并最终通过 JavaScript 模拟涟漪进程来激活物理引擎,使体素在逼真的物理作用下散射和恢复。作者还分享了实现过程中的技术细节、优化考量以及未来扩展的可能性。
author Junichi Kasahara
#优质博文 #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
#优质博文 #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
#优质博文 #AI #AST #React #前端 #测试 #工程实践 #ClaudeCode #codemod #course
好文章,关于使用 AI 进行重构迁移的教科书式文章。
Migrating 6000 React tests using AI Agents and ASTs
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
author Elio Capella Sánchez
好文章,关于使用 AI 进行重构迁移的教科书式文章。
Migrating 6000 React tests using AI Agents and ASTs
AI 摘要:作者在 Filestage 的前端项目中使用 AI Agents(特别是 Claude Code)与 AST(Abstract Syntax Tree)技术,将近千个测试文件、六千多条测试从 React Testing Library v13 迁移至 v14。文章展示了从制定迁移指南、分步提交 PR、编写 codemod、自动化验证到改进 AI 提示的完整过程,最后总结出 AI 在大规模代码迁移中的优势与局限,并强调“小步迭代 + 自动化验证”的工程基本功仍然至关重要。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 项目背景与动机
• 公司使用旧版 React Testing Library 编写了 970 个测试文件,总计 6000 多测试用例。
• 升级至 v14 后 API 完全异步化,行为变化大,手动迁移代价极高。
• 作者决定尝试用 AI 辅助完成大规模迁移。
2. 准备与迁移指南
• 首次直接用 Claude Code CLI 自动迁移失败,暴露出测试失败过多、AI 调试混乱的问题。
• 于是转而使用 Claude Web 模式制作详细的迁移指南,分析版本差异与新 API。
• 确定主要变化:异步 API、测试 setup 模式更新、时序逻辑差异需人工介入。
3. 拆分改动与依赖并行安装
• 利用 NPM 的包别名功能同时运行 v13 与 v14,避免一次性大变更。
• 生成迁移指南并提交第一份 PR,保证团队迭代可控。
4. 编写与测试 codemod 自动化工具
• 使用 jscodeshift 解析代码为 AST,再生成批量修改工具。
• 编写输入输出测试用例以验证 codemod 效果(例如导入路径、 renderWithUserEvent 封装替换)。
• 自动测试 codemod 确保修改一致性和可验证性。
5. 实际迁移与 AI 协作循环
• 通过详细 prompt 指令让 Claude Code 分批迁移 10 个测试文件,执行 lint 检查与单测验证。
• 持续观察失败案例,不断改进 codemod 与迁移指南。
• 迁移指南从最初 4500 字扩充到 7500 字;codemod 从 271 行发展到近千行,测试覆盖更完备。
• 共执行 50 次迁移,形成 50 个独立 PR。
6. AI 性能与局限分析
• Claude Code 在调试测试与识别重复模式方面表现优异。
• 局限包括 context 深度不足、长任务遗忘指令、无法稳定维持覆盖率。
• 通过增加 JSON 格式的覆盖率报告输入,AI 能理解覆盖问题并修复。
• 网络波动与服务超限导致中断,验证仍需人工把关。
7. 工程启示与最终成果
• 整体用一周完成迁移,每个 PR 约半小时。
• 若纯人工迁移,估计需数月。
• 迁移过程机械但 AI 显著提升效率。
• 保持验证自动化、关注 edge case、理解底层工具机制,是让 AI 发挥价值的关键。
• 作者展望未来 AI 将进一步解放开发者,从“重复劳动”转向更有创造力的工作。
author Elio Capella Sánchez
#前端 #course
老仓库了,适合初学者。
JavaScript Algorithms and Data Structures
一个涵盖经典算法与数据结构的 JavaScript 示例仓库,其中每个算法和数据结构都有其独立的 README 文件,包含相关的解释和进一步阅读的链接。
老仓库了,适合初学者。
JavaScript Algorithms and Data Structures
一个涵盖经典算法与数据结构的 JavaScript 示例仓库,其中每个算法和数据结构都有其独立的 README 文件,包含相关的解释和进一步阅读的链接。
#优质博文 #前端 #CSS #动画 #工程化 #规范 #course
Keyframes Tokens: Standardizing Animation Across Projects — Smashing Magazine
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
author Amit
Keyframes Tokens: Standardizing Animation Across Projects — Smashing Magazine
AI 摘要:本文介绍了通过将动画关键帧 (@keyframes) 设计为可重用的 Keyframes Tokens,来实现动画系统的标准化与可维护化。作者说明了动画重复定义与全局作用域冲突带来的问题,提出以集中式样式表、命名空间、可定制的 CSS 自定义属性(custom properties)和设计 tokens 的方式来统一所有动画。文中展示了 fade-in、slide-in、zoom、spin、pulse 等动画的动态实现,并讨论了动画叠加、组合 (animation-composition)、可访问性 (prefers-reduced-motion) 与实际项目实施策略。核心思想是:让动画像颜色、字号、间距一样成为可管理的系统资源。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 动画混乱的根源
• 各组件独立创建重复的 @keyframes,导致代码冗余。
• CSS keyframes 属于全局作用域,容易被后加载样式覆盖。
• 修改或统一动画需全局搜查,影响维护效率。
2. 统一的解决方案:Keyframes Tokens
• 将动画关键帧集中存放在共享样式表中,形成唯一数据源。
• 利用命名空间(如 kf- 前缀)避免命名冲突。
• 借助 CSS 自定义属性实现动态参数化,支持多场景适配。
• 使动画定义与其他 design tokens(颜色、间距等)协同管理。
3. 构建基础动画库
• Fade In:定义基础淡入动画并统一调用。
• Slide In:通过自定义属性 --kf-slide-from 控制入场方向。
• Zoom:用 --kf-zoom-from/to 实现双向缩放。
• Spin/Pulse:封装连续动画,可控制旋转幅度、脉冲强度。
• Bounce/Elastic:展示复杂缓动(easing)动画封装方法。
4. 动画组合与冲突处理
• 可将多种动画组合,如 fade+slide 或 zoom+pulse。
• 对同一属性冲突时使用 animation-composition: add; 合并动画效果。
• 适当使用动画时间错位(stagger)提升视觉节奏。
• 说明 transform 与单独变换 (translate/scale) 的执行顺序差异。
5. 无障碍与减弱动效(Reduced Motion)
• 利用 prefers-reduced-motion 提供无动画或柔和过渡版本。
• 对需要仍然变换属性的动画定义瞬时完成(instant-in)版本。
• 保留必要动效但平滑化运动,提升可访问性。
6. 实施策略与最佳实践
• 渐进引入:从常见动画(fade、slide)着手。
• 命名规范:统一前缀标识 token 动画。
• 文档化:在 token 文件添加注释说明用途与参数。
• 灵活性与简洁性:仅暴露必要自定义属性。
• 融入设计体系:将 keyframes tokens 视为 design language 的一部分。
author Amit
#优质博文 #typescript #前端 #course #趣站
这太酷了!
Visual Types
[以下是方便搜索索引的大纲(AI 生成),请读原文]
这太酷了!
Visual Types
AI 摘要:这篇交互式教学页面《Visual Types》以图形化的方式介绍了 TypeScript 的类型系统原理,将抽象的类型关系转为集合论直观类比。作者通过对基础类型、联合类型、交叉类型、泛型(Type Alias/Generic)、条件类型(Conditional Types)等模块的分解说明,让开发者从“类型是值的集合”这一基本理念出发,逐步理解 TypeScript 在编译期的推导与约束机制。整个内容通俗但专业,适合掌握 TS 类型系统结构性理解的人阅读学习。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 类型基础 (Foundation)
• 类型被定义为一组可能的运行时值集合,例如 boolean 表示 {true, false}
• 字面量类型 (Literal Type) 代表唯一具体值,如 42 只包含 42
• 联合类型 (Union Type) 使用 | 结合多个集合,如 "red"|"blue"
• 子类型 (Subtype) 是集合的子集关系,A extends B 表示 A 的值皆存在于 B 中
• 元组类型 (Tuple Type) 表示固定长度数组,每个位置具特定类型
• 对象类型 (Object Type) 以属性定义集合,可超集匹配,如 {id: number}
• 交叉类型 (Intersection Type) 用 & 表示需同时满足两侧类型,若互斥则结果为 never
2. 类型别名与推导 (Basics II)
• 类型别名 (Type Alias) 允许为类型定义命名,如 UserId = string
• 泛型类型别名 (Generic Type Alias) 像函数一般接收类型参数生成类型
• typeof 操作符可在编译期提取变量的类型,而非 JS 的运行时类型
• as const 防止类型被自动扩大,使值保持字面量类型并只读
• any 和 unknown 都能接收任意值,但 unknown 必须先缩小类型后使用
3. 对象与键操作 (Object Patterns)
• keyof 提取对象全部属性键,生成字符串字面量联合类型
• 索引访问类型 (Indexed Access Type) 可用 T["key"] 获取属性类型
• 映射类型 (Mapped Types) 用 [K in ...] 遍历键创建新类型,是构建工具类型的基础
4. 条件类型与分发机制 (Conditional Types)
• 条件类型使用 T extends U ? X : Y 表示类型层面的三元判断
• 所有类型都自反 (Reflexivity),即 T extends T 恒为 true
• 联合类型的条件判断是“分发的”(Distributive),会逐个成员计算后再合并
• 使用元组包裹 [T] extends [U] 可阻止分发行为
• never 用于排除不匹配分支
• infer 关键字可在条件匹配中捕获部分类型形状实现复用
5. 工具类型 (Utility Types)
• Pick<T, K> 提取对象的部分属性组成新类型
• ReturnType<T> 获取函数返回值类型
• Parameters<T> 获取函数参数类型元组
• 展示了如何用之前的条件、映射机制构建常用工具类型
#优质博文 #前端 #编程原则 #course
很好很经典的编程方法论推荐,适合初学者。
Programming principles for self taught front-end developers
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
author Andy Bell
很好很经典的编程方法论推荐,适合初学者。
Programming principles for self taught front-end developers
AI 摘要:本文以作者二十多年自学前端开发的经验为线索,提炼出一系列真正能用得上的编程原则,帮助开发者在「写代码的当下」做出更好的判断。作者从常见的 DRY(Don’t Repeat Yourself)、YAGNI(You Aren’t Gonna Need It)、KISS(Keep It Simple, Stupid)等抽象原则,延伸到更现实可操作的做法,如 “Rule of Three”、 “Make it work, make it right, make it fast”、保持函数幂等(Idempotency)、遵循单一职责原则(Single Responsibility Principle)、维持单一抽象层次(Single Level of Abstraction)。这些原则的核心,是让代码更易于理解、维护和演化——写出「易于推理」的好代码。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 自学开发者的视角
• 作者并非科班出身,而是在设计工作中逐步学习编程。
• 文章旨在帮助其他自学者少走弯路,用经验性的原则替代抽象的“计算机科学理论”。
• 强调“可实践的原则”比抽象定律更能指导日常编程决策。
2. 从口号到可行的习惯
• 对比常见但抽象的原则:Premature optimisation、YAGNI 和 DRY。
• 引出更落地的 “Rule of Three”:第三次重复时再做抽象或优化。
• 这种「三次规则」帮助开发者在实践中把握代码复用与复杂度的平衡。
3. 写出正确的代码顺序
• 展开 Kent Beck 提出的 “Make it work, make it right, make it fast”。
• 通过明确阶段来避免过早优化或纠结错误焦点。
• 这与 “Rule of Three” 背后的思想一致——聚焦当下任务,不超前设计。
4. 「糟糕的第一版」与逐步演化
• 探讨 Gall’s Law:复杂系统从简单可用系统演化而来。
• 结合 Second-system effect 与 “Best simple system for now” 等理念。
• 总结:优先完成可运行的简单版本,再通过迭代完善。
5. 写出更可推理的代码结构
• 幂等性 (Idempotency):函数在相同输入下应产生相同输出;有助于减少副作用、提高可维护性。
• 单一职责原则 (Single Responsibility Principle):一个函数或模块只有一个「变更原因」;避免耦合与连锁修改。
• 单一抽象层次 (Single Level of Abstraction):函数内部操作应保持一致层次,避免在底层细节与业务逻辑间跳跃。
• 示例:将获取用户、筛选活跃用户、发送邮件分别独立函数化,更清晰且易测试。
6. 原则的统一性与良好代码的特征
• 所有好代码共通点:易理解、易推理、内部职责清晰。
• 不良代码往往混乱于职责、层次或优化顺序上。
• 严格遵守这些原则虽显“教条”,却能在长期维护中体现价值。
7. 推荐阅读
• Refactoring by Martin Fowler
• Making impossible states impossible by Richard Feldman
• Make It Work Make It Right Make It Fast
• Single Level of Abstraction
• hacker-laws.com
author Andy Bell