Reactjs: token imprevisto "<" Errore


99

Sto appena iniziando con Reactjs e stavo scrivendo un semplice componente per visualizzare il
litag e mi sono imbattuto in questo errore:

Token imprevisto "<"

Ho messo l'esempio su jsbin sotto http://jsbin.com/UWOquRA/1/edit?html,js,console,output

Per favore fatemi sapere cosa sto sbagliando.

Risposte:



30

AGGIORNAMENTO: In React 0.12+, il pragma JSX non è più necessario.


Assicurati di includere il pragma JSX all'inizio dei tuoi file:

/** @jsx React.DOM */

Senza questa riga, il jsxtrasformatore binario e nel browser lascerà i tuoi file invariati.


10
Ma <script type = "text / jsx"> è
xavier

4
usando Babel ho dovuto buttare dentro type="text/babel". Brave new world of javascript
Connor Leech

questo ha aiutato nella mia situazione: stackoverflow.com/questions/33460420/...
timhc22

28

Il problema con il token imprevisto "<" è dovuto alla mancanza del preset di babele.

Soluzione: è necessario configurare la configurazione del webpack come segue

{
  test   : /\.jsx?$/,
  exclude: /(node_modules|bower_components)/,
  loader : 'babel',
  query  : {
    presets:[ 'react', 'es2015' ]
  }
}

qui .jsx controlla entrambi i formati .js e .jsx.

puoi semplicemente installare la dipendenza babel usando node come segue

npm install babel-preset-react

Grazie


Non c'è niente nella domanda che indichi che il poster originale utilizza Babel.
ivarni

Ha detto che sta appena iniziando con Reactjs, perché il preset babel di React deve essere usato.Potrebbe essere che la configurazione del webpack abbia mancato il preset babel
Nuwa

Non c'è niente nella domanda che indichi che il poster originale sta usando webpack. Nessuno di questi è richiesto per lavorare con React sebbene siano entrambi utili.
ivarni

4
@Nuwa grazie. npm install babel-preset-reactha risolto il mio problema.
Yasin Yörük

4
se hai .babelrcfile nel progetto basta "presets": ["env", "react", "es2015"]e basta !!
Byron Lopez

21

nel mio caso, non ero riuscito a includere l'attributo type nel mio tag script.

<script type="text/jsx">

7

È necessario trasferire / compilare il codice JSX in javascript o utilizzare il trasformatore nel browser

Guarda http://facebook.github.io/react/docs/getting-started.html e prendi nota dei <script>tag, hai bisogno di quelli inclusi per JSX per funzionare nel browser.


Sì, lo so, di seguito è riportato il collegamento
Sam

Quel jsbin sembra avere il proprio modo di eseguire il JS, l'errore proviene dal loro codice.
krs

Ma è lo stesso errore e lo stesso numero di riga. Inoltre, c'è qualche altro motivo per cui si verificherà un tale errore se utilizzo lo stesso codice fornito nel collegamento
sam

jsfiddle.net/9st5Q ecco il tuo codice in un jsfiddle, dove React funziona bene.
krs

7
assicurati di impostare il tipo = "text / jsx" nel <script type="text/jsx">tag, se lo desideri incolla tutto il codice in una pasta
hastebin.org

7

Ho questo errore e non sono riuscito a risolverlo per due giorni, quindi la correzione dell'errore è molto semplice. Nel corpo, dove colleghi il tuo script, aggiungi type="text/jsx"e questo risolverà il problema.


puoi anche dare una spiegazione per la tua risposta?
MMascarin

1
Penso che quando dai type = "text / jsx" hai usato il compilatore per sapere che tipo di documento o file è.
Руслан

3

Ecco un esempio funzionante dal tuo jsbin:

HTML:

<!DOCTYPE html>
<html>
<head>
<script src="//fb.me/react-with-addons-0.9.0.js"></script>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <div id="main-content"></div>
</body>
</html>

jsx:

<script type="text/jsx">
/** @jsx React.DOM */
var LikeOrNot = React.createClass({
    render: function () {
      return (
        <p>Like</p>
      );
    }
});

React.renderComponent(<LikeOrNot />, document.getElementById('main-content'));
</script>

Esegui questo codice da un singolo file e dovrebbe funzionare.


2

Se sei come me e sei incline a errori stupidi, controlla anche il tuo pacchetto.json se contiene il tuo preset babele:

  "babel": {
    "presets": [
      "env",
      "react",
      "stage-2"
    ]
  },


1

se consideriamo la configurazione del tuo sito reale, allora devi eseguire ReactJS in testa

<!-- Babel ECMAScript 6 injunction -->  
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

e aggiungi l'attributo al tuo file js - type = "text / babel" like

<script src="../js/r1HeadBabel.js" type="text/babel"></script>

quindi l'esempio di codice seguente funzionerà:

ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.getElementById('root')
); 

