ReactJS: “Lỗi cú pháp chưa được thông báo: Mã thông báo không mong muốn <”


110

Tôi đang cố gắng bắt đầu xây dựng một trang web trong ReactJS. Tuy nhiên, khi tôi cố gắng đặt JS của mình vào một tệp riêng biệt, tôi bắt đầu gặp lỗi này: "Uncaught SyntaxError: Bất ngờ mã thông báo <".

Tôi đã thử thêm /** @jsx React.DOM */vào đầu tệp JS, nhưng nó không sửa được gì. Dưới đây là các tệp HTML và JS. Bất kỳ ý tưởng về những gì đang xảy ra?

HTML

<html>
  <head>
    <title>Page</title>
    <script src="http://fb.me/react-0.12.2.js"></script>
    <script src="http://fb.me/JSXTransformer-0.12.2.js"></script>
    <script src="http://code.jquery.com/jquery-1.10.0.min.js"> </script>
    <script src="./lander.js"> </script>
  </head>
  <body>
    <div id="content"></div>
    <script type="text/jsx">
        React.render(
            <Lander />,
            document.getElementById('content')
        );
    </script>
  </body>
</html>

JS

/**
 * @jsx React.DOM
 */
var Lander = React.createClass({
    render: function () {
        var info = "Lorem ipsum dolor sit amet... ";
        return(
            <div>
                <div className="info">{info}</div>
            </div>
        );
    }
});

CHỈNH SỬA: Tôi nhận ra rằng tôi cần thêm type="text/jsx"vào thẻ tập lệnh bao gồm mã tàu đổ bộ của tôi. Tuy nhiên, sau khi thêm cái này và tải lại, tôi nhận được cảnh báo này

"Bạn đang sử dụng trình biến áp JSX trong trình duyệt. Hãy nhớ biên dịch trước JSX của bạn để sản xuất - http://facebook.github.io/react/docs/tooling-integration.html#jsx "

tiếp theo là lỗi này:

"XMLHttpRequest không thể tải tệp: ///Users/.../lander.js. Yêu cầu nguồn chéo chỉ được hỗ trợ cho các lược đồ giao thức: http, data, chrome-extension, https, chrome-extension-resource."

Có vẻ như tôi cần phải làm gì đó khác để chuyển đổi jsx của trình duyệt hoạt động, nhưng tôi không chắc đó là gì.

CHỈNH SỬA: OOOOH tôi có cần lưu trữ nó bằng MAMP hay cái gì đó không?


Bạn đang bao gồm tệp "JS" của mình như thế nào?
Quentin

1
Bạn cần thêm mã tập lệnh sau. <script src = " unkg.com/@babel/standalone/babel.min.js " > </script >
Steven

Bản cập nhật năm 2019 : Thêm type="text/babel"vào thẻ tập lệnh nơi tôi đang nhập tệp JS của mình và tập lệnh Babel mà @Steven đã đề cập trong nhận xét ở trên đã hoạt động với tôi.
Syknapse

Câu trả lời:


128

CẬP NHẬT - sử dụng cái này thay thế:

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

Thêm type="text/jsx"làm thuộc tính của scriptthẻ được sử dụng để bao gồm tệp JavaScript phải được chuyển đổi bằng JSX Transformer, như sau:

<script type="text/jsx" src="./lander.js"></script>

Sau đó, bạn có thể sử dụng MAMP hoặc một số dịch vụ khác để lưu trữ trang trên localhost để tất cả các bao gồm hoạt động, như đã thảo luận ở đây .

Cảm ơn mọi người vì tất cả sự giúp đỡ!


3
python -m SimpleHTTPServer 8080thường được sử dụng vì bạn không phải cài đặt, chạy và cấu hình một máy chủ liên tục như apache.
Brigand

3
Hoạt động hoàn hảo, tôi vừa thêm text/jsxgiá trị thuộc tính
William


21

Thêm type="text/babel"làm thuộc tính của thẻ script, như sau:

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

13

Thêm type="text/babel"vào tập lệnh bao gồm tệp .jsx và thêm tệp này: <script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>


3
Đối với phiên bản 6: <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>như đã đề cập trên đây
user3405291

4

Nếu bạn có một cái gì đó giống như

Uncaught SyntaxError: embedded: Unexpected token

Có thể bạn đã bỏ lỡ dấu phẩy ở một nơi như thế này:

  var CommentForm = React.createClass({
  getInitialState: function() {
      return {author: '', text: ''};

  }, // <---- DON'T FORGET THE COMMA

  render: function() {
      return (
      <form className="commentForm">
          <input type="text" placeholder="Nombre" />
          <input type="text" placeholder="Qué opina" />
          <input type="submit" value="Publicar" />
      </form>
      )
  }
  });

2
Giải pháp tức thì.)
Zoltán

3

Mã bạn có là chính xác. Mã JSX cần được biên dịch thành JS:

http://facebook.github.io/react/jsx-compiler.html


thử nó, bây giờ tôi chỉ nhận được "của router Lỗi Cú pháp: Bất ngờ dấu hiệu bất hợp pháp"
kat

bạn đang sử dụng chrome? nó có cung cấp cho bạn số dòng và trỏ đến mã cụ thể không?
pitart715

lỗi của tôi, không thể ngắt dòng mà không thoát chúng, vì vậy bạn cần phải nối chúng với +... cập nhật sẽ hoạt động ngay bây giờ.
pitart715

Bây giờ tôi nhận được thông báo này: "Lỗi chưa tìm thấy: Vi phạm bất biến: ReactCompositeComponent.render (): Phải trả lại ReactComponent hợp lệ. Bạn có thể đã trả về không xác định, một mảng hoặc một số đối tượng không hợp lệ khác." có vẻ như một chuỗi không phải là một giá trị phản ứng thành phần
kat

Ah, tôi biết chuyện gì đang xảy ra ở đây ... bạn cần biên dịch mã phản ứng jsx của mình thành javascript ... bạn đang làm điều đó hay chạy trực tiếp trong trình duyệt?
pitart715

3

Nếu bạn gặp lỗi như sau:

SyntaxError: nhúng: Mã thông báo không mong đợi (107: 9) 105

Có thể bạn đang thiếu một dấu ngoặc nhọn


1

Hãy thử thêm vào webpack, nó đã giải quyết được vấn đề tương tự trong dự án của tôi. Đặc biệt là phần "cài đặt trước".

module: {
    loaders: [
        {
            test: /\.jsx?/,
            include: APP_DIR,
            loader: 'babel',
            query  :{
                presets:['react','es2015']
            }
        },

0

Tôi gặp vấn đề tương tự với bạn và tôi đã thay đổi một số thứ trong máy chủ của mình

bạn có thể thử cái này

const root = require("path").join(__dirname, "./build");
app.use(express.static(root));
app.get("*", (req, res) => {
  res.sendFile("index.html", { root });
});

Câu hỏi ban đầu không sử dụng express.js; bạn có thể giải thích cách này khắc phục sự cố không?
Jonathan Rosa
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.