Uncaught ReferenceError: React nie jest zdefiniowany

89

Próbuję sprawić, by ReactJS działał z szynami, korzystając z tego samouczka. Otrzymuję ten błąd:


Uncaught ReferenceError: React is not defined

Ale mogę uzyskać dostęp do obiektu React w konsoli przeglądarki. Dodałem również public / dist / turbo-respons.min.js, jak opisano tutaj, a także dodałem wiersz w application.js, jak opisano w tej odpowiedzi, na brak szczęścia. Dodatkowo podaje błąd:wprowadź opis obrazu tutaj
//= require components
var React = require('react')
Uncaught ReferenceError: require is not defined

Czy ktoś może mi zasugerować, jak rozwiązać ten problem?

[EDYCJA 1]
Kod źródłowy w celach informacyjnych:
to jest mój comments.js.jsxplik:

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);

A to jest moje index.html.erb:

<div id="comments"></div>
sky_coder123
źródło

Odpowiedzi:

91

Udało mi się odtworzyć ten błąd, gdy korzystałem z pakietu internetowego do zbudowania mojego javascript z następującym fragmentem w moim webpack.config.json:

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

Powyższa konfiguracja mówi webpackowi, aby nie rozwiązywał problemu require('react')przez ładowanie modułu npm, ale zamiast tego oczekiwał zmiennej globalnej (tj. Na windowobiekcie) o nazwie React. Rozwiązaniem jest albo usunięcie tego elementu konfiguracji (aby React był dołączony do twojego javascript), albo załadowanie frameworka Reacta zewnętrznie przed wykonaniem tego pliku (tak, że window.Reactistnieje).

Barnasaurus Rex
źródło
4
Usunięcie tej konfiguracji rozwiązało problem za mnie.
DJ2
Usunięcie tej konfiguracji rozwiązało również problem dla mnie
coinhndp
50

Otrzymałem ten błąd, ponieważ używałem

import ReactDOM from 'react-dom'

bez importu zareaguj, gdy zmieniłem to poniżej:

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

Błąd został rozwiązany :)

Akshat Gupta
źródło
(plus 1) -
Ma
2
Pracuje! To trochę nieoczekiwane, jeśli chodzi o język taki jak Python. Jeśli używam tylko ReactDOMw moim głównym pliku, pomyślałem, że mogę (i powinienem) pozbyć się odniesienia do React. No cóż, czegoś się nauczyłem.
jdm
35

Możliwe przyczyny: 1. nie załadowałeś React.JS na swoją stronę, 2. załadowałeś go po powyższym skrypcie na swojej stronie. Rozwiązaniem jest załadowanie pliku JS przed pokazanym powyżej skryptem.

PS

Możliwe rozwiązania.

  1. Jeśli wspomnisz reactw sekcji zewnętrznych w konfiguracji webpacka, to musisz załadować pliki reagujące js bezpośrednio do swojego HTML przedbundle.js
  2. Upewnij się, że masz linię import React from 'react';
J Santosh
źródło
14

Spróbuj dodać:

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

przed render()funkcją.

Czasami zapobiega to zwracaniu się wyskakujących okienek:

React nie jest zdefiniowany

Dodanie Reactdo okna rozwiąże te problemy.

Santosh Suryawanshi
źródło
1
Ostatnia linia była dla mnie brakującą częścią.
Tasos K.
11

Dodawanie do Santosha:

Możesz załadować Reacta przez

import React from 'react'
Imamudin Naseem
źródło
1
@zero_cool Uwielbiam średniki, ponieważ ułatwia to czytanie kodu, ale w JavaScript są one opcjonalne. W przypadku pominięcia zostaną one automatycznie wstawione. Oficjalna specyfikacja EcmaScript zawiera następujące informacje: „Co więcej, terminatory linii, chociaż nie są uważane za tokeny, również stają się częścią strumienia elementów wejściowych i kierują procesem automatycznego wstawiania średnika (11.9)”. from: tc39.github.io/ecma262/#sec-lexical-and-regexp-grammars, który wskazuje na to: tc39.github.io/ecma262/#sec-automatic-semicolon-insertion Tak więc technicznie oba przykłady kodu są poprawny i poprawny JS.
Clomp
3
import React, { Component, PropTypes } from 'react';

To też może zadziałać!

Abraham Jagadeesh
źródło
3

Otrzymałem ten błąd, ponieważ w moim kodzie błędnie wpisałem definicję komponentu małymi literami react.createClasszamiast wielkimi literami React.createClass.

koczownik
źródło
1

Miałem ten sam problem. Rozwiązałem to importując Reacti ReactDOMpolubiłem w następujący sposób:

import React from 'react';
import ReactDOM from 'react-dom';
anand shukla
źródło
0

Jeśli używasz maszynopis, upewnij się, że tsconfig.jsonma "jsx": "react"zasięgu "compilerOptions".

pseudosudo
źródło