Реагировать на ошибку карты листовки при рендеринге на стороне сервера

РЕШЕНО --- прочтите обновление 2

привет, у меня есть эта ошибка в стартовом наборе реагирования с картой реагирования-листовки

это похоже на пример модуля github, но я не знаю, в чем проблема !!! я думаю проблема с SSR

версия реакции: 16.x и стартовый комплект реакции

ОБНОВЛЕНО 1

ReferenceError: window is not defined
    at D:\project\react-starterkit\node_modules\leaflet\src\core\Util.js:217:24
    at version (D:\project\react-starterkit\node_modules\leaflet\dist\leaflet-src.js:7:65)
    at Object.<anonymous> (D:\project\react-starterkit\node_modules\leaflet\dist\leaflet-src.js:10:2)
    at Module._compile (module.js:635:30)
    at Module._extensions..js (module.js:646:10)
    at Object.require.extensions.(anonymous function) [as .js] (D:\project\react-starterkit\node_modules\babel-register\lib\node.js:152:7)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)

Решено с помощью реакции обновления на последнюю версию 16.x

TypeError: (0 , _react.createContext) is not a function
    at Object.<anonymous> (D:\project\react-starterkit\node_modules\react-leaflet\lib\context.js:18:47)
    at Module._compile (module.js:635:30)
    at Module._extensions..js (module.js:646:10)
    at Object.require.extensions.(anonymous function) [as .js] (D:\project\react-starterkit\node_modules\babel-register\lib\node.js:152:7)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (D:\project\react-starterkit\node_modules\react-leaflet\lib\index.js:5:16)

вот мой код:

import React from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import withStyles from 'isomorphic-style-loader/lib/withStyles';
import s from './Home.css';

class Home extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      lat: 51.505,
      lng: -0.09,
      zoom: 13,
    }
  }
  render() {
    const position = [this.state.lat, this.state.lng]
    return (
      <Map center={position} zoom={this.state.zoom}>
        <TileLayer
          attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
        <Marker position={position}>
          <Popup>
            A pretty CSS3 popup. <br /> Easily customizable.
          </Popup>
        </Marker>
      </Map>
    );
  }
}

export default withStyles(s)(Home);

ОБНОВЛЕНИЕ 2 Решено мной

import React from 'react';
import withStyles from 'isomorphic-style-loader/lib/withStyles';
import leafletCss from '!isomorphic-style-loader!css-loader?modules=false!leaflet/dist/leaflet.css'; //if use isomorphic-style-loader
import s from './GenerateMap.css';

let RL = false;
let Map = false;
let TileLayer = false;
let Marker = false;
let Popup = false;
if (process.env.BROWSER) {
  RL = require('react-leaflet');
  Map = RL.Map;
  TileLayer = RL.TileLayer;
  Marker = RL.Marker;
  Popup = RL.Popup;
}

class GenerateMap extends React.Component {
  render() {
    const position = [51.505, -0.09]

    return (
      <div className={s.root}>
        {process.env.BROWSER && (
          <Map style={{width:'100%',height: '500px'}} center={position} zoom={13}>
            <TileLayer
              url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
              attribution="&copy; <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
            />
            <Marker position={position} icon=''>
              <Popup>A pretty CSS3 popup.<br />Easily customizable.</Popup>
            </Marker>
          </Map>
        )}
      </div>
    );
  }
}

export default withStyles(s, leafletCss)(GenerateMap);

person saman khademi    schedule 10.07.2018    source источник
comment
Вы получаете эту ошибку на стороне сервера? или в браузере?   -  person Fawaz    schedule 10.07.2018
comment
при рендеринге на стороне сервера   -  person saman khademi    schedule 10.07.2018
comment
вы можете return null;, если typeof window === 'undefined', чтобы карта отображалась только на стороне клиента.   -  person Fawaz    schedule 10.07.2018
comment
хорошо, я знаю, что могу использовать typeof или process.env.BROWSER, но это модуль npm, и я не могу его изменить   -  person saman khademi    schedule 10.07.2018


Ответы (1)


Из трассировки стека я вижу, что react-leaflet использует createContext(), который является частью React Context API. Это доступно только в React 16.3.

Вы проверили версию react-leaflet, которую используете? Возможно, вы используете версию, которая зависит от React 16.3. Вы можете попробовать перейти на react-leaflet 1.9.1 и посмотреть, работает ли это.

Обновленный ответ:

window не определено — это ошибка, которая, скорее всего, произошла, когда ваш код пытается получить доступ к глобальной переменной window, которая определяется только тогда, когда ваш код запускается в браузере (не в SSR). Проверьте свой код, чтобы узнать, произошла ли эта ошибка из-за вашего кода. Если это вызвано react-leaflet, читайте ниже...

После дополнительных поисков кажется, что react-leaflet не создан с учетом рендеринга на стороне сервера. Вы можете попробовать проверить react-leaflet-universal, чтобы реализовать это. Если ничего не помогает, вам может понадобиться создать собственную оболочку для листовки, чтобы добиться этого.

person Jackyef    schedule 10.07.2018
comment
спасибо, это правильно, но теперь у меня есть эта ошибка ReferenceError: window is not defined! это для SSR, как его загрузить для CSR? - person saman khademi; 10.07.2018
comment
Для рендеринга на стороне клиента вам нужно дождаться монтирования компонента. Я не проверял это, но мне интересно, может ли ComponentDidMount работать. - person Yigit Alparslan; 28.02.2020