1

Usa il codice seguente. Ho aggiunto riferimenti a React e React DOM. Usa ES6 / Babel per trasformare il tuo codice JS in JavaScript vanilla. Nota che il metodo Render proviene da ReactDOM e assicurati che il metodo di rendering abbia una destinazione specificata nel DOM. A volte potresti riscontrare un problema che il metodo render () non riesce a trovare l'elemento di destinazione. Ciò accade perché il codice di reazione viene eseguito prima del rendering del DOM. Per contrastare questo problema usa jQuery ready () per chiamare il metodo render () di React. In questo modo sarai sicuro che DOM venga renderizzato per primo. Puoi anche utilizzare l'attributo defer nello script dell'app.

Codice HTML:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <div id='main-content'></div>
<script src="CDN link to/react-15.1.0.js"></script>
<script src="CDN link to/react-dom-15.1.0.js"></script>

</body>
</html>

Codice JS:

var LikeOrNot = React.createClass({
    render: function () {
      return (
        <li>Like</li>
      );
    }
});

ReactDOM.render(<LikeOrNot />,
                document.getElementById('main-content'));

Spero che questo risolva il tuo problema. :-)


1

Verifica se .babelrc si trova nella cartella principale dell'applicazione, non in una sottocartella. se questo è il caso, sposta il file in root.


0

Puoi usare un codice come questo:

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

var LikeOrNot = React.createClass({
    displayName: 'Like',
    render: function () {
      return (
        React.createElement("li", null, "Like")
      );
    }
});
ReactDOM.render(<LikeOrNot />, document.getElementById('main-content'));

E non dimenticare di aggiungere <div id='main-content'></div>nel filebody nella vostrahtml

Ma nel tuo file package.json dovresti usare queste dipendenze:

  "dependencies": {
...
    "babel-core": "^6.18.2",
    "babel-preset-react": "^6.16.0",
...
}
"devDependencies": {
...   
    "babel": "^6.5.2",
    "babel-loader": "^6.2.7",
    "babel-preset-es2015": "^6.18.0",
    "jsx-loader": "^0.13.2",
...
}

Per me funziona, ma ho usato anche webpack, con queste opzioni (in webpack.config.js):

  module: {
    loaders: [
      { 
        test: /\.jsx?$/,         // Match both .js and .jsx files
        exclude: /node_modules/, 
        loader: "babel-loader", 
        query:
        {
          presets: ['es2015', 'react']
        }
      }
    ]
  }

0

Nel mio caso, oltre ai babelpreset, ho dovuto aggiungere anche questo al mio .eslintrc:

{
  "extends": "react-app",
  ...
}

0

Ho appena iniziato a imparare Reactoggi e stavo affrontando lo stesso problema. Di seguito è riportato il codice che avevo scritto.

<script type="text/babel">
    class Hello extends React.Component {
        render(){
            return (
                <div>
                    <h1>Hello World</h1>
                </div>
            )
        }
    }
    ReactDOM.render(
        <Hello/>
        document.getElementById('react-container')
    )


</script>

E come puoi vedere che avevo perso una virgola (,) dopo aver usato <Hello/>. E l'errore stesso sta dicendo su quale linea dobbiamo guardare.

inserisci qui la descrizione dell'immagine

Quindi, una volta aggiunta una virgola prima del secondo parametro per la ReactDOM.render()funzione, tutto ha iniziato a funzionare correttamente.


0

ecco un altro modo in cui puoi farlo html

<head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
</head>

<body>
     <div id="app"></div>

    <script src="src/index.js"></script>
</body>

</html>

file index.js con percorso src / index.js

import React from "react";
import { render } from "react-dom";

import "./styles.scss";

const App = () => (
  <div>
    <h1>Hello test</h1>
  </div>
);

render(<App />, document.getElementById("app"));

usa questo package.json ti metterà subito in funzione

{
  "name": "test-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.html",
  "scripts": {
    "start": "parcel index.html --open",
    "build": "parcel build index.html"
  },
  "dependencies": {
    "react": "16.2.0",
    "react-dom": "16.2.0",
    "react-native": "0.57.5"
  },
  "devDependencies": {
    "@types/react-native": "0.57.13",
    "parcel-bundler": "^1.6.1"
  },
  "keywords": []
}

0

Tuttavia, avevo tutti i caricatori babel appropriati nel mio file di configurazione .babelrc. Questo script di build con parcel-bundler produceva l'errore token imprevisto <e errori di tipo MIME nella console del browser per me durante l'aggiornamento della pagina manuale.

"scripts": {
    "build": "parcel build ui/index.html --public-url ./",
    "dev": "parcel watch ui/index.html"
 }

L'aggiornamento dello script di build ha risolto i problemi per me.

"scripts": {
    "build": "parcel build ui/index.html",
    "ui": "parcel watch ui/index.html"
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.