Reactjs: Несподіваний маркер '<' Помилка


99

Я тільки починаю з Reactjs і писав простий компонент для відображення
liтегів і натрапив на цю помилку:

Несподіваний маркер '<'

Я приклав приклад на jsbin нижче http://jsbin.com/UWOquRA/1/edit?html,js,console,output

Будь ласка, дайте мені знати, що я роблю не так.

Відповіді:



30

ОНОВЛЕННЯ: У React 0,12+ або більше, прагма JSX більше не потрібна.


Обов’язково включіть прагму JSX у верхню частину файлів:

/** @jsx React.DOM */

Без цього рядка jsxдвійковий та трансформатор у браузері залишать ваші файли незмінними.


10
Але <script type = "text / jsx"> є
xavier

4
за допомогою вавилонки мені довелося кинутись type="text/babel". Хоробрий новий світ javascript
Connor Leech

це допомогло в моїх обставин: stackoverflow.com/questions/33460420 / ...
timhc22

28

Проблема Неочікуваний маркер '<' через відсутність попередньо встановленої лексеми .

Рішення: Ви повинні налаштувати конфігурацію веб-пакету наступним чином

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

тут .jsx перевіряє формати .js та .jsx.

ви можете просто встановити залежність бабеля за допомогою вузла наступним чином

npm install babel-preset-react

Дякую


У питанні немає нічого, що вказувало б, що в оригінальному плакаті використовується вавило.
ivarni

Він сказав, що він тільки починає з Reactjs, тому що потрібно використовувати попередньо встановлену функцію React. Можливо, конфігурація веб-пакета пропустила попередньо встановлену
наказову

У запитанні немає нічого, що вказувало б, що оригінальний плакат також використовує webpack. Жоден з цих не потрібен для роботи з React, хоча вони обидва зручні.
ivarni

4
@Nuwa дякую npm install babel-preset-reactвирішив мою проблему.
Ясін Йорк

4
якщо у вас є .babelrcпроект у проекті просто так, "presets": ["env", "react", "es2015"]і це все !!
Байрон Лопес

21

у моєму випадку я не зміг включити атрибут типу у мій тег сценарію.

<script type="text/jsx">

7

Вам потрібно або транспілювати / компілювати цей код JSX у javascript, або використовувати внутрішньо-браузерний трансформатор

Подивіться на http://facebook.github.io/react/docs/getting-started.html і візьміть на замітку <script>теги, вам потрібні ті, які включені в JSX для роботи в браузері.


Так я знаю, нижче оновлене jsbin посилання
сем

У тому, що jsbin, мабуть, має власний спосіб виконання JS, помилка полягає в їхньому коді.
кр

Але це та сама помилка та однаковий номер рядка. Крім того, чи є якась інша причина, чому така помилка станеться, якщо я використовую той самий код, що і у посиланні
Sam

jsfiddle.net/9st5Q ось ваш код у jsfiddle, де React працює чудово.
кр

7
переконайтеся , що ви встановите тип = "текст / JSX» в <script type="text/jsx">тезі, якщо ви хочете , будь ласка , вставте весь код в hastebin.org паста
KRS

7

У мене є ця помилка, і я не міг її вирішити протягом двох днів. Тому виправити помилку дуже просто. У тілі, де ви підключите своє script, додайте, type="text/jsx"і це вирішить проблему.


Ви можете також дати пояснення для своєї відповіді?
ММаскарін

1
Я думаю, коли ви надаєте type = "text / jsx", ви носили компілятор, щоб знати, що це за документ чи файл.
Руслан

3

Ось робочий приклад вашого 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>

Запустіть цей код з одного файлу і ваш він повинен працювати.


2

Якщо ви схожі на мене і схильні до нерозумних помилок, також перевірте свій пакунок.json, чи містить він ваш попередньо встановлений наказ:

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


1

якщо ми врахуємо вашу реальну конфігурацію сайту, то вам потрібно запустити ReactJS в голові

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

і додайте атрибут у файл js - type = "text / babel", як

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

тоді приклад коду нижче буде працювати:

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

1

Використовуйте наступний код. Я додав посилання на React і React DOM. Використовуйте ES6 / Babel, щоб перетворити код JS у ванільний JavaScript. Зауважте, що метод візуалізації походить від ReactDOM і переконайтеся, що метод рендерінга має ціль, вказану в DOM. Іноді ви можете зіткнутися з проблемою, що метод render () не може знайти цільовий елемент. Це відбувається тому, що код реагування виконується до надання DOM. Щоб протистояти цьому, використовуйте jQuery ready () для виклику методу render () React. Таким чином, ви будете впевнені, що DOM буде наданий першим. Ви також можете використовувати атрибут відстрочки в сценарії програми.

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>

JS-код:

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

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

Сподіваюся, це вирішить вашу проблему. :-)


1

Перевірте, чи .babelrc знаходиться в кореневій папці програми, а не в підпапці. якщо це так, перемістіть файл у корінь.


0

Ви можете використовувати такий код:

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

І не забудьте надбудову <div id='main-content'></div>в bodyу вашомуhtml

Але у файлі package.json слід використовувати ці залежності:

  "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",
...
}

Це працює для мене, але я також використовував webpack з такими параметрами (в webpack.config.js):

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

0

У моєму випадку, крім babelпресетів, мені також довелося додати це до свого .eslintrc:

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

0

Я щойно почав вчитися Reactсьогодні і зіткнувся з тією ж проблемою. Нижче наведений код, який я написав.

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

І як ви бачите, що я пропустив кому (,) після використання <Hello/>. І сама помилка говорить про те, в якому рядку нам потрібно дивитися.

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

Отже, як тільки я додаю кому перед другим параметром ReactDOM.render()функції, все почало працювати добре.


0

ось ще один спосіб ви можете це зробити html

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

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

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

</html>

файл index.js з маршрутом 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"));

скористайтеся цим пакетом.json швидко працює і працює

{
  "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

Хоча, у мене в конфігураційному файлі .babelrc у мене були всі належні навантажувачі. Цей сценарій збірки з пакетом-пакетом створював несподівану помилку лексеми <та помилки типу mime в консолі браузера для мене вручну.

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

Оновлення сценарію збирання вирішило для мене проблеми.

"scripts": {
    "build": "parcel build ui/index.html",
    "ui": "parcel watch ui/index.html"
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.