Uncaught ReferenceError: React не определен

89

Я пытаюсь заставить ReactJS работать с рельсами с помощью этого руководства. Я получаю эту ошибку:


Uncaught ReferenceError: React is not defined

Но я могу получить доступ к объекту React в консоли браузера. Я также добавил public / dist / turbo-react.min.js, как описано здесь, а также добавил строку в application.js, как описано в этом ответе, но безуспешно. Дополнительно выдает ошибку:введите описание изображения здесь
//= require components
var React = require('react')
Uncaught ReferenceError: require is not defined

Может ли кто-нибудь подсказать мне, как это решить?

[EDIT 1]
Исходный код для справки:
Это мой comments.js.jsxфайл:

var Comment = React.createClass({
  render: function () {
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}
        </h2>
          {this.props.comment}
      </div>
      );
  }
});

var ready = function () {
  React.renderComponent(
    <Comment author="Richard" comment="This is a comment "/>,
    document.getElementById('comments')
  );
};

$(document).ready(ready);

А это мой index.html.erb:

<div id="comments"></div>
sky_coder123
источник

Ответы:

91

Мне удалось воспроизвести эту ошибку, когда я использовал webpack для создания своего javascript со следующим фрагментом в моем webpack.config.json:

externals: {
    'react': 'React'
},

Приведенная выше конфигурация сообщает webpack не разрешать require('react'), загружая модуль npm, а вместо этого ожидать вызова глобальной переменной (то есть windowобъекта) React. Решение состоит в том, чтобы либо удалить эту часть конфигурации (чтобы React был связан с вашим javascript), либо загрузить фреймворк React извне до того, как этот файл будет выполнен (чтобы он window.Reactсуществовал).

Барназавр Рекс
источник
4
Удаление этой конфигурации решило проблему для меня.
DJ2
Удаление этой конфигурации решило проблему и для меня
coinhndp
50

Я получил эту ошибку, потому что использовал

import ReactDOM from 'react-dom'

без импорта реакции, как только я изменил его на ниже:

import React from 'react';
import ReactDOM from 'react-dom';

Ошибка решилась :)

Акшат Гупта
источник
(плюс 1) - Имеет смысл
Пол Самсота
2
Работает! Это немного неожиданно для такого языка, как Python. Если я использую только ReactDOMв своем основном файле, я думал, что могу (и должен) избавиться от ссылки на React. Ну что ж, кое-что узнал.
JDM
35

Возможные причины: 1. вы не загрузили React.JS на свою страницу, 2. вы загрузили его после вышеуказанного скрипта на свою страницу. Решение - загрузить файл JS перед показанным выше сценарием.

PS

Возможные решения.

  1. Если вы упоминаете reactв разделе externals внутри конфигурации веб-пакета, вы должны загрузить файлы js реакции непосредственно в свой html передbundle.js
  2. Убедитесь, что у вас есть линия import React from 'react';
Дж. Сантош
источник
35

Если вы используете Webpack, вы можете загрузить React, когда это необходимо, без необходимости явно указывать requireэто в своем коде.

Добавьте в webpack.config.js :

plugins: [
   new webpack.ProvidePlugin({
      "React": "react",
   }),
],

См. Http://webpack.github.io/docs/shimming-modules.html#plugin-provideplugin

Джефир
источник
14

Попробуй добавить:

import React from 'react'
import { render } from 'react-dom'
window.React = React

перед render()функцией.

Иногда это предотвращает появление ошибки при возврате всплывающего окна:

Реагировать не определено

Добавление Reactв окно решит эти проблемы.

Сантош Сурьяванши
источник
1
Последняя строка была для меня недостающей частью.
Тасос К.
11

Добавление в Сантош:

Вы можете загрузить React с помощью

import React from 'react'
Имамудин Насим
источник
1
@zero_cool Мне нравятся точки с запятой, так как они упрощают чтение кода, но в JavaScript они не обязательны. Если не указано, они будут вставлены автоматически. Официальная спецификация EcmaScript содержит следующую информацию: «Более того, терминаторы строки, хотя и не считаются токенами, также становятся частью потока входных элементов и направляют процесс автоматической вставки точки с запятой (11.9)». из: tc39.github.io/ecma262/#sec-lexical-and-regexp-grammars, который указывает на это: tc39.github.io/ecma262/#sec-automatic-semicolon-insertion Таким образом, технически оба ваших примера кода правильный и действительный JS.
Clomp
3
import React, { Component, PropTypes } from 'react';

Это тоже может сработать!

Авраам Джагадиш
источник
3

Я получил эту ошибку, потому что в моем коде я неправильно написал определение компонента со строчными буквами react.createClassвместо верхнего регистра React.createClass.

кочевник
источник
1

Я столкнулся с той же проблемой. Я решил это путем импорта Reactи ReactDOMвроде следующего:

import React from 'react';
import ReactDOM from 'react-dom';
ананд шукла
источник
0

Если вы используете машинопись, убедитесь , что ваш tsconfig.jsonесть "jsx": "react"внутри "compilerOptions".

псевдо
источник