react-dom/server
의 renderToStaticMarkup() 메소드는 server side (node 위에서 동작) 환경이 아니어도 정적 HTML을 만드는데 사용할 수 있다지난 포스팅에서 react-dom/server
를 사용해서 string으로 element를 사용하는 것 대신 react component를 사용해보았다
이번엔 react-dom/server
가 무엇인지 알아보자
지난 포스팅에서 swiper 라이브러리에서 커스텀 페이지네이션을 구현하는데 사용했었다
사실 개발 환경이 Next.js이었고 Next.js자체로 노드 서버이기도 하기 때문에 사용할 수 있었던 것은 아닐까 하는 생각이 들었다
그래서 react 클라이언트 환경에서 사용 후 빌드 후 nginx에서 띄워보고 실행되는지 확인해보자
근데 만약 된다면 현재 내 컴퓨터에 node가 설치돼서 되는 것일 수도 있으니 node가 없는 도커환경에서도 띄워보자
brew info nginx를 하면 brew로 설치한 nginx에 대한 정보를 확인할 수 있다
해당 경로에 빌드파일들을 풀어서 올려놓았다
확인 결과 커스텀 ReactDOMServer를 이용한 페이지네이션 버튼(bullet)은 잘 적용되었다
아마 내 컴퓨터에 node가 설치되어 있어서 된 것 같다는 생각이든다
그런데 문제가 있었다 ReactDOMServer.renderToStaticMarkup() 으로 렌더링한 HTML은 onClick 같은 이벤트 핸들러 prop으로 전달한 콜백함수들이 동작하지 않았다
const SwiperPageButton = styled.button`
background-color: orange;
padding: 10px;
`;
// ...
useEffect(() => {
const bullets = document.querySelectorAll(".bullet-test");
bullets.forEach((bullet) => {
bullet.addEventListener("click", () => {
// not working
console.log("bullet clicked by addEventListener");
});
});
return () => {
bullets.forEach((bullet) => {
bullet.removeEventListener("click", () => {
// not working
console.log("bullet clicked by addEventListener");
});
});
};
}, []);
return (
<Swiper
modules={[Pagination, Navigation]}
loop
pagination={{
dynamicBullets: true,
clickable: true,
renderBullet: (index, className) => {
return ReactDOMServer.renderToStaticMarkup(
<SwiperPageButton
type="button"
className={`${className} bullet-test`}
onClick={() => {
// not working
console.log("bullet clicked", index);
}}
>
{index}
</SwiperPageButton>
);
},
}}
// ...
/>
);
nginx만 설치된 도커 이미지를 받자
받은 이미지 확인
nginx 서버 띄우기
실행 확인
브라우저에서 확인
마운팅하기(볼륨 설정)
아까 내 로컬 nginx 위치로 마운팅해보자(/opt/homebrew/var/www)
그 전에 내가 실행한 nginx 도커 컨테이너의 nginx 배포 파일 경로를 확인해보자
컨테이너id
/bin/bash마운팅 경로 설정을 해주자 /opt/homebrew/var/www:/usr/share/nginx/html
기존 컨테이너 스탑
볼륨 설정 후 재실행
에러나서 빌드파일 복사하고 경로 바꿈
docker: Error response from daemon: Mounts denied:
The path /opt/homebrew/var/www is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/desktop/mac for more info.
/Users/gotaehwan/projects/temp:/usr/share/nginx/html
docker run --name nginx-server -d -p 8081:80 -v /Users/gotaehwan/projects/temp:/usr/share/nginx/html nginx