mason
mason-log.

masoneffect NPM Update.(ver2)

mason

masonfe-hyunsu

😠 1. 개요 : 업데이트 계기.

지쳤나요
  • masoneffect NPM 패키지를 개발한 이후, 오픈소스 라이브러리인 React Bits 패키지에 Masoneffect 컴포넌트를 기여해보려는 시도가 있었다. 하지만 여러 이유로 인해 결과적으로는 기여까지 이어지지 못했다 🥲 (지난 포스팅 참고)

  • 시간을 들여 준비했던 만큼 아쉬움도 있었고, 이 경험을 계기로 외부 패키지에 기여하는 방향보다는 masoneffect 자체를 확장해보는 쪽을 고민하게 됐다.

  • masoneffect를 단일 효과 라이브러리에 머무르게 하기보다는, 실제 프로젝트에서 자주 쓰는 애니메이션들을 하나로 묶은 멀티 애니메이션 패키지로 발전시키는 것이 더 의미 있겠다는 판단이 들었다.

  • 그렇게 시작한 masoneffect v2.0은 단순한 기능 추가라기보다는, 방향성이 변경된 업데이트라고 볼 수 있다.


🔨 2. 재설계 : 주요 변경 사항.

패키지 구조 변화.

진화
  • masoneffect v2.0에서 가장 큰 변화는 패키지 구조 자체가 달라졌다는 점이다.

  • v1.x에서는 TextToParticle 하나의 효과만 제공하는 단일 효과 라이브러리였다면, v2.x부터는 여러 애니메이션 효과를 독립적인 단위로 묶은 멀티 애니메이션 패키지 구조로 변경되었다.

[ v1.x 구조 ]
masoneffect/
  └── TextToParticle (단일 효과)

[ v2.x 구조 ]
masoneffect/
  ├── TextToParticle (기존 효과 유지)
  ├── Typing (신규)
  ├── Count (신규)
  ├── ScrollFadeIn (신규)
  └── ... (지속 추가 예정)
  • 효과는 앞으로도 계속 추가될 예정이지만, 각 효과를 독립적인 모듈 단위로 분리하고 Tree Shaking이 가능한 구조로 설계해, 실제로 사용하는 효과만 번들에 포함되도록 관리할 계획이다.


🎛️ 3. 신규 효과 : 애니메이션 확장.

(1) Count (카운팅 효과)

  • Number type의 시작값에서 목표값까지 부드럽게 증가하는 애니메이션.

주요 특징.

  • 시작값/목표값 설정.

  • 애니메이션 지속 시간 조절. (duration)

  • 기타 이징 함수 지원.

  • 실시간 값 조회 가능.

사용 예시. (react)

import Count from 'masoneffect/react/count';

<Count startValue={0} targetValue={1000} duration={2000} easing={easingFunctions.easeOutCubic} />;

(2) Typing (타이핑 효과)

  • 텍스트가 한 글자씩 타이핑되는 것처럼 표시되는 애니메이션.

주요 특징.

  • 타이핑 속도 조절 가능 (speed)

  • 시작 지연 시간 설정 (delay)

  • 반복 재생 옵션 (loop)

사용 예시. (react)

import Typing from 'masoneffect/react/typing';

<Typing text="Hello World" speed={100} delay={500} loop={false} />;

(3) ScrollFadeIn (스크롤 페이드인 효과)

  • 스크롤 시 요소가 화면에 나타나면서 페이드인되는 애니메이션.

주요 특징.

  • IntersectionObserver 기반.

  • 스크롤 위치 기반 트리거.

  • 페이드 지속 시간 조절.

사용 예시. (react)

import ScrollFadeIn from 'masoneffect/react/scrollFadeIn';

<ScrollFadeIn duration={1000} threshold={0.1} triggerOnce={true}>
  <YourContent />
</ScrollFadeIn>;

🌳 4. Version 2의 주요 장점.

(1) Tree Shaking 지원.

  • 필요한 효과만 선택적으로 import하여 번들 크기를 최소화.

