ReactJS: "Nicht erfasster Syntaxfehler: Unerwartetes Token <"


110

Ich versuche, eine Site in ReactJS zu erstellen. Als ich jedoch versuchte, mein JS in eine separate Datei zu stellen, wurde der folgende Fehler angezeigt: "Nicht erfasster Syntaxfehler: Unerwartetes Token <".

Ich habe versucht /** @jsx React.DOM */, oben in die JS-Datei einzufügen, aber es wurde nichts behoben. Unten finden Sie die HTML- und JS-Dateien. Irgendwelche Ideen, was falsch läuft?

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

BEARBEITEN: Ich habe festgestellt, dass ich type="text/jsx"dem Skript-Tag, das meinen Lander-Code enthält , etwas hinzufügen muss . Nachdem ich dies hinzugefügt und neu geladen habe, erhalte ich diese Warnung

"Sie verwenden den JSX-Transformator im Browser. Stellen Sie sicher, dass Sie JSX für die Produktion vorkompilieren - http://facebook.github.io/react/docs/tooling-integration.html#jsx "

gefolgt von diesem Fehler:

"XMLHttpRequest kann die Datei: ///Users/.../lander.js nicht laden. Ursprungsübergreifende Anforderungen werden nur für Protokollschemata unterstützt: http, data, chrome-extension, https, chrome-extension-resource."

Es scheint, dass ich noch etwas tun muss, damit der Browser jsx transform funktioniert, aber ich bin mir nicht sicher, was es ist.

EDIT: OOOOH muss ich es mit MAMP oder so hosten?


Wie fügen Sie Ihre "JS" -Datei ein?
— Quentin

1
Sie müssen zusätzlich den folgenden Skriptcode hinzufügen. <script src = " unpkg.com/@babel/standalone/babel.min.js " > </ script >
— Steven

Update 2019 : Das Hinzufügen type="text/babel"zu dem Skript-Tag, in das ich meine JS-Datei importiere, und das Babel-Skript, das @Steven im obigen Kommentar erwähnt hat, hat für mich funktioniert.
— Syknapse

Antworten:


128

UPDATE - Verwenden Sie stattdessen Folgendes:

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

Fügen Sie type="text/jsx"als Attribut des scriptTags hinzu, das zum Einschließen der JavaScript-Datei verwendet wird, die von JSX Transformer wie folgt transformiert werden muss:

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

Anschließend können Sie MAMP oder einen anderen Dienst verwenden, um die Seite auf localhost zu hosten, sodass alle Einschlüsse funktionieren, wie hier beschrieben .

Vielen Dank für all die Hilfe an alle!


3
python -m SimpleHTTPServer 8080wird häufig verwendet, da Sie keinen persistenten Server wie Apache installieren, ausführen und konfigurieren müssen.
— Brigand

3
Funktioniert perfekt, ich habe gerade den text/jsxAttributwert hinzugefügt
— William

27

JSTransform ist veraltet . Verwenden Sie stattdessen babel.

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

21

Fügen Sie type="text/babel"als Attribut des Skript-Tags Folgendes hinzu:

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

13

Fügen Sie type="text/babel"dem Skript, das die JSX-Datei enthält, Folgendes hinzu und fügen Sie Folgendes hinzu: <script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>


3
Für Version 6: <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>wie hier erwähnt
— user3405291

4

Wenn Sie so etwas haben

Uncaught SyntaxError: embedded: Unexpected token

Sie haben wahrscheinlich an einem Ort wie diesem ein Komma verpasst:

  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
Sofortige Lösung.)
— Zoltán

3

Der Code, den Sie haben, ist korrekt. JSX-Code muss zu JS kompiliert werden:

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


es versucht, jetzt bin ich nur immer „Uncaught Syntaxerror: unerwartetes Token ILLEGAL“
— kat

Verwenden Sie Chrom? Gibt es Ihnen eine Zeilennummer und einen Hinweis auf einen bestimmten Code?
— Stewart715

Mein schlechtes, ich kann keine Zeilenumbrüche machen, ohne ihnen zu entkommen, also musst du sie mit +... aktualisieren. Aktualisiert sollte jetzt funktionieren.
— Stewart715

Jetzt erhalte ich Folgendes: "Nicht erfasster Fehler: Unveränderliche Verletzung: ReactCompositeComponent.render (): Eine gültige ReactComponent muss zurückgegeben werden. Möglicherweise haben Sie undefiniert, ein Array oder ein anderes ungültiges Objekt zurückgegeben." scheint wie eine Zeichenfolge keine gültige reagieren Komponente
— kat

Ah, ich weiß, was hier los ist ... Sie müssen Ihren jsx-Reaktionscode in Javascript kompilieren ... machen Sie das oder laufen Sie direkt im Browser?
— Stewart715

3

Wenn Sie einen Fehler wie diesen erhalten:

SyntaxError: eingebettet: Unerwartetes Token (107: 9) 105

Möglicherweise fehlt Ihnen eine geschweifte Klammer


1

Versuchen Sie es mit einem Webpack, es hat das ähnliche Problem in meinem Projekt gelöst. Speziell der Teil "Presets".

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

0

Ich habe das gleiche Problem mit Ihnen und ich habe etwas auf meinem Server geändert

Sie könnten dies versuchen

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

In der ursprünglichen Frage wurde express.js nicht verwendet. Können Sie erklären, wie das Problem dadurch behoben wird?
— Jonathan Rosa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.