2017-06-26 5 views
1

私は3日間この問題を調査していますが、それを動作させることはできません。Webpack&Babel:Reactコンポーネントのサーバーサイドレンダリング "予期しないトークン" <'"

完全なエラーがある:ここでは

C:\Users\XXXXXX\WebstormProjects\XXXX\server\routes\auth.jsx:58 
    return res.send(ReactDOMServer.renderToString(<LoginPage />)); 
               ^
SyntaxError: Unexpected token < 
    at createScript (vm.js:56:10) 
    at Object.runInThisContext (vm.js:97:10) 
    at Module._compile (module.js:542:28) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 
    at Function.Module._load (module.js:438:3) 
    at Module.require (module.js:497:17) 
    at require (internal/module.js:20:19) 
    at Object.<anonymous> (C:\Users\XXXXXX\WebstormProjects\XXXX\index.js:10:20) 

は私webpack.config.jsです:今

const path = require('path'); 


module.exports = { 
    entry: path.join(__dirname, '/client/src/app.jsx'), 
    output: { 
     path: path.join(__dirname, '/client/dist/js'), 
     filename: 'app.js', 
     publicPath: "/" 
    }, 

    module: { 
     loaders: [{ 
      test: /\.jsx?$/, 
      include: [ 
       path.join(__dirname, '/client/src'), 
       path.join(__dirname, '/server/routes') 

     ], 
      loader: 'babel-loader', 
      query: { 
       babelrc: false, 
       presets: ['es2015', 'stage-2', 'react'] 
      } 
     }], 
    }, 

    devServer: { 
     historyApiFallback: true 
    }, 
    watch: true 
}; 

/server/routes/auth.jsxファイル:

const express = require('express'); 
const validator = require('validator'); 

const router = new express.Router(); 
const React = require('react'); 
const ReactDOMServer = require('react-dom/server'); 
const LoginPage = require('../../client/src/containers/LoginPage.jsx'); 


function validateLoginForm(payload) { 
    const errors = {}; 
    let isFormValid = true; 
    let message = ''; 

    if (!payload || typeof payload.email !== 'string' || payload.email.trim().length === 0) { 
     isFormValid = false; 
     errors.email = 'Please provide your email address.'; 
    } 

    if (!payload || typeof payload.password !== 'string' || payload.password.trim().length === 0) { 
     isFormValid = false; 
     errors.password = 'Please provide your password.'; 
    } 

    if (!payload || typeof payload.password !== 'string' || payload.password.trim().length <= 8) 
    { 
     isFormValid = false; 
     errors.password = 'Please provide a password that\'s more than 8 char'; 
    } 
    if (!isFormValid) { 
     message = 'Check the form for errors.'; 
    } 

    return { 
     success: isFormValid, 
     message, 
     errors 
    }; 
} 

router.post('/login', (req, res) => { 
    console.log("lol"); 
    const validationResult = validateLoginForm(req.body); 
    if (!validationResult.success) { 
     return res.status(400).json({ 
      success: false, 
      message: validationResult.message, 
      errors: validationResult.errors 
     }); 
    } 
    console.log("Went through validationResult without problems"); 
    return res.status(200).end(); 
}); 


router.get('/login', (req, res) => { 
    console.log(req.url); 
    return res.send(ReactDOMServer.renderToString(<LoginPage />)); // THE PROBLEM 
}); 

router.get('/', (req, res) => { 
    console.log(req.url); 
    console.log("lmao") 
}); 


module.exports = router; 

最後に/client/src/containers/LoginPage.jsx:

import React from 'react'; 
import LoginForm from '../components/LoginForm.jsx'; 


class LoginPage extends React.Component{ 

    /** 
    * Class constructor. 
    */ 
    constructor(props) { 
     super(props); 

     // set the initial component state 
     this.state = { 
      errors: {}, 
      user: { 
       email: '', 
       password: '' 
      } 
     }; 

     this.processForm = this.processForm.bind(this); 
     this.changeUser = this.changeUser.bind(this); 
    } 

    /** 
    * Process the form. 
    * 
    * @param {object} event - the JavaScript event object 
    */ 
    processForm(event) { 
     // prevent default action. in this case, action is the form submission event 
     event.preventDefault(); 

     const email = encodeURIComponent(this.state.user.email); 
     const password = encodeURIComponent(this.state.user.password); 
     const formData = `email=${email}&password=${password}`; 

     // create an AJAX request 
     const xhr = new XMLHttpRequest(); 
     xhr.open('post', '/login'); 
     xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
     xhr.responseType = 'json'; 
     xhr.addEventListener('load',() => { 
      if (xhr.status === 200) { 
       // success 

       // change the component-container state 
       this.setState({ 
        errors: {} 
       }); 

       console.log('The form is valid'); 
      } else { 
       // failure 

       // change the component state 
       const errors = xhr.response.errors ? xhr.response.errors : {}; 
       errors.summary = xhr.response.message; 

       this.setState({ 
        errors 
       }); 
      } 
     }); 

     xhr.send(formData); 
    } 

