프로젝트를 진행하면서 카카오지도API를 사용했다.
map을 불러오기위해 script를 useEffect안에 비동기로 가져오는 부분을 작성했다.
그러다가 Uncaught runtime errors를 마주했다.
Code
useEffect(() => {
const script = document.createElement('script');
script.src = `https://dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.REACT_APP_KAKAO_APP_KEY}&autoload=false`;
script.async = true;
document.head.appendChild(script);
script.onload = () => {
window.kakao.maps.load(() => {
const position = new window.kakao.maps.LatLng(
location.lat,
location.lng,
);
const options = {
center: position,
level: 3,
};
const marker = new window.kakao.maps.Marker({
position,
});
const map = window.kakao.maps.Map(mapContainer.current, options);
marker.setMap(map);
});
};
}, [location.lat, location.lng]);
Error
Uncaught runtime errors:
×
ERROR
Script error.
at handleError (http://localhost:3000/static/js/bundle.js:43828:58)
at http://localhost:3000/static/js/bundle.js:43847:7
ERROR
Script error.
at handleError (http://localhost:3000/static/js/bundle.js:43828:58)
at http://localhost:3000/static/js/bundle.js:43847:7
위 코드에서 무엇이 잘못됐을까?
우선 async=true만 사용해서 스크립트가 로드되자마자 실행이 된 것으로 보인다.
이 말은 DOM이 완전히 로드되지 않았을 때 실행될 가능성이 있었고 이에 따른 예외를 하나씩 처리해본다.
따라서 아래 해결방법을 적용했다.
useEffect(() => {
const script = document.createElement('script');
script.src = `https://dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.REACT_APP_KAKAO_APP_KEY}&autoload=false`;
script.async = true;
script.defer = true;
document.head.appendChild(script);
script.onload = () => {
if (window.kakao && window.kakao.maps) {
window.kakao.maps.load(() => {
const position = new window.kakao.maps.LatLng(
location.lat,
location.lng,
);
const options = {
center: position,
level: 3,
};
const map = new window.kakao.maps.Map(mapContainer.current, options);
const marker = new window.kakao.maps.Marker({
position,
});
marker.setMap(map);
});
}
};
// clean-up
return () => {
document.head.removeChild(script);
};
}, [location]);