지난 번에 Vue 에서 Lottie 사용하는 방법을 정리했는데,
이제는 React + Next 기반 프로젝트를 하고 있어서 다시금 Lottie 정리 !
🚨 next 의 ssr 렌더링 때문에 document is not defined 이슈 발생
⇒ dynamic import 로 대체
(이미 next 사용자에겐 나름 익숙하기 때문에 next/dynamic 에 대한 설명은 생략)
단, lazy-loading 관련 next 공식 문서를 참고용으로 첨부
https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading
Optimizing: Lazy Loading | Next.js
Lazy load imported libraries and React Components to improve your application's overall loading performance.
nextjs.org
1. 일단 Lottie 를 그냥 사용할 수는 없고 라이브러리를 필수로 받긴 해야한다. 라이브러리 선택은 본인의 몫
나의 경우 이전부터 쓰던 lottie-web 을 선택했다.
https://www.npmjs.com/package/lottie-web
lottie-web
After Effects plugin for exporting animations to SVG + JavaScript or canvas + JavaScript. Latest version: 5.12.2, last published: a year ago. Start using lottie-web in your project by running `npm i lottie-web`. There are 836 other projects in the npm regi
www.npmjs.com
2. Lottie.tsx
여러 기능들은 일단 제외하고 기본 기능만 갖고 있는 Lottie 용 컴포넌트 작성
import React, { useState, useRef, useEffect } from "react";
import Lottie from "lottie-web";
// Lottie 컴포넌트 정의
const LottieComponent = ({
animationData,
...restProps
}) => {
// Lottie 애니메이션 컨테이너에 대한 ref
const animationContainer = useRef<any>(null);
const [animationInstance, setAnimationInstance] = useState<any>(null);
useEffect(() => {
const animationOptions = {
container: animationContainer.current,
renderer: "svg",
loop: true,
autoplay: true,
animationData: animationData,
rendererSettings: {
preserveAspectRatio: "xMidYMid slice",
},
} as any;
// Lottie 애니메이션 로드
const animation = Lottie.loadAnimation(animationOptions);
// Lottie 애니메이션 상태 업데이트
setAnimationInstance(animation);
// 컴포넌트 unmount 시 애니메이션 제거
return () => {
animation.destroy();
};
}, [animationData]);
return <div ref={animationContainer} {...restProps} />;
};
export default LottieComponent;
3. Lottie 를 사용하고자 하는 컴포넌트에 dynamic import 를 사용해서 이전에 만들어둔 Lottie 컴포넌트를 데려온다.
그냥 import 를 하면 위에서 언급한 것처럼 runtime 오류가 나는데, 나의 경우 오류는 아래와 같았다.
(next 14 + app router 에서는 그냥 잘 보이긴 한다 화면 상으로는,, 빌드 시 위의 에러 발생)
아무쪼록 에러가 안 보이는 편이 낫기 때문에 ssr 을 false 로 설정할 수 있는 dynamic import 로 Lottie 를 데려와서,
'use client';
import dynamic from "next/dynamic";
import lottieTest from '../../../public/assets/lottie/lottieTest.json';
export default function Test() {
const Lottie = dynamic(() => import('../../util/common/Lottie'), {ssr: false});
return (
<main>
<div className='w-72'>
<Lottie animationData={lottieTest} />
</div>
</main>
)
}
위와 같이 적용하고자 하는 lottie json 파일을 넣어주면 된다. 끗 - ! 😊
** References
https://velog.io/@smurf_/내가-답답해서-적어두는-리액트에서-쓰는-Lottie-Web
내가 답답해서 적어두는 리액트에서 쓰는 Lottie-Web
react-lottie 패키지는 react 18을 지원을 안한다.그래서 구글링후 lottie-react 받아 설치하니, 인터랙션이 작동을 안한다.그래서 찾고찾아 찾은 lottie-web 패키지.이건 <Lottie> 컴포넌트를 바로지원하지않
velog.io
'TIL' 카테고리의 다른 글
Npm Private Package (0) | 2024.11.28 |
---|---|
Vue 에서 provider 사용하기 (0) | 2023.12.04 |
User 정보 상태관리 (0) | 2023.12.04 |
Lottie 적용하기 (1) | 2023.11.28 |
Typescript 에서 new Date 사용하기 (1) | 2023.11.28 |
댓글