UNPKG

@jurneyx2/react-lottie-hooks

Version:

🎯 Simple and powerful React hooks for DotLottie animations with GSAP ScrollTrigger integration and automatic SSR/CSR detection

343 lines (238 loc) β€’ 10.2 kB
# Changelog 이 ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  μ€‘μš”ν•œ 변경사항이 이 νŒŒμΌμ— λ¬Έμ„œν™”λ©λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” [Semantic Versioning](https://semver.org/spec/v2.0.0.html)을 λ”°λ¦…λ‹ˆλ‹€. # Changelog 이 ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  μ€‘μš”ν•œ 변경사항이 이 νŒŒμΌμ— λ¬Έμ„œν™”λ©λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” [Semantic Versioning](https://semver.org/spec/v2.0.0.html)을 λ”°λ¦…λ‹ˆλ‹€. ## [1.2.7] - 2025-07-02 ### πŸ”’ Security & Performance - **Source Map 제거**: ν”„λ‘œλ•μ…˜ λΉŒλ“œμ—μ„œ μ†ŒμŠ€λ§΅ λΉ„ν™œμ„±ν™”λ‘œ λ³΄μ•ˆ κ°•ν™” - **λ²ˆλ“€ 크기 μ΅œμ ν™”**: μ†ŒμŠ€λ§΅ 제거둜 배포 νŒ¨ν‚€μ§€ 크기 κ°μ†Œ - **μ†ŒμŠ€ μ½”λ“œ 보호**: 원본 μ†ŒμŠ€ μ½”λ“œκ°€ λΈŒλΌμš°μ €μ—μ„œ λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ κ°œμ„  ### πŸ“¦ Enhanced ESM Compatibility - **React Router v7 지원**: Framework modeμ—μ„œ μ™„λ²½ν•œ ESM ν˜Έν™˜μ„± - **GSAP ScrollTrigger μ΅œμ ν™”**: esbuild aliasλ₯Ό ν†΅ν•œ μžλ™ .js ν™•μž₯자 ν•΄κ²° - **λΉŒλ“œ μ‹œμ  ν•΄κ²°**: μ†ŒμŠ€ μ½”λ“œ λ³€κ²½ 없이 λ²ˆλ“€λ§ μ‹œ μžλ™ 경둜 λ³€ν™˜ ### πŸ› οΈ Technical Improvements - **tsup μ„€μ • μ΅œμ ν™”**: ESM ν™˜κ²½μ—μ„œ GSAP import 이슈 μ™„μ „ ν•΄κ²° - **ν•˜μœ„ ν˜Έν™˜μ„±**: κΈ°μ‘΄ CJS/ESM ν™˜κ²½ λͺ¨λ‘ 지원 μœ μ§€ - **νƒ€μž… μ•ˆμ „μ„±**: TypeScript νƒ€μž… μ •μ˜ 문제 ν•΄κ²° ## [1.2.6] - 2025-07-02 ### πŸ› Bug Fixes - **ES Module ν˜Έν™˜μ„±**: `gsap/dist/ScrollTrigger` β†’ `gsap/ScrollTrigger` import 경둜 μˆ˜μ • - **λͺ¨λ“ˆ ν•΄κ²° 문제**: ESM ν™˜κ²½μ—μ„œ GSAP ScrollTrigger κ°€μ Έμ˜€κΈ° 였λ₯˜ ν•΄κ²° - **λΉŒλ“œ μ΅œμ ν™”**: CommonJS와 ESM λͺ¨λ‘μ—μ„œ μ•ˆμ •μ μΈ λΉŒλ“œ 지원 ### 🌍 Internationalization - **μ™„μ „ν•œ λ‹€κ΅­μ–΄ 지원**: λͺ¨λ“  디버그 λ©”μ‹œμ§€κ°€ ν•œκ΅­μ–΄/μ˜μ–΄ 지원 - **μΌκ΄€λœ λ©”μ‹œμ§€ μ‹œμŠ€ν…œ**: ν•˜λ“œμ½”λ”©λœ μ˜μ–΄ λ©”μ‹œμ§€λ₯Ό `DEBUG_LANGUAGE` μ‹œμŠ€ν…œμœΌλ‘œ 톡합 - **μƒˆλ‘œμš΄ λ©”μ‹œμ§€ ν‚€**: - `initialFrameworkDetectionFailed` (ν”„λ ˆμž„μ›Œν¬ 감지 μ‹€νŒ¨) - `initialGSAPInitFailed` (GSAP μ΄ˆκΈ°ν™” μ‹€νŒ¨) ### πŸ”§ Technical Improvements - **ν‘œμ€€ν™”λœ 였λ₯˜ 처리**: ν”„λ ˆμž„μ›Œν¬ 감지 및 GSAP μ΄ˆκΈ°ν™” 였λ₯˜ λ©”μ‹œμ§€ ν‘œμ€€ν™” - **크둜슀 ν”Œλž«νΌ ν˜Έν™˜μ„±**: λ‹€μ–‘ν•œ λ²ˆλ“€λŸ¬(Vite, Webpack, esbuild λ“±)μ—μ„œ μ•ˆμ •μ  λ™μž‘ - **개발자 κ²½ν—˜ κ°œμ„ **: `debugLanguage` μ˜΅μ…˜μœΌλ‘œ μ„ ν˜Έν•˜λŠ” μ–Έμ–΄λ‘œ 디버그 λ©”μ‹œμ§€ 확인 κ°€λŠ₯ ## [1.2.5] - 2025-07-02 ### πŸ”§ Internal Improvements - **μ½”λ“œ λ¦¬νŒ©ν† λ§**: λ‚΄λΆ€ 둜직 μ΅œμ ν™” 및 μ•ˆμ •μ„± κ°œμ„  ## [1.2.4] - 2025-07-02 ### πŸ› Bug Fixes - **SSR μ•ˆμ „μ„±**: `__remixContext` μ ‘κ·Ό μ‹œ λ°œμƒν•˜λŠ” `useContext` 였λ₯˜ μˆ˜μ • - **ν”„λ ˆμž„μ›Œν¬ 감지**: DOM μ€€λΉ„ μƒνƒœλ₯Ό ν™•μΈν•˜μ—¬ 더 μ•ˆμ „ν•œ Remix/React Router 감지 - **μ΄ˆκΈ°ν™” μˆœμ„œ**: GSAP 및 ν”„λ ˆμž„μ›Œν¬ 감지 μ΄ˆκΈ°ν™” 였λ₯˜ 처리 κ°œμ„  - **λ©”λͺ¨λ¦¬ μ•ˆμ „μ„±**: try-catch 블둝 μΆ”κ°€ν•˜μ—¬ λΈŒλΌμš°μ € ν˜Έν™˜μ„± κ°œμ„  ### πŸ”§ Improvements - **μ—λŸ¬ 핸듀링**: ν”„λ ˆμž„μ›Œν¬ 감지 μ‹€νŒ¨ μ‹œ μ•ˆμ „ν•œ κΈ°λ³Έκ°’ λ°˜ν™˜ - **DOM 검사**: `document.readyState`λ₯Ό μ²΄ν¬ν•˜μ—¬ μ•ˆμ „ν•œ DOM μ ‘κ·Ό - **디버그 둜그**: ν”„λ ˆμž„μ›Œν¬ μž¬κ°μ§€ 상황에 λŒ€ν•œ 둜그 μΆ”κ°€ ## [1.2.3] - 2025-07-01 ### πŸ“š Documentation Enhancement - Add GIF. ## [1.2.2] - 2025-07-01 ### πŸ“š Documentation Update - **README Translation**: Complete translation from Korean to English - **API Documentation**: Enhanced English documentation with clearer examples - **Code Comments**: Improved code examples with English comments - **Professional Presentation**: International-ready documentation ### πŸ”§ Technical Improvements - Enhanced code examples for better understanding - Improved TypeScript documentation - Clearer API reference section ## [1.2.1] - 2025-07-01 ### πŸ“¦ νŒ¨ν‚€μ§€ 정보 μ—…λ°μ΄νŠΈ - **νŒ¨ν‚€μ§€λͺ… λ³€κ²½**: `@Imjurney/react-lottie-hooks` β†’ `@jurneyx2/react-lottie-hooks` - **λ¬Έμ„œ μ—…λ°μ΄νŠΈ**: λͺ¨λ“  README 및 예제 νŒŒμΌμ—μ„œ μƒˆλ‘œμš΄ νŒ¨ν‚€μ§€λͺ…μœΌλ‘œ μ—…λ°μ΄νŠΈ - **npm 재배포**: μƒˆλ‘œμš΄ νŒ¨ν‚€μ§€λͺ…μœΌλ‘œ npm λ ˆμ§€μŠ€νŠΈλ¦¬μ— 배포 ### πŸ”§ 기술적 κ°œμ„  - νŒ¨ν‚€μ§€ 메타데이터 일관성 확보 - λͺ¨λ“  예제 ν”„λ‘œμ νŠΈμ˜ import ꡬ문 μ—…λ°μ΄νŠΈ - μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ„€μ • μ΅œμ ν™” ## [1.2.0] - 2025-07-01 (μ΅œμ’… 버전) ### πŸš€ μ£Όμš” 변경사항 #### DotLottie μ „μš© μ΅œμ ν™” - **BREAKING**: `mode` μ˜΅μ…˜ 제거 - 이제 DotLottie만 지원 - **BREAKING**: `animationData`, `path`, `renderer` λ“± lottie-web μ „μš© μ˜΅μ…˜ 제거 - **BREAKING**: `lottie-web` μ˜μ‘΄μ„± μ™„μ „ 제거 - **κ°„μ†Œν™”**: APIκ°€ 훨씬 κ°„λ‹¨ν•˜κ³  μ§κ΄€μ μœΌλ‘œ λ³€κ²½ #### μƒˆλ‘œμš΄ API ꡬ쑰 ```tsx // Before (v1.1.x) const hook = useLottieScrollTrigger({ mode: "dotlottie", // 더이상 ν•„μš”ν•˜μ§€ μ•ŠμŒ animationData: data, // 제거됨 path: "/animation.json", // 제거됨 renderer: "svg", // 제거됨 }); // After (v1.2.x) - μ΅œμ’… 버전 const hook = useLottieScrollTrigger({ // κ°„λ‹¨ν•œ ScrollTrigger μ˜΅μ…˜λ§Œ ν•„μš” start: "top center", end: "bottom center", debug: true, }); ``` ### ✨ κ°œμ„ μ‚¬ν•­ - **μ„±λŠ₯ ν–₯상**: 단일 라이브러리 μ§€μ›μœΌλ‘œ λ²ˆλ“€ 크기 λŒ€ν­ κ°μ†Œ - **μœ μ§€λ³΄μˆ˜μ„±**: λ³΅μž‘ν•œ ν•˜μ΄λΈŒλ¦¬λ“œ 둜직 제거둜 μ½”λ“œ μ•ˆμ •μ„± ν–₯상 - **개발자 κ²½ν—˜**: 더 κ°„λ‹¨ν•˜κ³  직관적인 API - **νƒ€μž… μ•ˆμ „μ„±**: DotLottie μ „μš© νƒ€μž…μœΌλ‘œ 더 μ •ν™•ν•œ νƒ€μž… 지원 ### πŸ”§ μƒˆλ‘œμš΄ κΈ°λŠ₯ - **ν–₯μƒλœ 디버깅**: 더 λͺ…ν™•ν•œ μ—λŸ¬ λ©”μ‹œμ§€μ™€ 디버그 정보 - **κ°œμ„ λœ SSR 지원**: Next.js, Remix, React Routerμ—μ„œ μ•ˆμ •μ μΈ λ™μž‘ - **μ΅œμ ν™”λœ 이벀트 핸듀링**: DotLottie μ „μš©μœΌλ‘œ μ΅œμ ν™”λœ 이벀트 처리 - **4κ°€μ§€ ν”„λ ˆμž„μ›Œν¬ 예제**: Next.js, Vite, Remix, React Router μ™„μ „ 지원 ### πŸ“ 지원 ν”„λ ˆμž„μ›Œν¬ - βœ… **Next.js**: App Router 지원, SSR μ•ˆμ „ - βœ… **Vite**: λΉ λ₯Έ 개발 ν™˜κ²½, HMR 지원 - βœ… **Remix**: μ΅œμ‹  μ›Ή ν‘œμ€€, SSR/CSR ν˜Έν™˜ - βœ… **React Router**: 파일 기반 λΌμš°νŒ…, v7 지원 ### πŸ“¦ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ°€μ΄λ“œ 1. **lottie-web μ˜μ‘΄μ„± 제거**: ```bash pnpm remove lottie-web @types/lottie-web ``` 2. **DotLottie/λ˜λŠ” JSON 파일 μ€€λΉ„** 3. **μ½”λ“œ μ—…λ°μ΄νŠΈ**: ```tsx // Old (v1.1.x) const hook = useLottieScrollTrigger({ mode: "lottie-web", animationData: jsonData, }); // New (v1.2.x) - μ΅œμ’… 버전 const hook = useLottieScrollTrigger({ start: "top center", end: "bottom center", }); <DotLottieReact src="/animation.lottie" dotLottieRefCallback={hook.handleDotLottieRef} autoplay={false} loop={true} />; or <DotLottieReact data={/* json파일 */} dotLottieRefCallback={hook.handleDotLottieRef} autoplay={false} loop={true} />; ``` ### 🎯 μ„±λŠ₯ μ΅œμ ν™” - **React State 좔적 λΉ„ν™œμ„±ν™”**: κΈ°λ³Έκ°’μœΌλ‘œ μ„±λŠ₯ μš°μ„  - **λ©”λͺ¨μ΄μ œμ΄μ…˜**: λΆˆν•„μš”ν•œ λ¦¬λžœλ”λ§ λ°©μ§€ - **λ””λ°”μš΄μ‹±**: 이벀트 ν•Έλ“€λŸ¬ μ΅œμ ν™” - **μ½”λ“œ λΆ„ν• **: 각 ν”„λ ˆμž„μ›Œν¬λ³„ μ΅œμ ν™”λœ λ²ˆλ“€λ§ ### 🎨 μŠ€νƒ€μΌλ§ λͺ¨λ“  μ˜ˆμ œμ—μ„œ **Tailwind CSS**λ₯Ό μ‚¬μš© ### οΏ½ λ¬Έμ„œν™” - **μ™„μ „ν•œ 예제**: 4κ°€μ§€ ν”„λ ˆμž„μ›Œν¬λ³„ μ‹€μ œ κ΅¬ν˜„ - **μƒμ„Έν•œ README**: 각 ν”„λ ˆμž„μ›Œν¬λ³„ μ„€μ • κ°€μ΄λ“œ - **νƒ€μž… μ•ˆμ „μ„±**: TypeScript μ™„μ „ 지원 - **μ‹€μ „ 팁**: ν”„λ‘œλ•μ…˜ ν™˜κ²½ μ΅œμ ν™” 방법 --- ## [1.1.x] - 이전 버전 (지원 쀑단) ### ⚠️ 지원 쀑단 μ•ˆλ‚΄ v1.1.x μ΄ν•˜ 버전듀은 더 이상 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. **v1.2.0 (μ΅œμ’… 버전)**으둜 μ—…κ·Έλ ˆμ΄λ“œν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. ### 이전 κΈ°λŠ₯λ“€ - ν•˜μ΄λΈŒλ¦¬λ“œ λͺ¨λ“œ 지원 (DotLottie + lottie-web) - μžλ™ λͺ¨λ“œ 감지 - λ³΅μž‘ν•œ API ꡬ쑰 **더 이상 μœ μ§€λ³΄μˆ˜λ˜μ§€ μ•ŠμœΌλ‹ˆ v1.2.0을 μ‚¬μš©ν•΄μ£Όμ„Έμš”.** ### ⚠️ 지원 쀑단 μ•ˆλ‚΄ v2.xλŠ” 더 이상 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. v3.x둜 μ—…κ·Έλ ˆμ΄λ“œν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. ### 이전 κΈ°λŠ₯λ“€ (v2.x) - ν•˜μ΄λΈŒλ¦¬λ“œ λͺ¨λ“œ 지원 (DotLottie + lottie-web) - μžλ™ λͺ¨λ“œ 감지 - 톡합 API λ“± μžμ„Έν•œ λ‚΄μš©μ€ Git νžˆμŠ€ν† λ¦¬λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. ```tsx // animationDataλ‚˜ pathκ°€ 있으면 μžλ™μœΌλ‘œ lottie-web 선택 const hook = useLottieScrollTrigger({ path: "/animation.json", // 이 μ˜΅μ…˜ λ•Œλ¬Έμ— μžλ™μœΌλ‘œ lottie-web λͺ¨λ“œ }); // μœ„ μ˜΅μ…˜λ“€μ΄ μ—†μœΌλ©΄ μžλ™μœΌλ‘œ DotLottie 선택 (ꢌμž₯) const hook = useLottieScrollTrigger({ // mode μƒλž΅ μ‹œ μžλ™μœΌλ‘œ DotLottie λͺ¨λ“œ 선택 }); ``` ### πŸ”§ Breaking Changes #### v1.xμ—μ„œ v2.x λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ **1. λͺ¨λ“œλ³„ 콜백 β†’ 톡합 콜백** ```tsx // v1.x (λͺ¨λ“œλ³„ 콜백) const hook = useLottieScrollTrigger({ onDotLottieEnter: (dotLottie) => { /* ... */ }, onLottieWebEnter: (animation) => { /* ... */ }, }); // v2.x (톡합 콜백) const hook = useLottieScrollTrigger({ onEnter: (instance) => { /* DotLottie λ˜λŠ” AnimationItem */ }, }); ``` ### 🎯 ν™•μž₯μ„± κ°œμ„ μ‚¬ν•­ #### μ½”λ“œ μœ μ§€λ³΄μˆ˜μ„± - **단일 μ±…μž„ 원칙**: 각 λͺ¨λ“œλŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ - **μ˜μ‘΄μ„± μ—­μ „**: μΈν„°νŽ˜μ΄μŠ€ 기반 μ„€κ³„λ‘œ μƒˆλ‘œμš΄ μ• λ‹ˆλ©”μ΄μ…˜ 라이브러리 μΆ”κ°€ 용이 - **μ „λž΅ νŒ¨ν„΄**: λŸ°νƒ€μž„μ— 졜적의 μ „λž΅ 선택 #### λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ°€μ΄λ“œ **v1.1.xμ—μ„œ v1.2.x둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜**: 1. **μ˜μ‘΄μ„± λ³€κ²½**: ```bash # lottie-web 제거 npm uninstall lottie-web @types/lottie-web # DotLottie만 μ‚¬μš© npm install @lottiefiles/dotlottie-react ``` 2. **μ½”λ“œ λ³€κ²½**: ```tsx // Before const hook = useLottieScrollTrigger({ mode: "dotlottie", // 제거 // ... 기타 lottie-web μ˜΅μ…˜λ“€ 제거 }); // After const hook = useLottieScrollTrigger({ // DotLottie μ „μš© μ˜΅μ…˜λ§Œ μ‚¬μš© start: "top center", end: "bottom center", }); ``` 3. **μ»΄ν¬λ„ŒνŠΈ λ³€κ²½**: ```tsx // Before: mode별 λΆ„κΈ° 처리 { hook.mode === "dotlottie" && ( <DotLottieReact dotLottieRefCallback={hook.handleDotLottieRef} /> ); } // After: κ°„λ‹¨ν•œ μ‚¬μš© <DotLottieReact dotLottieRefCallback={hook.handleDotLottieRef} />; ```