1实现原理 · 为什么它能做到
先给跨框架统一三原则(DOM 就绪后创建 / 卸载时 kill-revert / 选择器限定组件根),再落到各框架语法。
- **Scope selectors** to the component root so `.box` and similar only match elements inside that component, not the rest of the page.
Vue 3 给两套等价写法(Options API 的 setup() 与 <script setup>),并指向可运行的示例工程做交叉验证。
See `examples/vue/` for a runnable Vite + Vue 3 project demonstrating these patterns.
Nuxt 4 给出可复用 composable 模式:集中注册常用插件 + 用动态 import 映射表懒加载重插件。
Use a **reusable composable** to register GSAP Plugins and also to lazy load Plugins that are not extensively used in your application:
Svelte 用 onMount + 返回清理函数:bind:this 拿根元素,return () => ctx.revert() 完成销毁。
const ctx = gsap.context(() => {
把 React 明确排除并指回 gsap-react,避免两套清理机制在同一仓库并存造成混乱。
For **React** specifically, use **gsap-react** (useGSAP hook, gsap.context()).
给出生命周期动作对照表,把「什么时候创建、什么时候清」做成可查表。
| **Unmount / Destroy** | Call **ctx.revert()** so all animations and ScrollTriggers in that context are killed and inline styles reverted. |
框架内 ScrollTrigger 的刷新时机被绑定到框架的 DOM 更新原语:Vue 用 nextTick、Svelte 用 tick 或等异步内容加载完。
Call **ScrollTrigger.refresh()** after layout changes (e.g. after data loads) that affect trigger positions; in Vue/Svelte that often means after the DOM updates (e.g. nextTick in Vue, tick in Svelte, or after async content load).
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | gsap(核心 + 各插件子路径) |
| package | Nuxt / Vue / Svelte(示例工程的宿主框架,动态 import 的映射目标) |
4风险提醒 风险提醒:绿色 · 放心使用
- 非 React 框架没有统一 hook,清理仍靠手写 — onUnmounted/onMount 里的 ctx?.revert() 需开发者记得写;漏写就会出现我们预期外的残留实例(skill 只能以 Do Not 提示)。
- 动态 import 会改变打包结构 — lazyLoadPlugin 会创建独立 chunk;若配置不当可能与框架的 SSR/预渲染或构建优化(如 Nuxt 的自动导入)产生摩擦,需按项目实测。
- SSR 环境易踩空 DOM — Nuxt 等 SSR 框架若把 GSAP 调用放在渲染期(而非 onMounted)会报错;skill 已用「Mounted 后创建」约束,但需严格遵守。
- 示例工程含各框架版本约束 — examples 里的 nuxt ^4.4.2 / vue ^3.5.32 等版本组合是示范性的;换版本后部分模式(如 Svelte 5 生命周期)需按官方迁移指南调整。
5第二遍独立确认
- [ok] 目录资产面:仅 SKILL.md — skills/gsap-frameworks/ 下唯一文件 SKILL.md(10,621 B);无 scripts/、references/;URL 扫描 0 条。
- [ok] external_deps 逐条核实 — import("gsap/CustomEase") 等动态 import 映射在文件内逐字存在(pluginMap 共 24 项);Nuxt/Vue/Svelte 依赖来自 examples/nuxt/package.json("nuxt": "^4.4.2")等示例工程,非 skill 自带。
- [ok] Nuxt composable 代码是否与 examples 一致 — examples/nuxt/app/composables/useGSAP.ts 与 SKILL.md 中的 useGSAP.ts 代码块结构一致(PLUGINS 常量、pluginMap、lazyLoadPlugin 泛型、registerPlugin(ScrollTrigger)),可运行验证。
- [ok] Vue/Svelte 写法是否与官方生命周期语义相符 — Vue 用 onMounted/onUnmounted、Svelte 用 onMount 返回值做清理,均为官方推荐的对应钩子;ctx?.revert() 的可选链也避免容器为空时报错。
- [ok] 安全反例搜索 — token 扫描:curl/wget/fetch(/XMLHttpRequest/exec(/child_process/process.env/.env/API_KEY/secret 零命中;无 URL、无脚本文件。
- [ok] 与 gsap-react 的分工是否重复 — 本文件首段即声明 React 走 gsap-react,并在 Learn More 再次指向;gsap-react 亦声明 Vue/Svelte 走本 skill,互不重叠。
- [ok] 元数据与 pin — frontmatter license: MIT;HEAD = aed9cfd3277740755f6bfc1155c7aa645403b760;GitHub API stars 15326 / pushed_at 2026-07-29T17:36:08Z。
- [ok] 「lazyLoadPlugin 减少初始包体」是否属实 — pluginMap 用 () => import() 动态导入,仅在调用时拉取并 registerPlugin,确为按需加载模式;原文亦给出用途限定「not widely used in your app」。
6结论
8c31c95c46ec9b9f…aed9cfd327