結論
Next.jsのDynamic importを使おう!
解決した例
@react-google-maps/apiというReactのライブラリを用いてGoogle Map上にルート (Polyline) を表示したかった... のだが、地図自体は表示されるけどそのchildrenに指定したPolylineやその他 Polygon, Marker などが一切表示されなかった... イライラ...
// pages/index.jsx import { GoogleMap, Polyline, useJsApiLoader } from '@react-google-maps/api' const Home = () => { /* 本題と関係ないところは省略 */ return ( <> {isLoaded && ( <GoogleMap mapContainerStyle={{ height: '400px', width: '800px' }} zoom={2} onLoad={onLoad} onUnmount={onUnmount} > <Polyline path={path} options={options} /> </GoogleMap> )} </> ) } export default Home
ここで、試しに素のReactでやってみた
おい!フツーに表示されるじゃあないか!
window is not definedとかいつものNext.jsのSSR由来のエラーは表示されていなかったから気づけなかった
色々試行錯誤した末、Dynamic importにたどり着いた
// components/googlemap/DynamicPolyline.jsx import { Polyline } from '@react-google-maps/api' const DynamicPolyline = ({ path, options }) => { return <Polyline path={path} options={options} /> } export default DynamicPolyline
// pages/index.jsx import dynamic from 'next/dynamic' const DynamicPolyline = dynamic(() => import('components/googlemap/DynamicPolyline')) /* あとはPolylineをDynamicPolylineに置き換えるだけ */
これでちゃんと動くようになった、めでたしめでたし👏
疑問点
このあとわざわざ自前のコンポーネントにしなくてよくね?と思って下のコードにしてみたけど無理でした... なんでだろう...
const DynamicPolyline = dynamic(() => import('@react-google-maps/api').then((mod) => mod.Polyline) )