    /** 
    * Change the user object. 
    * 
    * @param {object} event - the JavaScript event object 
    */ 
    changeUser(event) { 
     const field = event.target.name; 
     const user = this.state.user; 
     user[field] = event.target.value; 

     this.setState({ 
      user 
     }); 
    } 

    /** 
    * Render the component. 
    */ 
    render() { 
     return (
      <LoginForm 
       onSubmit={this.processForm} 
       onChange={this.changeUser} 
       errors={this.state.errors} 
       user={this.state.user} 
      /> 
     ); 
    } 

} 

export default LoginPage; 

私は最初にpath.join(__dirname, '/server/routes')を追加して、Webpackとbabelにこのフォルダを検索してjsxをトランスペアレントにするよう指示しましたが、何が問題であっても失敗します。

が、私はそれまでにauth.jsxに return res.send(ReactDOMServer.renderToString(<LoginPage />));を置き換える:これを行うことで、

var html = ReactDOMServer.renderToString(React.createElement(LoginPage)); 
return res.send(ReactDOMServer.renderToString('base', html)); 

しかし、ノードは私にある別のエラーを与える:、再び、transpilingの問題である

C:\Users\XXXXXX\WebstormProjects\XXXX\client\src\containers\LoginPage.jsx:1 
(function (exports, require, module, __filename, __dirname) { import React from 'react'; 
                   ^^^^^^ 
SyntaxError: Unexpected token import 
    at createScript (vm.js:56:10) 
    at Object.runInThisContext (vm.js:97:10) 
    at Module._compile (module.js:542:28) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 
    at Function.Module._load (module.js:438:3) 
    at Module.require (module.js:497:17) 
    at require (internal/module.js:20:19) 
    at Object.<anonymous> (C:\Users\XXXXXX\WebstormProjects\XXXX\server\routes\auth.jsx:8:19) 

auth.jsxでそのルートがないと、ウェブアプリケーションはすべてうまく動作しますが、URL経由でアクセス/ログインできないことを除けば、注意してください。

私は間違っていますか?

私はExpress、React、React Router、Nodeの最新バージョンを使用しています。私のOSは私がここでの問題が何であるかを知っていると思う事前

+0

を修正する必要がありますがhttps://github.com/babel/example-node-server

から鼓舞することができます例ではなく、それ? – atomrc

+0

@atomrc ups、corrected。ありがとう:) –

+0

.jsxファイルが含まれていて、non-es2015コードが含まれている可能性があります。webpack cantが読み取られます –

答えて

2

おかげでWindows 7のです。

jsxファイルを実際にコンパイルすると、webpack.config.jsは完璧なようです(reactのプリセットが含まれているため、うまくいくはずです)。

しかし、clientのためだけにコンパイルされており、サーバー上のコンパイルされていないファイルを消費しようとしています。

ただし、nodejsxを単独で読み取ることはできません。

私がここで提案するオプションは、babelがサーバー側のファイルもコンパイルできるようにするためです。

これを行うには、babel-cliを使用できます。

単にあなたのpackage.json

"scripts": { 
    "start": "babel-node index.js --presets es2015,react" 
} 

でこれを追加し、それが最初babelでファイルをコンパイルし、サーバーを起動する必要があり、この

npm start

ようにあなたのサーバーを起動します。ここで

は、これは、それはあなたが表示されている `webpack.config.js`、ではない` package.json`だあなたの問題

+0

ありがとうございます。実際に投稿したコードの2番目の部分は、最初の問題を解決しました。これは '予期しないトークン<'です。 コードの最初の部分は、ReactとJavascriptの一般的なことを除いて、2番目の問題、「予期しないトークンのインポート」を解決する必要があるため、一度に多くのファイルをWebpackでコンパイルする方法はわかりません。ここに記載されていることをする必要があります: https://webpack.github.io/docs/multiple-entry-points.html? –

+0

私は自分の答えを更新しました。この解決策は、あなたのソースファイルのビットを変更することなく両方の問題を修正する必要があります:) – atomrc

+0

二重コメントを申し訳ありませんが、node-jsxをインストールしようとしても同じエラーが発生しますが、 XXXXXX \ WebstormProjects \ XXXX \ client \ src \ components \ LoginPage.jsx to JS:エラー:Parse Error:行1:不正なインポート宣言 '、エラーが私のコードによって引き起こされた感情を与えるそれを読んで、どこにエラーがあるのか​​わかりません。 –

関連する問題