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

Next.js 15.1.2集成react-leaflet 5.0.0-rc.1组件加载异常求助

Next.js 15.1.2 集成 react-leaflet 5.0.0-rc.1 组件加载异常问题

问题现象

  • 引入 leaflet.css 后,地图组件完全无法加载,页面显示空白
  • 移除该CSS导入后,地图能加载但布局混乱、渲染异常

已尝试无效方案

  • 关闭 StrictMode
  • 禁用 SSR
  • 动态导入组件
  • 添加 'use client' 指令

相关代码

Leaflet.tsx 组件代码

'use client';
import React from 'react';
import {
    MapContainer,
    TileLayer,
    Marker,
    Popup,
    useMapEvents,
} from 'react-leaflet';
import { useState } from 'react';
import 'leaflet/dist/leaflet.css';
import 'leaflet-defaulticon-compatibility';
import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.css';

const Leaflet = () => {
    function LocationMarker() {
        const [position, setPosition] = useState<L.LatLng | null>(null);
        const map = useMapEvents({
            click() {
                map.locate();
            },
            locationfound(e) {
                setPosition(e.latlng);
                map.flyTo(e.latlng, map.getZoom());
            },
        });
        return position === null ? null : (
            <Marker position={position}>
                <Popup>你在这里</Popup>
            </Marker>
        );
    }

    return (
        <MapContainer
            center={[51.505, -0.09]}
            zoom={13}
            scrollWheelZoom={false}
        >
            <TileLayer
                attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
                url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
            />
            <LocationMarker />
        </MapContainer>
    );
};

export default Leaflet;

动态导入代码

const LeafletMap = useMemo(
    () =>
        dynamic(() => import('@/components/Leaflet'), {
            loading: () => <p>A map is loading</p>,
            ssr: false,
        }),
    [],
);

补充信息

  • package.json 截图:显示项目依赖包含 Next.js 15.1.2、react-leaflet 5.0.0-rc.1、leaflet 及相关兼容包
  • 开发界面截图:引入CSS后页面无任何内容,完全空白
  • 移除CSS后的地图截图:地图瓦片加载但布局错乱,标记点样式异常

解决方案

1. 全局导入Leaflet CSS

Next.js 15 App Router中客户端组件局部导入CSS可能引发冲突,将CSS移至全局布局文件:
在 app/layout.tsx 中添加:

import 'leaflet/dist/leaflet.css';
import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.css';

同时删除 Leaflet.tsx 中的对应CSS导入语句。

2. 给MapContainer设置明确尺寸

Leaflet地图容器必须有固定宽高才能正常渲染,修改MapContainer:

<MapContainer
    center={[51.505, -0.09]}
    zoom={13}
    scrollWheelZoom={false}
    style={{ width: '100%', height: '600px' }}
>

3. 补充Leaflet类型声明

代码中使用了L.LatLng但未导入类型,添加类型引用:

import type * as L from 'leaflet';

4. 简化动态导入逻辑

去掉useMemo包裹,直接使用动态导入:

import dynamic from 'next/dynamic';

const LeafletMap = dynamic(() => import('@/components/Leaflet'), {
    loading: () => <p>地图加载中...</p>,
    ssr: false,
});

5. 锁定兼容依赖版本

确保leaflet版本与react-leaflet 5.0.0-rc.1兼容,执行命令安装指定版本:

npm install leaflet@1.9.4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:55:55