Неперехваченная ошибка типа: __WEBPACK_IMPORTED_MODULE_0_react__default.a.createContext не является функцией

#javascript #node.js #reactjs #webpack

#javascript #node.js #reactjs #webpack

Вопрос:

Я использую @loadable/component следующим образом:

app.js

 import React from 'react';
import loadable from "@loadable/component";

// ...

const Welcome = loadable(() =>
  import(/* webpackChunkName: "welcome" */ "./components/Welcome")
);

// ...

let root = document.getElementById('root');
if (root) {

    render(
    <BrowserRouter>
      <Switch>
        ...
        <Route path="/welcome" component={Welcome} />
        ...
      </Switch>
    </BrowserRouter>,
    root
  );
}
 

Когда я создаю приложение на консоли, я получаю следующее:

 $ npm run watch

> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=./webpack.config.js

 10% building modules 2/2 modules 0 active
Webpack is watching the files…

 95% emitting DONE  Compiled successfully in 3775ms5:40:45 AM

                        Asset       Size  Chunks                    Chunk Names
welcome.js?v=##BUILD_NUMBER##    15.9 kB       0  [emitted]         welcome
                   /vendor.js    2.49 MB       1  [emitted]  [big]  /vendor
                      /app.js     1.9 MB       2  [emitted]  [big]  /app
                 /manifest.js    5.83 kB       3  [emitted]         /manifest
            ../css/styles.css    59.5 kB       2  [emitted]         /app
 

Затем, при открытии приложения в браузере, на консоли Chrome я получаю следующую ошибку:

 app.js?v=:23402 Uncaught TypeError: __WEBPACK_IMPORTED_MODULE_0_react___default.a.createContext is not a function
    at Object.553 (app.js?v=:23402)
    at __webpack_require__ (manifest.js?v=:55)
    at Object.403 (app.js?v=:21450)
    at __webpack_require__ (manifest.js?v=:55)
    at Object.402 (app.js?v=:21415)
    at __webpack_require__ (manifest.js?v=:55)
    at webpackJsonpCallback (manifest.js?v=:26)
    at app.js?v=:1
 

При нажатии на: app.js?v=:23402 выше я получаю следующее:

введите описание изображения здесь

Это фрагмент package.json :

 {
  "private": true,
  "scripts": {
      ...
  },
  "devDependencies": {
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.23.0",
    "babel-preset-stage-2": "^6.24.1",
    "bootstrap-less": "^3.3.8",
    "cross-env": "^5.0.1",
    "flux": "^3.1.3",
    "laravel-mix": "^2.1",
    "laravel-mix-purgecss": "^5.0.0-rc.1",
    "less": "^2.7.2",
    "less-loader": "^4.0.5",
    "lodash": "^4.17.4",
    "webpack": "^3.5.0"
  },
  "dependencies": {
    "@loadable/component": "^5.14.1",
    "axios": "^0.16.2",
    "classnames": "^2.2.6",
    "dotenv": "^8.2.0",
    "jquery": "^3.2.1",
    "md5": "^2.2.1",
    "moment": "^2.19.1",
    "npm": "^6.1.0",
    "query-string": "^6.4.2",
    "react": "^15.6.1",
    "react-bootstrap": "^0.31.3",
    "react-collapsible": "^2.2.0",
    "react-cookies": "^0.1.0",
    "react-dom": "^15.6.1",
    "react-number-format": "^2.0.4",
    "react-router": "^4.2.0",
    "react-router-dom": "^4.2.2",
    "react-slick": "^0.15.4",
    "react-text-mask": "^5.0.2",
    "store2": "^2.5.5"
  },
  "main": "webpack.mix.js"
}
 

Есть идеи, как это решить?

Примечание: перед использованием @loadable/component все работало нормально, но мне нужно заставить вещи работать с: @loadable/component ;

Спасибо!

Комментарии:

1. Я не уверен, но если вы измените import React from 'react'; на import * as React from 'react'; , это что-нибудь изменит?

2. Кроме того, не могли бы вы указать, какую версию react вы используете?

3. после изменения import React from 'react'; на import * as React from 'react'; я получаю ту же ошибку.

Ответ №1:

Причина, по которой вы получаете эту ошибку, заключается в том, что одна из ваших зависимостей (или, возможно, даже ваш код) зависит от React.createContext метода.

Это часть «контекстного API», введенного в версии 16.3 (список изменений)

Вам нужно либо удалить зависимость, для которой требуется эта более поздняя версия react, либо обновить версию react как минимум до 16.3.

Обычно, когда зависимость в вашем package.json зависит от конкретной версии react, эта версия будет указана как «одноранговая зависимость». Если это так, при запуске npm install вы получите предупреждение, которое выглядит следующим образом

 npm WARN somedependency@a.b.c requires a peer of react@^16.3.0 but...
 

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

Например, после запуска npm install с версиями пакетов, которые вы включили в свой пост, мы получаем (помимо предупреждений об устаревании, которые выходят за рамки этого вопроса) следующее предупреждение:

 npm WARN @loadable/component@5.14.1 requires a peer of react@>=16.3.0 but none is installed. You must install peer dependencies yourself.
 

В качестве обходного пути вы также можете иногда проверять, работает ли предыдущая версия проблемного пакета с более ранней версией одноранговой зависимости 🙂

Комментарии:

1. вы были абсолютно правы. Мне пришлось обновить: с: «react»: «^ 15.6.1», «react-dom»: «^ 15.6.1», «react-router»: «^ 4.2.0», «react-router-dom»: «^ 4.2.2», до: «react»: «^ 16.3», «react-dom»: «^16.3», «react-router»: «^ 5.0.1», «react-router-dom»: «^ 5.0.1»,