// 사용하는 효과만 번들에 포함. (ex. TextToParticle)
import { TextToParticle } from 'masoneffect/textToParticle';
import { Count } from 'masoneffect/count';
  • 개별 export 경로: 각 효과가 독립적인 경로로 제공되어 번들러가 정확히 필요한 코드만 포함.

  • 자동 최적화: Webpack, Vite, Rollup처럼 ESM과 tree-shaking을 지원하는 번들러에서 미사용 효과를 제거하기 쉬운 구조.

  • 작은 번들 크기: 전체 패키지를 설치해도 실제 사용하는 효과만 번들에 포함.


(2) 렌더링 최적화.

  • 성능을 고려한 최적화 로직 적용.

  • IntersectionObserver 활용: 요소가 뷰포트에 보일 때만 애니메이션 실행.

  • Page Visibility API: 브라우저 탭이 숨겨지면 자동으로 애니메이션 일시정지.

  • requestAnimationFrame: requestAnimationFrame 기반 재생으로 부드러운 프레임 전환을 목표로 함.

  • ResizeObserver: 컨테이너 크기 변경 시 자동 리사이징.

  • Debouncing: 리사이즈, 업데이트 등 빈번한 이벤트 최적화.


(3) 의존성 없는 패키지.

  • 프레임워크 의존성 없이 순수 JavaScript로 구현된 핵심 로직.

  • Zero Runtime Dependencies: 외부 라이브러리 의존성 없음.

  • 경량 패키지: 불필요한 의존성으로 인한 번들 크기 증가 방지.

  • 안정성: 의존성 업데이트로 인한 breaking change 걱정 없음.


(4) 범용 호환성.

  • React, Vue, Svelte, Vanilla JavaScript 모든 환경에서 동일한 API로 사용 가능.

// React
import TextToParticle from 'masoneffect/react/textToParticle';

// Vue
import TextToParticle from 'masoneffect/vue/textToParticle';

// Svelte
import TextToParticle from 'masoneffect/svelte/textToParticle';

// Vanilla JS
import { TextToParticle } from 'masoneffect/textToParticle';
  • 프레임워크별 래퍼 제공: 각 프레임워크의 관례에 맞는 컴포넌트 제공.

  • 일관된 API: 프레임워크를 바꿔도 동일한 옵션과 메서드 사용.

  • 타입 안정성: TypeScript로 모든 프레임워크에서 완전한 타입 지원.

  • 유연한 마이그레이션: 프로젝트 프레임워크 변경 시 코드 수정 최소화.


(5) AI 기반 지원.

  • llms.txt

    • AI 에이전트가 프로젝트 구조와 사용 환경을 자동으로 파악할 수 있도록 최소한의 가이드를 제공한다.

    • 이를 통해 React, Vue, Svelte, Vanilla 등 사용 중인 환경에 맞는 설정과 예제 코드를 보다 정확하게 안내받을 수 있도록 했다.

  • context7.json 메타데이터.

    • masoneffect의 패키지 구조, 제공되는 효과, 프레임워크별 진입 경로 등을 구조화된 메타데이터 형태로 정리했다.

    • AI 에이전트가 라이브러리를 더 잘 이해하고, 상황에 맞는 효과를 추천하거나 적절한 사용 예시를 제시하는 데에 도움을 주는 역할을 한다.


✍️ 5. 마무리 : 회고.

가보자고
  • masoneffect v2.0은 단순히 효과 몇 개를 추가한 업데이트라기보다는, 이 라이브러리를 어떤 방식으로 운영해 나갈지 방향성을 정리한 업데이트가 되었다고 생각한다.

  • 아직 부족하고 보완해야 할 부분도 많지만, 급하게 확장하기보다는 천천히 꼼꼼하게 다듬어갈 예정이다.

  • 앞으로는 개수를 채우기보다 실제 사용 과정에서 의미가 확인된 효과를 중심으로 추가할 생각이다.


🔗 6. 프로젝트 링크.

이전 글
React Bits에 MasonEffect를 제안하며 배운 것.

댓글

불러오는 중...
목록으로