스킬 자체의 표현으로
Vue, Nuxt, Svelte, SvelteKit 컴포넌트에서 애니메이션을 적용하기 위한 공식 GSAP 가이드로, 프레임워크의 생명주기가 DOM 노드가 존재하는 시점을 결정합니다. 이 가이드는 에이전트에게 마운트 이후에만 — Vue에서는 onMounted, Svelte에서는 onMount — 컨테이너 ref를 두 번째 인자로 전달한 gsap.context(scope) 내부에서 트윈과 ScrollTrigger를 생성하도록 지시하여, .box와 같은 선택자가 해당 컴포넌트 안에서만 유효하도록 합니다.
언마운트 시 ctx.revert()가 애니메이션과 ScrollTrigger를 종료하고 인라인 스타일을 되돌립니다. 또한 ScrollTrigger를 한 번만 등록하고 SplitText와 같은 플러그인을 동적 임포트로 지연 로드하는 Nuxt 4 useGSAP 컴포저블, 그리고 레이아웃 변경 후 트리거 위치를 새로고침하는 방법도 다룹니다.
산출물
- context와 정리(cleanup) 패턴을 보여주는 실행 가능한 Vite + Vue 3 예제 프로젝트입니다.
- 컴포넌트에서 useGSAP()을 통해 사용되며, gsap 인스턴스와 지연 로딩 메서드를 노출하는 Nuxt 컴포저블입니다.
- 플러그인을 동적으로 임포트하여 gsap에 등록하고 반환하는 타입이 지정된 lazyLoadPlugin 헬퍼입니다.
작동 방식
- 01생성 전 DOM을 기다리기
트윈과 ScrollTrigger는 컨테이너 ref가 실제로 존재하도록 Vue에서는 onMounted, Svelte에서는 onMount를 사용하여 컴포넌트의 DOM이 사용 가능해진 후에만 생성됩니다.
- 02모든 것을 컴포넌트 루트 범위로 제한하기
전체 애니메이션 설정은 gsap.context(callback, scope)로 감싸며, 컨테이너 ref를 두 번째 인자로 전달하여 .item과 같은 선택자가 해당 서브트리 안에서만 해석되도록 합니다.
- 03프레임워크의 정리(teardown) 단계에서 되돌리기
각 예제는 context를 변수에 저장하고, Vue에서는 onUnmounted에서, Svelte에서는 onMount가 반환하는 정리 함수에서 ctx.revert()를 호출합니다.
- 04레이아웃 변경 후 새로고침하기
레이아웃이 안정된 후, 예를 들어 데이터 로드로 트리거 위치가 변경된 경우 ScrollTrigger 위치가 다시 계산됩니다.