2017-07-07 11 views
2

私はReact/Expressアプリケーションのサーバーサイドレンダリングを設定しようとしていますが、 react-dom/serverrenderToString()メソッド。私は緩くこのチュートリアル以下のよ - http://crypt.codemancers.com/posts/2016-09-16-react-server-side-rendering/React/Express - renderToString()の呼び出しで '予期しないトークン<'が発生しました

index.js(エクスプレスアプリのルート):

const appHtml = reactDomServer.renderToString(<RouterContext {...props}/>) 
              ^
SyntaxError: Unexpected token < 

私がきた同様の例のすべて:しかし

'use strict' 
require('babel-register')({ 
    presets: ['es2015', 'react'] 
}); 

const express = require('express') 
const path = require('path') 
const app = express() 
const React = require('react') 
const reactDomServer = require('react-dom/server') 
const routes = require('./src/routes.jsx') 
const reactRouter = require('react-router') 
let { match, RouterContext } = reactRouter 

app.get('*', (req, res) => { 
    match({ routes: routes, location: req.url }, (err, redirect, props) => { 
     const appHtml = reactDomServer.renderToString(<RouterContext {...props}/>) 
     res.send(renderPage(appHtml)) 
    }) 
}) 

を、これはエラーが発生します真っ直ぐなJSXコンポーネントがドロップされているのを見ました...私は何が欠けていますか?

答えて

4

babel-registerは、それが呼び出されたファイルを処理https://stackoverflow.com/a/29425761/1795821

あなたは別のファイルに呼ばれるapt.get()を入れ、またはロードバベルの異なる方法を使用する必要があります表示されません。

ので、あなたに感謝し、素晴らしいことだその代わり

let renderReact = require('./renderReact.js'); 
renderReact(app); 
2

この問題は、babel-registerが必要なのは、インポートするファイルでは機能しませんが、後でインポートするファイルでは問題になると思います。したがって、のJSX構文はrenderToStringメソッドでは選択されません。とにかく私にはまったく感じられなかった文法のためにこれは前に、そしてbabel-registerを含めて私に起こった。

私が個人的にやったことは他にもたくさんあります:readDomServer.renderToString(React.createElement(RoutingContext, props))createElementをReactで使用すると、同じことを達成できます。これはあなたの問題を解決します。

+0

これを行うバックあなたのindex.jsで次に

module.exports = function(app) { app.get('*', (req, res) => { match({ routes: routes, location: req.url }, (err, redirect, props) => { const appHtml = reactDomServer.renderToString(<RouterContext {...props}/>) res.send(renderPage(appHtml)) }) }) } 

で新しいrenderReact.jsファイルを作ります!私はそれが特に 'babel-register'の正しい振る舞いに対処するので、私は他の答えを受け入れましたが、これは良い答えでもあります。私はおそらく私の実際のアプリでこれを使用します。 – skwidbreth

+0

問題はありません@skwidbrethあなたが解決策を見つけてうれしく思います。 –

関連する問題