Next.js 13.0.1集成Leaflet地图组件渲染故障求助
Next.js 13.0.1 集成Leaflet地图组件的渲染问题
问题概述
在Next.js 13.0.1项目中集成Leaflet地图组件时遇到两类渲染问题:
- 首次加载时出现
ReferenceError: window is not defined错误,地图能加载但标记等元素不显示; - 页面硬重载或通过Link跳转后,出现
TypeError: Cannot read properties of undefined (reading 'default')错误,导致页面完全无法加载。
已尝试Next.js的dynamic()和import()函数,且在地图组件和页面组件中添加了'use client'指令,但问题仍未解决。
错误信息
首次加载错误
ReferenceError: window is not defined at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:229:19) at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:7:11) at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:9:3) at Object.(sc_client)/./node_modules/leaflet/dist/leaflet-src.js (C:\desenvolvimento\estacionai-front\.next\server\app\page.js:482:1) at __webpack_require__ (C:\desenvolvimento\estacionai-front\.next\server\webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js:2:18) at eval (webpack-internal:///(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js:4:2) at Object.(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js (C:\desenvolvimento\estacionai-front\.next\server\app\page.js:472:1) at __webpack_require__ (C:\desenvolvimento\estacionai-front\.next\server\webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_client)/./components/Mapa.tsx:11:91)
重载/跳转后错误
TypeError: Cannot read properties of undefined (reading 'default') at resolveModuleMetaData (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:195:82) at serializeModuleReference (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1298:50) at resolveModelToJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1660:40) at Array.toJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1081:40) at stringify (<anonymous>) at processModelChunk (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:163:36) at retryTask (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1823:50) at performWork (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1856:33) at AsyncLocalStorage.run (node:async_hooks:330:14) at eval (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1934:55) { digest: '699076802' }
项目结构

组件代码
Mapa.tsx
'use-client'; import { useState } from 'react'; import 'leaflet/dist/leaflet.css'; import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.css' import "leaflet-defaulticon-compatibility"; import { MapContainer, TileLayer, Marker, useMap } from 'react-leaflet'; export default function Map() { const [geoData, setGeoData] = useState({ lat: 64.536634, lng: 16.779852 }); return ( <MapContainer center={[geoData.lat, geoData.lng]} zoom={12} style={{ height: '90vh' }}> <TileLayer attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> {geoData.lat && geoData.lng && ( <Marker position={[geoData.lat, geoData.lng]} /> )} </MapContainer> ); }
Home组件(app/page.tsx)
'use client'; import Link from "next/link"; import { useEffect, useState } from "react"; import Mapa from "../components/Mapa"; export default function Home(){ return ( <div> <Link href='/pontos'>Pontos</Link> <Mapa /> </div> ) }
依赖配置(package.json)
{ "name": "estacionai-front", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@types/node": "18.11.9", "@types/react": "18.0.24", "@types/react-dom": "18.0.8", "leaflet": "^1.9.2", "leaflet-defaulticon-compatibility": "^0.1.1", "leaflet-geosearch": "^3.7.0", "next": "^13.0.1", "react": "18.2.0", "react-dom": "18.2.0", "react-leaflet": "^4.1.0", "typescript": "4.8.4" }, "devDependencies": { "@types/leaflet": "^1.9.0", "autoprefixer": "^10.4.13", "postcss": "^8.4.18", "tailwindcss": "^3.2.1" } }
内容的提问来源于stack exchange,提问作者João Danilo Zucolotto
相关产品推荐
相关产品推荐

