带有 gatsby v3 的 gatsby-plugin-react-leaflet - 构建错误
gatsby-plugin-react-leaflet with gatsby v3 - build error
我找不到任何关于 gatsby-plugin-react-leaflet(为 gatsby v2 制作)是否与 gatsby v3 兼容的信息,也找不到关于我得到的构建错误的任何信息。我已经尝试了所有方法,即检查是否定义了 window、useHasMounted 等,但没有任何效果。似乎与此版本的 gatsby 插件有关。任何信息都会很棒。
我在尝试构建时遇到这些错误:
这是我的完整代码,如果我删除 MapContainer 和其中的所有内容,Gatsby 构建没有问题。
import { Link, Icon } from "@myCompany/components";
import L from "leaflet";
import PropTypes from "prop-types";
import React, { useEffect, useState } from "react";
import { MapContainer, Marker, TileLayer } from "react-leaflet";
import { useFetch } from "use-http";
import pin from "../images/pin.svg";
import * as defaultStyles from "./Map.module.css";
Map.propTypes = {
styles: PropTypes.objectOf(PropTypes.string),
address: PropTypes.string,
street: PropTypes.string,
zip: PropTypes.string,
city: PropTypes.string,
};
export default function Map({
styles = defaultStyles,
address,
street,
zip,
city,
}) {
const [coordinates, setCoordinates] = useState([0, 0]);
const [loading, setLoading] = useState(true);
const { get, error } = useFetch(
`https://nominatim.openstreetmap.org/search?q=${address}&format=json`,
);
const getCoordinates = async () => {
const response = await get();
if (response && response.length) {
const { lat, lon } = response[0];
setCoordinates([Number(lat), Number(lon)]);
setLoading(false);
}
};
useEffect(() => {
getCoordinates();
}, []);
if (loading) {
return null;
}
if (error) {
return null;
}
if (typeof window !== "undefined") {
const pinIcon = new L.Icon({ iconUrl: pin, iconSize: new L.Point(32, 38) });
return (
<div className={styles.component}>
<MapContainer
center={coordinates}
zoom={17}
className={styles.map}
zoomControl={false}
attributionControl={false}
>
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker
position={coordinates}
className={styles.marker}
icon={pinIcon}
/>
</MapContainer>
<Link
to={`https://www.google.com/maps/search/?api=1&query=${street}, ${zip} ${city}}`}
target="_blank"
showExternalIcon={false}
className={styles.link}
>
<Icon name="map" />
</Link>
</div>
);
}
return null;
}
nor can I find any info on the build errors I get.
根据这个 GitHub thread 它应该与 v3 兼容,其中作者指出了与 v3 和 v4 的向后兼容性。尝试使用最新版本:3.0.3
没有进一步的实施细节,我不知道问题的原因是什么。
问题已通过使用 Node 14.x 并将包版本降级到 2.7.0
解决,该版本公开了 Map
而不是 MapContainer
包装器。
我找不到任何关于 gatsby-plugin-react-leaflet(为 gatsby v2 制作)是否与 gatsby v3 兼容的信息,也找不到关于我得到的构建错误的任何信息。我已经尝试了所有方法,即检查是否定义了 window、useHasMounted 等,但没有任何效果。似乎与此版本的 gatsby 插件有关。任何信息都会很棒。
我在尝试构建时遇到这些错误:
这是我的完整代码,如果我删除 MapContainer 和其中的所有内容,Gatsby 构建没有问题。
import { Link, Icon } from "@myCompany/components";
import L from "leaflet";
import PropTypes from "prop-types";
import React, { useEffect, useState } from "react";
import { MapContainer, Marker, TileLayer } from "react-leaflet";
import { useFetch } from "use-http";
import pin from "../images/pin.svg";
import * as defaultStyles from "./Map.module.css";
Map.propTypes = {
styles: PropTypes.objectOf(PropTypes.string),
address: PropTypes.string,
street: PropTypes.string,
zip: PropTypes.string,
city: PropTypes.string,
};
export default function Map({
styles = defaultStyles,
address,
street,
zip,
city,
}) {
const [coordinates, setCoordinates] = useState([0, 0]);
const [loading, setLoading] = useState(true);
const { get, error } = useFetch(
`https://nominatim.openstreetmap.org/search?q=${address}&format=json`,
);
const getCoordinates = async () => {
const response = await get();
if (response && response.length) {
const { lat, lon } = response[0];
setCoordinates([Number(lat), Number(lon)]);
setLoading(false);
}
};
useEffect(() => {
getCoordinates();
}, []);
if (loading) {
return null;
}
if (error) {
return null;
}
if (typeof window !== "undefined") {
const pinIcon = new L.Icon({ iconUrl: pin, iconSize: new L.Point(32, 38) });
return (
<div className={styles.component}>
<MapContainer
center={coordinates}
zoom={17}
className={styles.map}
zoomControl={false}
attributionControl={false}
>
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker
position={coordinates}
className={styles.marker}
icon={pinIcon}
/>
</MapContainer>
<Link
to={`https://www.google.com/maps/search/?api=1&query=${street}, ${zip} ${city}}`}
target="_blank"
showExternalIcon={false}
className={styles.link}
>
<Icon name="map" />
</Link>
</div>
);
}
return null;
}
nor can I find any info on the build errors I get.
根据这个 GitHub thread 它应该与 v3 兼容,其中作者指出了与 v3 和 v4 的向后兼容性。尝试使用最新版本:3.0.3
没有进一步的实施细节,我不知道问题的原因是什么。
问题已通过使用 Node 14.x 并将包版本降级到 2.7.0
解决,该版本公开了 Map
而不是 MapContainer
包装器。