@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
Markdown
# 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} />;
```