Referência não capturadaError: React não está definido

94

Estou tentando fazer o ReactJS funcionar com trilhos usando este tutorial. Estou recebendo este erro:


Uncaught ReferenceError: React is not defined

Mas posso acessar o objeto React no console do navegador . Também adicionei public / dist / turbo-react.min.js conforme descrito aqui e também adicionei linha em application.js, conforme descrito nesta resposta sem sorte. Além disso, dá o erro:insira a descrição da imagem aqui
//= require components
var React = require('react')
Uncaught ReferenceError: require is not defined

Alguém pode me sugerir como resolver isso?

[EDIT 1]
Código-fonte para referência:
Este é meu comments.js.jsxarquivo:

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

E este é o meu index.html.erb:

<div id="comments"></div>
sky_coder123
fonte

Respostas:

92

Consegui reproduzir esse erro quando estava usando o webpack para construir meu javascript com o seguinte trecho em meu webpack.config.json:

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

Esta configuração acima diz ao webpack para não resolver require('react')carregando um módulo npm, mas sim esperar uma variável global (isto é, no windowobjeto) chamada React. A solução é remover esta parte da configuração (então o React será empacotado com o seu javascript) ou carregar o framework React externamente antes que este arquivo seja executado (para que window.Reactexista).

Barnasaurus Rex
fonte
4
Remover essa configuração resolveu o problema para mim.
DJ2
Remover esta configuração também resolveu o problema para mim
coinhndp
obrigado, isso me ajudou também.
rnd
54

Recebi este erro porque estava usando

import ReactDOM from 'react-dom'

sem importar reagir, uma vez que mudei para abaixo:

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

O erro foi resolvido :)

Akshat Gupta
fonte
(mais 1) - Faz todo o sentido
Paul Samsotha
2
Trabalho! Isso é um pouco inesperado vindo de uma linguagem como Python. Se estou usando apenas ReactDOMno meu arquivo principal, pensei que posso (e devo) me livrar da referência a React. Bem, aprendi algo.
jdm
35

Os possíveis motivos são 1. você não carregou o React.JS em sua página, 2. você o carregou após o script acima em sua página. A solução é carregar o arquivo JS antes do script mostrado acima.

PS

Soluções possíveis.

  1. Se você mencionar reactna seção externa dentro da configuração do webpack, você deve carregar os arquivos react js diretamente em seu html antesbundle.js
  2. Certifique-se de ter a linha import React from 'react';
J Santosh
fonte
15

Tente adicionar:

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

antes da render()função.

Isso às vezes evita que o erro de pop-up retorne:

React não está definido

Adicionar Reactà janela resolverá esses problemas.

Santosh Suryawanshi
fonte
1
A última linha era a parte que faltava para mim.
Tasos K.
11

Adicionando ao Santosh:

Você pode carregar o React por

import React from 'react'
Imamudin Naseem
fonte
1
@zero_cool Eu adoro ponto e vírgula porque torna o código mais fácil de ler, mas eles são opcionais em JavaScript. Quando omitidos, eles serão inseridos automaticamente. A especificação EcmaScript oficial tem esta informação: "Além disso, os terminadores de linha, embora não sejam considerados tokens, também se tornam parte do fluxo de elementos de entrada e orientam o processo de inserção automática de ponto-e-vírgula (11.9)." from: tc39.github.io/ecma262/#sec responsesical - and - regexp - grammars que aponta para isso: tc39.github.io/ecma262/#sec-automatic-semicolon-insertion Então, tecnicamente, ambos os seus exemplos de código são JS correto e válido.
Clomp
3
import React, { Component, PropTypes } from 'react';

Isso também pode funcionar!

Abraham Jagadeesh
fonte
3

Recebi este erro porque em meu código eu digitei incorretamente uma definição de componente com letras minúsculas em react.createClassvez de maiúsculas React.createClass.

nômade
fonte
1

Eu estava enfrentando o mesmo problema. Resolvi importando Reacte ReactDOMgosto da seguinte maneira:

import React from 'react';
import ReactDOM from 'react-dom';
anand shukla
fonte
1

Se você estiver usando o Babel e o React 17, pode ser necessário adicionar "runtime2:" automatic "à configuração.

 {
     "presets": ["@babel/preset-env", ["@babel/preset-react", {
        "runtime": "automatic"
     }]]
 }
Jkarttunen
fonte
0

Se você estiver usando TypeScript, certifique-se de que tsconfig.jsonestá "jsx": "react"dentro de "compilerOptions".

pseudosudo
fonte