关于 motion
面向 React 开发者的动画技能,涵盖手势、滚动、布局和退出动画,并提供包体积优化与无障碍建议。
主要功能
- 01手势与滚动动画模式
- 02FLIP 布局与共享过渡
- 03弹簧物理与 SVG 动画
- 04使用 AnimatePresence 实现退出动画
- 05包体积优化建议
- 06减少动态效果的无障碍支持
适用场景
- 01构建拖放交互界面
- 02添加滚动触发的显现与视差效果
- 03制作路由和布局过渡动画
- 04优化 React 应用的动画包体积
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ marcioaltoe/ skills --skill motion安装后在 Claude Code 中输入/motion确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.md.claude-plugin/plugin.jsonagents/openai.yamlreferences/common-patterns.mdmotion-vs-auto-animate.mdnextjs-integration.mdperformance-optimization.mdrules/motion.mdscripts/init-motion.shoptimize-bundle.shtemplates/layout-transitions.tsxmotion-nextjs-client.tsxmotion-vite-basic.tsxscroll-parallax.tsxui-components.tsx详细介绍
Motion 动画库
概述
Motion(包:motion,前身为 framer-motion)是业界标准的 React 动画库,数千款应用已在生产环境中使用。它在 GitHub 上拥有 30,200+ 星标和 300+ 个官方示例,提供声明式 API,只需少量代码即可创建复杂动画。
主要功能:
- 手势:拖动、悬停、轻触、平移、聚焦,支持跨设备使用
- 滚动动画:视口触发、滚动联动、视差效果
- 布局动画:使用 FLIP 技术实现流畅的布局变化和共享元素过渡
- 弹簧物理效果:基于物理的缓动效果,动作自然且可自定义
- SVG:路径变形、线条绘制、属性动画
- 退出动画:使用 AnimatePresence 实现卸载过渡
- 性能:硬件加速、ScrollTimeline API、包体积优化(2.3 KB - 34 KB)
已通过生产环境测试:React 19.2、Next.js 16.1、Vite 7.3、Tailwind v4
何时使用此技能
✅ 以下情况适合使用 Motion:
复杂交互:
- 拖放界面(可排序列表、看板、滑块)
- 带缩放/旋转/颜色变化的悬停状态
- 带弹跳/挤压效果的轻触反馈
- 适用于移动设备的平移手势控制
基于滚动的动画:
- 带视差图层的首屏区域
- 滚动触发的显现效果(元素进入视口时淡入)
- 与滚动位置联动的进度条
- 随滚动变换的粘性标题栏
布局过渡:
- 路由之间的共享元素过渡(卡片 → 详情页)
- 自动高度动画实现展开/折叠
- 网格/列表视图切换并平滑调整位置
- 带动画下划线的标签页导航
高级功能:
- SVG 线条绘制动画
- 形状之间的路径变形
- 实现自然弹跳效果的弹簧物理效果
- 编排动画序列(错开显现)
- 带背景模糊效果的模态对话框
优化包体积:
- 需要 2.3 KB 的动画库(使用 useAnimate mini)
- 希望将 Motion 从 34 KB 缩减到 4.6 KB(使用 LazyMotion)
❌ 以下情况不适合使用 Motion:
简单列表动画 → 改用 auto-animate 技能:
- 待办事项列表的添加/移除(auto-animate:3.28 KB,motion:34 KB)
- 搜索结果筛选
- 购物车商品
- 通知提示
- 不带手势的基础手风琴组件
静态内容:
- 无需用户交互或动画
- 无客户端交互的服务端渲染内容
Cloudflare Workers 部署 → ✅ 已修复(2024 年 12 月):
- 先前的构建兼容性问题已解决(GitHub issue #2918 已关闭并标记为已完成)
- Motion 现在可直接与 Wrangler 配合使用,无需变通方案
motion和framer-motionv12.23.24 均可正常工作
3D 动画 → 改用专用 3D 库:
- 使用 Three.js 实现 WebGL
- 使用 React Three Fiber 实现 React + Three.js
安装
最新稳定版本
# Using pnpm (recommended)
pnpm add motion
# Using npm
npm install motion
# Using yarn
yarn add motion
当前版本:12.27.5(已于 2026-01-21 验证)
Cloudflare Workers 注意事项:
# Both packages work with Cloudflare Workers (issue #2918 fixed Dec 2024)
pnpm add motion
# OR
pnpm add framer-motion # Same version, same API
包信息
- 包体积:
- 完整的
motion组件:压缩并经 gzip 处理后约 34 KB LazyMotion+m组件:约 4.6 KBuseAnimatemini:2.3 KB(体积最小的 React 动画库)useAnimatehybrid:17 KB
- 完整的
- 依赖项:React 18+ 或 React 19+
- TypeScript:内置原生支持(无需 @types 包)
核心概念
1. AnimatePresence(退出动画)
支持在组件卸载时播放动画:
import { AnimatePresence } from "motion/react"
<AnimatePresence>
{isVisible && (
<motion.div
key="modal"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
>
Modal content
</motion.div>
)}
</AnimatePresence>
关键规则:
- AnimatePresence 必须保持挂载(不要将其包在条件语句中)
- 所有子元素都必须具有唯一的
key属性 - AnimatePresence 应包裹条件语句,而不是反过来
常见错误(退出动画不会播放):
// ❌ Wrong - AnimatePresence unmounts with condition
{isVisible && (
<AnimatePresence>
<motion.div>Content</motion.div>
</AnimatePresence>
)}
// ✅ Correct - AnimatePresence stays mounted
<AnimatePresence>
{isVisible && <motion.div key="unique">Content</motion.div>}
</AnimatePresence>
2. 布局动画
特殊属性:
layout:启用 FLIP 布局动画layoutId:连接不同元素以实现共享过渡layoutScroll:修复可滚动容器中的动画(参见 Issue #5)layoutRoot:修复固定定位元素中的动画(参见 Issue #7)
<motion.div layout>
{isExpanded ? <FullContent /> : <Summary />}
</motion.div>
3. 滚动动画
视口触发(whileInView)
<motion.div
initial={{ opacity: 0, y: 50 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
>
Fades in when 100px from entering viewport
</motion.div>
滚动关联(useScroll)
import { useScroll, useTransform } from "motion/react"
const { scrollYProgress } = useScroll()
const y = useTransform(scrollYProgress, [0, 1], [0, -300])
<motion.div style={{ y }}>
Moves up 300px as user scrolls page
</motion.div>
性能:可用时使用原生 ScrollTimeline API 进行硬件加速。
集成指南
Vite + React + TypeScript
pnpm add motion
导入:import { motion } from "motion/react"
无需配置 Vite——开箱即用。
Next.js App Router(推荐模式)
关键要求:Motion 仅适用于客户端组件(不适用于服务端组件)。
步骤 1:创建客户端组件包装器
src/components/motion-client.tsx:
"use client"
// Optimized import for Next.js (reduces client JS)
import * as motion from "motion/react-client"
export { motion }
步骤 2:在服务端组件中使用
src/app/page.tsx:
import { motion } from "@/components/motion-client"
export default function Page() {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
>
This works in Server Component (wrapper is client)
</motion.div>
)
}
替代方案:直接使用客户端组件
"use client"
import { motion } from "motion/react"
export function AnimatedCard() {
return <motion.div>...</motion.div>
}
已知问题(Next.js 15+ + React 19):
- 自 2025 年 12 月起,已全面支持 React 19(StrictMode 的一个边缘情况请参见 Issue #11)
- Motion 12.27.5 已解决大多数兼容性问题
- AnimatePresence 在软导航时可能失效
- Reorder 组件与 Next.js 路由和页面级滚动不兼容(参见 Issue #10)
Next.js Pages Router
无需修改即可使用:
import { motion } from "motion/react"
export default function Page() {
return <motion.div>No "use client" needed</motion.div>
}
Tailwind CSS 集成
最佳实践:各司其职,发挥每个库的优势。
- Tailwind:通过
className实现静态和响应式样式 - Motion:通过 Motion 属性实现动画
<motion.button
className="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700"
whileHover={{ scale: 1.1 }}
whileTap={{ scale: 0.95 }}
>
Tailwind styles + Motion animations
</motion.button>
⚠️ 移除 Tailwind 过渡效果:否则会导致卡顿或冲突。
// ❌ Wrong - Tailwind transition conflicts with Motion
<motion.div className="transition-all duration-300" animate={{ x: 100 }} />
// ✅ Correct - Remove Tailwind transition
<motion.div animate={{ x: 100 }} />
原因:Motion 使用内联样式或浏览器原生动画,两者都会覆盖 Tailwind 的 CSS 过渡效果。
Cloudflare Workers(✅ 现已支持)
状态:✅ 已于 2024 年 12 月修复(GitHub Issue #2918 已关闭并标记为已完成)
安装:
# Motion now works directly with Cloudflare Workers
pnpm add motion
导入:
import { motion } from "motion/react"
历史说明:2024 年 12 月之前,Wrangler 存在 ESM 解析问题,需要通过使用 framer-motion 作为变通方案。此问题现已解决,这两个包现在都能与 Cloudflare Workers 正常配合使用。
性能优化
1. 使用 LazyMotion 减小包体积
问题:完整的 motion 组件压缩并 gzip 后约为 34 KB。
解决方案:使用 LazyMotion + m 组件,将体积降至 4.6 KB:
import { LazyMotion, domAnimation, m } from "motion/react"
function App() {
return (
<LazyMotion features={domAnimation}>
{/* Use 'm' instead of 'motion' */}
<m.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
>
Only 4.6 KB!
</m.div>
</LazyMotion>
)
}
工作原理:按需加载动画功能,而不是将所有功能打包在一起。
替代方案(体积最小):useAnimate mini(2.3 KB):
import { useAnimate } from "motion/react"
function Component() {
const [scope, animate] = useAnimate()
return <div ref={scope}>Smallest possible React animation</div>
}
2. 硬件加速
为变换添加 willChange:
<motion.div
style={{ willChange: "transform" }}
animate={{ x: 100, rotate: 45 }}
/>
还可用于:opacity、backgroundColor、clipPath、filter
工作原理:告知浏览器针对动画进行优化,并使用 GPU 合成。
3. 大型列表 → 使用虚拟化
问题:对 50–100 个或更多项目进行动画处理会导致严重卡顿。
解决方案:
pnpm add react-window
# or
pnpm add react-virtuoso
# or
pnpm add @tanstack/react-virtual
模式:
import { FixedSizeList } from 'react-window'
import { motion } from 'motion/react'
<FixedSizeList
height={600}
itemCount={1000}
itemSize={50}
>
{({ index, style }) => (
<motion.div style={style} layout>
Item {index}
</motion.div>
)}
</FixedSizeList>
原因:只渲染可见项目,减少 DOM 更新和内存使用量。
4. 使用 layout 属性实现 FLIP 动画
自动为布局变化添加动画,无需 JavaScript 计算:
<motion.div layout>
{isExpanded ? <LargeContent /> : <SmallContent />}
</motion.div>
性能:通过变换实现硬件加速,无需回流或重绘。
无障碍访问
遵循 prefers-reduced-motion
import { MotionConfig } from "motion/react"
<MotionConfig reducedMotion="user">
<App />
</MotionConfig>
选项:
"user":遵循操作系统设置(推荐)"always":强制使用即时过渡"never":忽略用户偏好
注意:✅ 已于 2023 年 1 月修复(GitHub #1567)——MotionConfig 现在可与 AnimatePresence 正常配合使用。
常见模式
5 种适用于生产环境的模式:
- 模态对话框 - 使用 AnimatePresence 实现背景和对话框的退出动画
- 手风琴 - 使用
height: "auto"为高度添加动画 - 拖动轮播 - 使用
drag="x"和dragConstraints - 滚动显示 - 使用
whileInView和视口边距 - 视差主视觉区 - 使用
useScroll+useTransform实现分层效果
完整代码请参阅 references/common-patterns.md(15 种以上模式)。
已知问题与解决方案
问题 1:AnimatePresence 退出动画不起作用
错误:退出动画没有播放,组件瞬间消失 来源:GitHub Issue #3078
原因:AnimatePresence 被包裹在条件语句中,或缺少 key 属性。在模态框内为交错显示的子元素定义 exit 属性,也可能导致模态框无法卸载(背景仍然可见)。
解决方案:
// ❌ Wrong - AnimatePresence wrapped in conditional
{isVisible && (
<AnimatePresence>
<motion.div>Content</motion.div>
</AnimatePresence>
)}
// ✅ Correct - AnimatePresence stays mounted
<AnimatePresence>
{isVisible && <motion.div key="unique">Content</motion.div>}
</AnimatePresence>
// ❌ Wrong - Staggered children with exit prevent modal removal
<AnimatePresence>
{isOpen && (
<Modal>
<motion.ul>
{items.map(item => (
<motion.li
key={item.id}
exit={{ opacity: 1, scale: 1 }} // ← Prevents modal unmount
>
{item.content}
</motion.li>
))}
</motion.ul>
</Modal>
)}
</AnimatePresence>
// ✅ Fix for modal - Remove exit from children or set duration: 0
<motion.li
key={item.id}
exit={{ opacity: 0, scale: 0.5, transition: { duration: 0 } }}
>
{item.content}
</motion.li>
问题 2:大型列表的性能问题
症状:50-100 多个动画元素会导致严重卡顿,浏览器冻结。
解决方案:使用虚拟化:
pnpm add react-window
完整指南请参阅 references/performance-optimization.md。
问题 3:Tailwind 过渡效果冲突
症状:动画卡顿或不起作用。
解决方案:移除 transition-* 类:
// ❌ Wrong
<motion.div className="transition-all" animate={{ x: 100 }} />
// ✅ Correct
<motion.div animate={{ x: 100 }} />
问题 4:Next.js 缺少 "use client"
症状:构建因 "motion is not defined" 或 SSR 错误而失败。
解决方案:添加 "use client" 指令:
"use client"
import { motion } from "motion/react"
App Router 模式请参阅 references/nextjs-integration.md。
问题 5:可滚动容器中的布局动画
症状:从已滚动的容器中移除元素时,过渡不完整。
解决方案:添加 layoutScroll 属性:
<motion.div layoutScroll className="overflow-auto">
{items.map(item => (
<motion.div key={item.id} layout>
{item.content}
</motion.div>
))}
</motion.div>
问题 6:Cloudflare Workers 构建错误(✅ 已解决)
状态:✅ 已于 2024 年 12 月修复(GitHub issue #2918 已关闭并标记为已完成)
此前的症状:使用 motion 包时,Wrangler 构建因 React 导入错误而失败。
当前状态:Motion 现在可在 Cloudflare Workers 中正常运行。无需使用变通方案。
如果遇到构建问题:请确保使用 Motion v12.23.24 或更高版本,以及 Wrangler v3+。
GitHub issue:#2918(于 2024 年 12 月 13 日关闭并标记为已完成)
问题 7:固定定位元素的布局动画
症状:固定定位元素中的布局动画位置不正确。
解决方案:添加 layoutRoot 属性:
<motion.div layoutRoot className="fixed top-0 left-0">
<motion.div layout>Content</motion.div>
</motion.div>
问题 8:layoutId + AnimatePresence 无法卸载
症状:AnimatePresence 内带有 layoutId 的元素无法卸载。
解决方案:使用 LayoutGroup 包裹,或避免混用退出动画和布局动画:
import { LayoutGroup } from "motion/react"
<LayoutGroup>
<AnimatePresence>
{items.map(item => (
<motion.div key={item.id} layoutId={item.id}>
{item.content}
</motion.div>
))}
</AnimatePresence>
</LayoutGroup>
问题 9:AnimatePresence 中的减少动态效果(✅ 已解决)
状态:✅ 已于 2023 年 1 月修复(GitHub issue #1567 通过 PR #1891 关闭)
此前的症状:MotionConfig 的 reducedMotion 设置不会影响 AnimatePresence 动画。
当前状态:MotionConfig 现在会将 reducedMotion 设置正确应用于 AnimatePresence 组件。该设置的行为符合文档说明。
可选的手动控制:如果需要超出内置支持范围的自定义行为:
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches
<motion.div
initial={{ opacity: prefersReducedMotion ? 1 : 0 }}
animate={{ opacity: 1 }}
transition={{ duration: prefersReducedMotion ? 0 : 0.3 }}
/>
GitHub issue:#1567(于 2023 年 1 月 13 日关闭并标记为已完成)
问题 10:Reorder 组件的限制
错误:Reorder 自动滚动失败,且无法与 Next.js 路由配合使用 来源:GitHub Issue #3469、#2183、#2101
原因:
- 页面级滚动:只有当
Reorder.Group位于带有overflow: auto/scroll的元素内时,Reorder 自动滚动才会生效;如果可滚动的是文档本身,则不会生效 - Next.js 路由:与 Next.js 路由系统不兼容,会导致随机卡住的状态
预防措施:
// ❌ Wrong - Page-level scrolling (auto-scroll fails)
<body style={{ height: "200vh" }}>
<Reorder.Group values={items} onReorder={setItems}>
{/* Auto-scroll doesn't trigger at viewport edges */}
</Reorder.Group>
</body>
// ✅ Correct - Container with overflow
<div style={{ height: "300px", overflow: "auto" }}>
<Reorder.Group values={items} onReorder={setItems}>
{items.map(item => (
<Reorder.Item key={item.id} value={item}>
{item.content}
</Reorder.Item>
))}
</Reorder.Group>
</div>
// ✅ Alternative - Use DnD Kit for complex cases
// Motion docs officially recommend DnD Kit for:
// - Multi-row reordering
// - Dragging between columns
// - Page-level scrollable containers
// - Complex drag-and-drop interactions
// Install: pnpm add @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities
完整的 Next.js 故障排除指南请参阅 references/nextjs-integration.md。
问题 11:React 19 StrictMode 拖动错误
错误:在文件树中从上向下拖动时,拖动手势会出错 来源:GitHub Issue #3169
发生原因:此问题仅在启用 StrictMode 的 React 19 项目中使用 Ant Design 组件时出现。被拖动元素的位置会出错,显示为偏移状态。在 React 18 或未启用 StrictMode 的 React 19 中不会出现。仅影响从上向下拖动(从下向上拖动正常)。
预防措施:在使用拖动手势的 React 19 项目中暂时禁用 StrictMode;如果 StrictMode 至关重要,则使用 React 18。等待 Motion 团队提供官方修复。
问题 12:缩放容器中的布局动画
错误:在缩放后的父容器中,布局动画从错误的位置开始 来源:GitHub Issue #3356
发生原因:布局动画系统将缩放后的坐标当作未缩放坐标使用。Motion 的布局动画以像素为单位,而父级缩放会影响视觉坐标。两者不匹配会导致位置计算错误。
预防措施(社区解决方法):
// Use transformTemplate to correct for parent scale
const scale = 2; // Parent's transform scale value
<div style={{ transform: `scale(${scale})` }}>
<motion.div
layout
transformTemplate={(latest, generated) => {
const match = /translate3d\((.+)px,\s?(.+)px,\s?(.+)px\)/.exec(generated);
if (match) {
const [, x, y, z] = match;
return `translate3d(${Number(x) / scale}px, ${Number(y) / scale}px, ${Number(z) / scale}px)`;
}
return generated;
}}
>
Content
</motion.div>
</div>
限制:仅适用于布局动画,无法修复其他变换,并且需要知道父级的缩放值。
问题 13:卸载时 AnimatePresence 退出状态卡住
错误:子组件在退出动画期间卸载时,退出状态卡住 来源:GitHub Issue #3243
发生原因:当 AnimatePresence 中的子组件在触发退出动画后立即卸载时,退出状态会卡住。组件会错误地停留在“退出”状态。
预防措施:AnimatePresence 正在处理 motion 组件的退出时,不要卸载这些组件。确保 motion.div 保持挂载,直至退出动画完成。仅对父级 AnimatePresence 子组件使用条件渲染。
问题 14:百分比值导致 Flex 容器中的布局动画出错
错误:布局动画瞬间跳转,而不是平滑地进行动画 来源:GitHub Issue #3401
发生原因:当容器使用 display flex 和 justify-content center 时,在 initial 属性中使用基于百分比的 x 值会导致布局动画出错。Motion 的布局动画以像素为单位,而 CSS 百分比变换会相对于元素或父级进行解析。坐标系不匹配会导致位置在帧中途重新计算。
预防措施:在动画开始前将百分比转换为像素。计算容器宽度,并使用像素值而不是百分比字符串。
问题 15:popLayout 模式下的亚像素精度损失
错误:退出过渡开始前,布局偏移 1px 来源:GitHub Issue #3260
发生原因:使用 AnimatePresence 和 mode popLayout 时,退出元素的尺寸会被捕获并作为内联样式重新应用。getBoundingClientRect 返回的亚像素值会被四舍五入为最接近的整数,从而导致明显的布局偏移,也可能导致文本换行变化。
预防措施:尺寸仅使用整数像素值,或避免在对亚像素敏感的布局中使用 popLayout。目前没有完美的解决方法。
模板
此技能在 templates/ 目录中包含 5 个可用于生产环境的模板:
- motion-vite-basic.tsx - 包含常见动画的基础 Vite + React + TypeScript 配置
- motion-nextjs-client.tsx - 使用客户端组件包装器的 Next.js App Router 模式
- scroll-parallax.tsx - 滚动动画、视差效果和视口触发器
- ui-components.tsx - 使用共享下划线的模态框、手风琴、轮播图和标签页
- layout-transitions.tsx - FLIP 布局动画和共享元素过渡
将模板复制到项目中,并根据需要进行自定义。
参考资料
本技能包含 4 份全面的参考指南:
- motion-vs-auto-animate.md - 决策指南:何时使用 Motion,何时使用 AutoAnimate
- performance-optimization.md - 包体积、LazyMotion、虚拟化、硬件加速
- nextjs-integration.md - App Router 与 Pages Router、“use client”、已知问题
- common-patterns.md - 15 种常用模式及完整代码示例
详细指南请参阅 references/ 目录。
脚本
本技能包含 2 个自动化脚本:
- init-motion.sh - 一键设置并检测框架(Vite、Next.js、Cloudflare Workers)
- optimize-bundle.sh - 将现有 Motion 代码转换为 LazyMotion,以缩减包体积
自动化工具请参阅 scripts/ 目录。
官方文档
- 官方网站:https://motion.dev
- React 文档:https://motion.dev/docs/react
- GitHub:https://github.com/motiondivision/motion(30,200+ 星标)
- 示例:https://motion.dev/examples(300+ 个附带源代码的示例)
- npm 包:https://www.npmjs.com/package/motion
相关技能
- auto-animate - 用于简单的列表添加、删除和排序动画(3.28 KB,对比 34 KB)
- tailwind-v4-shadcn - 样式集成
- nextjs - Next.js App Router 模式
- cloudflare-worker-base - 部署(Motion 现已完全兼容)
对比:Motion 与 AutoAnimate
| 方面 | AutoAnimate | Motion |
|---|---|---|
| 包体积 | 3.28 KB | 2.3 KB(mini)- 34 KB(full) |
| 使用场景 | 简单的列表动画 | 复杂手势、滚动、布局 |
| API | 零配置,一行代码 | 声明式属性,较为冗长 |
| 设置 | 单个 ref | Motion 组件 + 属性 |
| 手势 | ❌ 不支持 | ✅ 拖动、悬停、轻触、平移 |
| 滚动动画 | ❌ 不支持 | ✅ 视差、与滚动关联 |
| 布局动画 | ❌ 不支持 | ✅ FLIP、共享元素 |
| SVG | ❌ 不支持 | ✅ 路径变形、线条绘制 |
| Cloudflare Workers | ✅ 完全支持 | ✅ 完全支持(2024 年 12 月已修复) |
| 无障碍 | ✅ 自动遵循 prefers-reduced-motion | ✅ 手动配置 MotionConfig |
经验法则:90% 的情况(列表动画)使用 AutoAnimate,10% 的情况(复杂交互)使用 Motion。
详细对比请参阅 references/motion-vs-auto-animate.md。
Token 效率指标
| 方案 | 使用的 Token | 遇到的错误 | 完成时间 |
|---|---|---|---|
| 手动设置 | ~30,000 | 3-5 个(AnimatePresence、Next.js、性能) | ~2-3 小时 |
| 使用此技能 | ~5,000 | 0 个 ✅ | ~20-30 分钟 |
| 节省 | ~83% | 100% | ~85% |
避免的错误:35 个已记录错误 = 100% 预防率
软件包版本(已于 2026-01-21 验证)
| 软件包 | 版本 | 状态 |
|---|---|---|
| motion | 12.27.5 | ✅ 最新稳定版 |
| framer-motion | 12.27.5 | ✅ 与 motion 版本相同 |
| react | 19.2.3 | ✅ 最新稳定版 |
| next | 16.1.1 | ✅ 最新稳定版 |
| vite | 7.3.1 | ✅ 最新稳定版 |
贡献
发现问题或有建议?
- 提交问题:https://github.com/jezweb/claude-skills/issues
- 查看模板和参考资料,了解详细示例
已通过生产环境测试:✅ React 19.2 + Next.js 16.1 + Vite 7.3 + Tailwind v4 Token 节省:~83% 错误预防:100%(避免了 35 个已记录错误) 包体积:2.3 KB(mini)- 34 KB(full),使用 LazyMotion 可优化至 4.6 KB 无障碍:MotionConfig reducedMotion 支持 上次验证:2026-01-21 | 技能版本:3.1.0 | 变更:新增 5 个 React 19/布局动画问题,更新至 Motion 12.27.5