在服务器端重现组件呈现,但客户端不接管

时间:2015-06-05 22:38:19

标签: javascript node.js reactjs ejs isomorphic-javascript

我有一个EJS视图,它提供给客户:

index.ejs

<!DOCTYPE html>
<html>
    <head>
        <title>Example app</title>
    </head>
    <body>
        <div id="reactApp">
            <%- reactContent %>
        </div>
    </body>
    <script src="__res__/client/main.bundle.js" />
</html>

main.bundle.js是我使用browserify创建的包:

gulpfile.js(部分)

function bundle(filename) {
    var bundler = browserify('./app/client/' + filename + '.js');

    bundler.transform(babelify);
    bundler.transform(reactify);

    return bundler.bundle()
        .pipe(source(filename + '.bundle.js'))
        .pipe(buffer())
        .pipe(uglify())
        .pipe(gulp.dest('./dist/client'));
}

客户最终会获得此代码:

main.js(捆绑到main.bundle.js)

import React from 'react';
import {Login} from './auth/login.react';

React.render(React.createElement(Login), document.getElementById('reactApp'));
alert('hi');

但是,即使浏览器请求并收到main.bundle.js脚本,客户端也不会运行alert('hi');行,这会让我相信React.render行不起作用。我可以确认Javascript已启用,我的浏览器是Chrome的最新版本。我的反应组件(Login)如下:

login.react.js

import React from 'react';

export class Login extends React.Component
{
    handleClick() {
        alert('Hello!');
    }

    render() {
        console.log('rendered');
        return (
            <button onClick={this.handleClick}>This is a React component</button>
        );
    }
}

所以,非常简单。但是,您在代码中看到的警报都不会运行。 console.log('rendered');行永远不会在服务器上运行,但当我检查我的页面的源代码时,我得到:

我页面的HTML输出

<!DOCTYPE html>
<html>
    <head>
        <title>Example app</title>
    </head>
    <body>
        <div id="reactApp">
            <button data-reactid=".2fqdv331erk" data-react-checksum="436409093">Lel fuck u</button>
        </div>
    </body>
    <script src="__res__/client/main.bundle.js" />
</html>

这意味着服务器正确呈现了我的react组件,但为什么客户端脚本不起作用? handleClick函数永远不会运行,我的console.log行永远不会运行,alert行也不会运行。怎么了?正确呈现了reactid和校验和,它不应该正常工作吗?客户端的React代码是否应该足够聪明才能找到组件并正确运行?

1 个答案:

答案 0 :(得分:1)

在index.ejs中,向脚本代码添加结束元素可以解决问题:<script src="__res__/client/main.bundle.js"></script>

另外,在我的测试中,我在加载页面时在login.react.js中收到错误,直到我将默认添加到导出行:export default class Login extends React.Component。不确定你是否需要这样做。