Reactjs: Lỗi không mong muốn '<'


99

tôi mới bắt đầu với Reactjs và đang viết một thành phần đơn giản để hiển thị
lithẻ và gặp lỗi này:

Mã thông báo không mong đợi '<'

Tôi đã đặt ví dụ tại jsbin bên dưới http://jsbin.com/UWOquRA/1/edit?html,js,console,output

Xin vui lòng cho tôi biết những gì tôi đang làm sai.

Câu trả lời:



30

CẬP NHẬT: Trong React 0.12+, JSX pragma không còn cần thiết nữa.


Đảm bảo bao gồm pragma JSX ở đầu tệp của bạn:

/** @jsx React.DOM */

Nếu không có dòng này, jsxbiến áp nhị phân và trong trình duyệt sẽ giữ nguyên các tệp của bạn.


10
Nhưng <script type = "text / jsx"> là
xavier

4
bằng cách sử dụng babel tôi đã phải ném vào type="text/babel". Brave thế giới mới của javascript
Connor Leech

điều này đã giúp trong hoàn cảnh của tôi: stackoverflow.com/questions/33460420/...
timhc22

28

Sự cố Mã thông báo không mong đợi '<' là do thiếu cài đặt trước babel.

Giải pháp: Bạn phải cấu hình cấu hình webpack của mình như sau

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

ở đây .jsx kiểm tra cả định dạng .js và .jsx.

bạn có thể chỉ cần cài đặt phụ thuộc babel bằng cách sử dụng nút như sau

npm install babel-preset-react

Cảm ơn bạn


Không có gì trong câu hỏi chỉ ra rằng người đăng ban đầu đang sử dụng babel.
ivarni

Ông nói rằng ông chỉ là bắt đầu với Reactjs, cho Phản ứng babel cài sẵn phải được use.May được cấu hình webpack bỏ lỡ cài sẵn babel
Bà Nữ Oa

Không có gì trong câu hỏi cho thấy người đăng ban đầu cũng đang sử dụng webpack. Cả hai đều không cần thiết để làm việc với React mặc dù cả hai đều tiện dụng.
ivarni

4
@Nuwa cảm ơn bạn. npm install babel-preset-reactđã giải quyết vấn đề của tôi.
Yasin Yörük

4
nếu bạn có .babelrctập tin trong dự án "presets": ["env", "react", "es2015"]và đó là nó !!
Byron Lopez

21

trong trường hợp của tôi, tôi đã không thể đưa thuộc tính type vào thẻ script của mình.

<script type="text/jsx">

7

Bạn cần chuyển mã / biên dịch mã JSX đó sang javascript hoặc sử dụng trình biến đổi trong trình duyệt

Hãy xem http://facebook.github.io/react/docs/getting-started.html và lưu ý các <script>thẻ, bạn cần có những thẻ này để JSX hoạt động trong trình duyệt.


Vâng, tôi biết, dưới đây là liên kết
sam

Jsbin đó dường như có cách thực thi JS riêng của họ, lỗi là từ trong mã của họ.
krs

Nhưng nó là cùng một lỗi và ở cùng một số dòng. Ngoài ra, có bất kỳ lý do nào khác tại sao lỗi như vậy sẽ xảy ra nếu tôi đang sử dụng mã giống như được cung cấp trong liên kết
sam

jsfiddle.net/9st5Q đây là mã của bạn trong jsfiddle, nơi React hoạt động tốt.
krs

7
chắc chắn rằng bạn thiết lập các type = "text / jsx" trong <script type="text/jsx">thẻ, nếu bạn muốn hãy dán toàn bộ mã của bạn thành một hastebin.org dán
KRS

7

Tôi gặp lỗi này và không thể giải quyết vấn đề này trong hai ngày. Vì vậy, việc khắc phục lỗi rất đơn giản. Trong nội dung, nơi bạn kết nối của bạn script, thêm type="text/jsx"và điều này sẽ giải quyết vấn đề.


