Пользовательский значок листовки, листовка с реакцией, невозможно создать проект Gatsby

У меня есть пользовательские значки, работающие на моей карте Leaflet, когда я запускаю gatsby develop локально, но когда я пытаюсь создать, я получаю сообщение об ошибке, связанное с моим пользовательским значком маркера:

 WebpackError: TypeError: leaflet_src_layer_marker__WEBPACK_IMPORTED_MODULE
// Init custom map icon
  const mapIcon = MapIcon();
  const markerIcon = new Icon({
    iconUrl: mapIcon,
    iconSize: [36, 36],
    iconAnchor: [18, 18],
    shadowSize: [36, 36],
    shadowUrl: 'https://unpkg.com/[email protected]/dist/images/marker-shadow.png',
    shadowAnchor: [10, 18],
    popupAnchor: [0, -16],
    tooltipAnchor: [13, -4]
  });
_.Icon is not a constructor

Связанный импорт:

import { Map, Marker, Popup, TileLayer, Tooltip, ZoomControl } from 'react-leaflet'
import { Icon } from 'leaflet/src/layer/marker' 

Создать собственный значок:

// Init custom map icon
  const mapIcon = MapIcon();
  const markerIcon = new Icon({
    iconUrl: mapIcon,
    iconSize: [36, 36],
    iconAnchor: [18, 18],
    shadowSize: [36, 36],
    shadowUrl: 'https://unpkg.com/[email protected]/dist/images/marker-shadow.png',
    shadowAnchor: [10, 18],
    popupAnchor: [0, -16],
    tooltipAnchor: [13, -4]
  });

JSX:

{ markerData.length > 0 ? markerData.map((node, index) => (
            <Marker position={[node.coords.lat, node.coords.lng]} key={`marker-${index}`} icon={markerIcon}>
              <Popup className="leaflet-popup" onOpen={(el) => openPopup(el)}>
                <h5 className="popup-location-title">{node.location_title}</h5>
                <h6 className="popup-address">{node.address}</h6>
                <div className="popup-description" dangerouslySetInnerHTML={{ __html: node.description }}></div>
                {!!node.embed ?
                  <div className="popup-embed">
                    <Embed url={node.embed} className="popup-media-embed" />
                  </div>
                : null}
              </Popup>
              <Tooltip className="leaflet-tooltip">
                <span className="title">{node.location_title}</span>
                <span className="address">{node.address}</span>
              </Tooltip>
            </Marker>
          )) : null }

Я пробовал все решения, перечисленные здесь: https://github.com/Leaflet/Leaflet.markercluster/issues/874. Я также рассмотрел несколько похожих вопросов. Кажется, ничего не помогает. Например, я также пробовал импортировать такие листовки import * as L from "leaflet" и такие import L from "leaflet". И затем создаем новый значок, например, const markerIcon = L.Icon({, вот так const markerIcon = L.icon({, вот так const markerIcon = new L.Icon({ и так const markerIcon = new L.icon({. Я могу console.log(L), но ничего из этого не работает.

Я хотел бы получить некоторую помощь.


person Lou Groshek    schedule 19.03.2020    source источник


Ответы (1)


Получил строить. Мне пришлось обернуть конструкцию значка в проверку для объекта окна:

// Init custom map icon
  if (typeof window !== 'undefined') {
    const mapIcon = MapIcon();
    markerIcon = new Icon({
      iconUrl: mapIcon,
      iconSize: [36, 36],
      iconAnchor: [18, 18],
      shadowSize: [36, 36],
      shadowUrl: 'https://unpkg.com/[email protected]/dist/images/marker-shadow.png',
      shadowAnchor: [10, 18],
      popupAnchor: [0, -16],
      tooltipAnchor: [13, -4]
    });
  }

И снова при передаче значка маркеру:

<Marker position={[node.coords.lat, node.coords.lng]} key={`marker-${index}`} icon={(!!markerIcon) ? markerIcon : null}>
person Lou Groshek    schedule 19.03.2020
comment
Потраченные впустую часы, пытаясь понять. Никогда не приходил мне в голову об этом. Спасибо за этот пост. - person Anil Maharjan; 03.09.2020