Webpack&Babel:Reactコンポーネントのサーバー側レンダリング「予期しないトークン '<'」

ゲタンボヤル

この問題を3日間調査していますが、機能しません。

完全なエラーは次のとおりです。

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をトランスパイルするように指示するために、最初にを追加しましたが、何があっても失敗します。

次にreturn res.send(ReactDOMServer.renderToString(<LoginPage />));、auth.jsxを次のように置き換えました。

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

しかし、これを行うことにより、ノードは私に別のエラーを与えます:

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経由で/ loginにアクセスできないことを除いて、Webアプリはすべて正常に機能することに注意してください。

私は何が間違っているのですか?

Express、React、React Router、Nodeの最新バージョンを使用しています。私のOSはWindows7です。

前もって感謝します

アトムルク

私はここで何が問題なのか知っていると思います。

あなたは確かにあなたのjsxファイルをコンパイルし、あなたwebpack.config.jsは完璧に見えます(それはreactプリセットを含んでいるので、それはうまくいくはずです)。

しかし、あなたはclientそれが見えるようにコンパイルしているだけであり、サーバー上のコンパイルされていないファイルを消費しようとしています。

しかし、それだけでnode読むことはできませんjsx

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

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

これをあなたの中に追加するだけです package.json

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

そして、このようにサーバーを起動します

npm start

次に、最初にファイルをコンパイルしbabelてサーバーを起動する必要があります。

https://github.com/babel/example-node-serverからインスピレーションを得られる例を次に示します

これで問題が解決するはずです

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

React コンポーネントをレンダリングするときの予期しないトークン

分類Dev

Reactサーバーサイドレンダリング予期しないトークン、JSXおよびBabel

分類Dev

コンポーネントの予期しない再レンダリング

分類Dev

react-routerはサーバー側でコンポーネントをレンダリングしません

分類Dev

React-サーバー側コンポーネントのレンダリング

分類Dev

モジュール解析に失敗しました:Reactコンポーネントレンダリングで予期しないトークン

分類Dev

ReactJs.NET-サーバー側コンポーネントレンダリングを使用したScriptBundling

分類Dev

ReactコンポーネントがAxiosリクエストの応答をレンダリングしない

分類Dev

クライアント側とサーバー側の両方のレンダリングで同形コンポーネントを反応させる

分類Dev

React / Routerがコンポーネントをレンダリングしない

分類Dev

React / Routerがコンポーネントをレンダリングしない

分類Dev

React SSR:サーバー上でレンダリングされるコンポーネントのクライアント側レンダリングを防止します

分類Dev

特定のコンポーネントをレンダリングしないReactルータースイッチ

分類Dev

Reactコンポーネントの予期しないトークン '='

分類Dev

親でsetStateをトリガーしないReactルートレンダリングコンポーネント

分類Dev

Gulp、Vue、Webpack、Babel、Uncaught SyntaxError:予期しないトークンのインポート

分類Dev

SyntaxError:予期しないトークンのインポートWebpack 2 Babel 6 Reactjs

分類Dev

最初にクリックして、reactでコンポーネントを再レンダリングしない

分類Dev

コンポーネントをレンダリングしないルート

分類Dev

React-ルータースイッチコンポーネントが同じパスのコンポーネントをレンダリングしない

分類Dev

非同期データを使用してReactサーバー側でコンポーネントをレンダリングする方法

分類Dev

React-子ではないコンポーネントをクリックするとコンポーネントをレンダリングします

分類Dev

ルーターリゾルバーがコンポーネントをレンダリングしない

分類Dev

Reactコンポーネントが最新バージョンでレンダリングされない

分類Dev

Reactルーターが正しいコンポーネントをレンダリングしない

分類Dev

コンポーネントを再レンダリングしないreduxレデューサー

分類Dev

邪悪な eval を使用しない React コンポーネントの動的レンダリング

分類Dev

レンダリングされないReactコンポーネント

分類Dev

コンポーネントがレンダリングされない-DynamicRouting React

Related 関連記事

  1. 1

    React コンポーネントをレンダリングするときの予期しないトークン

  2. 2

    Reactサーバーサイドレンダリング予期しないトークン、JSXおよびBabel

  3. 3

    コンポーネントの予期しない再レンダリング

  4. 4

    react-routerはサーバー側でコンポーネントをレンダリングしません

  5. 5

    React-サーバー側コンポーネントのレンダリング

  6. 6

    モジュール解析に失敗しました:Reactコンポーネントレンダリングで予期しないトークン

  7. 7

    ReactJs.NET-サーバー側コンポーネントレンダリングを使用したScriptBundling

  8. 8

    ReactコンポーネントがAxiosリクエストの応答をレンダリングしない

  9. 9

    クライアント側とサーバー側の両方のレンダリングで同形コンポーネントを反応させる

  10. 10

    React / Routerがコンポーネントをレンダリングしない

  11. 11

    React / Routerがコンポーネントをレンダリングしない

  12. 12

    React SSR:サーバー上でレンダリングされるコンポーネントのクライアント側レンダリングを防止します

  13. 13

    特定のコンポーネントをレンダリングしないReactルータースイッチ

  14. 14

    Reactコンポーネントの予期しないトークン '='

  15. 15

    親でsetStateをトリガーしないReactルートレンダリングコンポーネント

  16. 16

    Gulp、Vue、Webpack、Babel、Uncaught SyntaxError:予期しないトークンのインポート

  17. 17

    SyntaxError:予期しないトークンのインポートWebpack 2 Babel 6 Reactjs

  18. 18

    最初にクリックして、reactでコンポーネントを再レンダリングしない

  19. 19

    コンポーネントをレンダリングしないルート

  20. 20

    React-ルータースイッチコンポーネントが同じパスのコンポーネントをレンダリングしない

  21. 21

    非同期データを使用してReactサーバー側でコンポーネントをレンダリングする方法

  22. 22

    React-子ではないコンポーネントをクリックするとコンポーネントをレンダリングします

  23. 23

    ルーターリゾルバーがコンポーネントをレンダリングしない

  24. 24

    Reactコンポーネントが最新バージョンでレンダリングされない

  25. 25

    Reactルーターが正しいコンポーネントをレンダリングしない

  26. 26

    コンポーネントを再レンダリングしないreduxレデューサー

  27. 27

    邪悪な eval を使用しない React コンポーネントの動的レンダリング

  28. 28

    レンダリングされないReactコンポーネント

  29. 29

    コンポーネントがレンダリングされない-DynamicRouting React

ホットタグ

アーカイブ