bạn cũng có thể đưa ra lời giải thích cho câu trả lời của bạn?
MMascarin

1
Tôi nghĩ rằng khi bạn cung cấp type = "text / jsx", bạn đã đeo trình biên dịch để biết đây là loại tài liệu hoặc tệp nào.
Руслан

3

Đây là một ví dụ làm việc từ jsbin của bạn:

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>

Chạy mã này từ một tệp và nó sẽ hoạt động.


2

Nếu bạn giống tôi và dễ mắc phải những sai lầm ngớ ngẩn, hãy kiểm tra package.json của bạn nếu nó chứa cài đặt trước babel của bạn:

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


1

nếu chúng tôi xem xét cấu hình trang web thực của bạn, thì bạn cần chạy ReactJS trong đầu

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

và thêm thuộc tính vào tệp js của bạn - type = "text / babel" như

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

thì ví dụ mã dưới đây sẽ hoạt động:

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

1

Sử dụng mã sau. Tôi đã thêm tham chiếu đến React và React DOM. Sử dụng ES6 / Babel để chuyển đổi mã JS của bạn thành JavaScript vani. Lưu ý rằng phương thức kết xuất đến từ ReactDOM và đảm bảo rằng phương thức kết xuất đó có mục tiêu được chỉ định trong DOM. Đôi khi bạn có thể gặp phải sự cố rằng phương thức render () không thể tìm thấy phần tử đích. Điều này xảy ra vì mã phản ứng được thực thi trước khi DOM hiển thị. Để chống lại điều này, hãy sử dụng jQuery ready () để gọi phương thức render () của React. Bằng cách này, bạn sẽ chắc chắn về việc DOM được hiển thị trước. Bạn cũng có thể sử dụng thuộc tính trì hoãn trên tập lệnh ứng dụng của mình.

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

Mã JS:

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

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

Hy vọng điều này giải quyết được vấn đề của bạn. :-)


1

Kiểm tra xem .babelrc có bên trong thư mục gốc ứng dụng của bạn, không bên trong thư mục con hay không. nếu đó là trường hợp, hãy di chuyển tệp sang thư mục gốc.


0

Bạn có thể sử dụng mã như sau:

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

Và đừng quên thêm <div id='main-content'></div>vàobody tronghtml

Nhưng trong tệp package.json của bạn, bạn nên sử dụng các phần phụ thuộc này:

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

Nó hoạt động với tôi nhưng tôi cũng đã sử dụng webpack, với các tùy chọn này (vào webpack.config.js):

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

0

Trong trường hợp của tôi, ngoài các babelcài đặt trước, tôi cũng phải thêm cái này vào .eslintrc:

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

0

Tôi mới bắt đầu học Reactngày hôm nay và đang gặp phải vấn đề tương tự. Dưới đây là mã tôi đã viết.

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

Và như bạn có thể thấy rằng tôi đã bỏ lỡ dấu phẩy (,) sau khi tôi sử dụng <Hello/>. Và chính lỗi đang nói chúng ta cần xem xét dòng nào.

nhập mô tả hình ảnh ở đây

Vì vậy, khi tôi thêm dấu phẩy trước tham số thứ hai cho ReactDOM.render()hàm, tất cả đều bắt đầu hoạt động tốt.


0

bạn có thể làm theo cách khác html

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

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

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

</html>

tệp index.js với đường dẫn 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"));

sử dụng gói này .json sẽ giúp bạn thiết lập và chạy nhanh chóng

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

Mặc dù, tôi đã có tất cả các trình tải babel thích hợp trong tệp cấu hình .babelrc của mình. Tập lệnh xây dựng với parcel-Bundler này đã tạo ra lỗi mã thông báo không mong muốn <và lỗi loại mime trong bảng điều khiển trình duyệt cho tôi khi làm mới trang thủ công.

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

Cập nhật tập lệnh xây dựng đã khắc phục sự cố cho tôi.

"scripts": {
    "build": "parcel build ui/index.html",
    "ui": "parcel watch ui/index.html"
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.