You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js Pages Router如何仅在客户端导入Google Maps组件库代码?

解决Next.js中@googlemaps/extended-component-library的"document is not defined"错误

出现这个错误的核心原因是:Next.js默认的服务端渲染(SSR)环境中不存在浏览器的document对象,而@googlemaps/extended-component-library依赖浏览器环境运行。以下是几种无需使用@googlemaps/extended-component-library/react的客户端导入方案:

方案1:Next.js动态导入(推荐)

利用next/dynamic实现组件级别的禁用SSR,确保地图相关代码仅在客户端加载:

// 页面文件(如pages/map.js)
import dynamic from 'next/dynamic';

// 动态导入地图组件,禁用SSR
const GoogleMapsContainer = dynamic(() => import('../components/GoogleMaps'), {
  ssr: false,
  loading: () => <div>加载地图中...</div>
});

export default function MapPage() {
  return <GoogleMapsContainer />;
}

在单独的地图组件文件中正常导入库:

// components/GoogleMaps.js
import { Map } from '@googlemaps/extended-component-library';

export default function GoogleMaps() {
  return (
    <div style={{ height: '500px', width: '100%' }}>
      <Map 
        apiKey="你的Google Maps API密钥"
        center={{ lat: 39.9042, lng: 116.4074 }}
        zoom={12}
      />
    </div>
  );
}

方案2:useEffect延迟导入

通过useEffect钩子在客户端渲染完成后再导入库,避免服务端执行相关代码:

import { useEffect, useState } from 'react';

export default function GoogleMaps() {
  const [MapComponent, setMapComponent] = useState(null);

  useEffect(() => {
    // 仅在客户端异步导入地图组件
    const loadMapLibrary = async () => {
      const { Map } = await import('@googlemaps/extended-component-library');
      setMapComponent(Map);
    };

    loadMapLibrary();
  }, []);

  if (!MapComponent) return <div>加载地图中...</div>;

  return (
    <div style={{ height: '500px', width: '100%' }}>
      <MapComponent 
        apiKey="你的Google Maps API密钥"
        center={{ lat: 39.9042, lng: 116.4074 }}
        zoom={12}
      />
    </div>
  );
}

方案3:条件判断环境导入

通过检查window对象是否存在,确保仅在客户端环境导入库:

// 仅在浏览器环境中导入地图组件
let Map;
if (typeof window !== 'undefined') {
  Map = require('@googlemaps/extended-component-library').Map;
}

export default function GoogleMaps() {
  if (!Map) return <div>加载地图中...</div>;

  return (
    <div style={{ height: '500px', width: '100%' }}>
      <Map 
        apiKey="你的Google Maps API密钥"
        center={{ lat: 39.9042, lng: 116.4074 }}
        zoom={12}
      />
    </div>
  );
}

内容的提问来源于stack exchange,提问作者Itsme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:27:34