【问题标题】:Server-side rendering with React.js使用 React.js 进行服务器端渲染
【发布时间】:2016-06-21 22:19:19
【问题描述】:

我无法使用 Reactjs 服务器端呈现我的语义。它没有语义,因此我的反应服务器端代码没有问题。 服务器崩溃并给出错误的开始行:

/Users/isik/Dev/portfolio/reactjs-server-side-rendering/node_modules/semantic-ui-dropdown/index.js:3443
})( require("jquery"), window, document );
                       ^

ReferenceError: window is not defined

我已经用 npm 安装了 jquery。最后还尝试安装jsdom版本jsdom@3.1.2。没有任何效果。

我在semantic-ui 网页中使用Recipes-Server-side rendering

我用于服务器端组件的代码如下:

var React = require('react');
var jquery = require('jquery');
var dropdown = require('semantic-ui-dropdown');

// Can use JSX too
var Component = React.createClass({
    componentDidMount: function () {
        $('.ui.dropdown').dropdown();
    },
    componentDidUpdate: function () {
        $('.ui.dropdown').dropdown('refresh');
    },
    render: function(){
        return(
                <div className="ui selection dropdown">
                    <input type="hidden" name="gender"/>
                    <i className="dropdown icon"></i>
                    <div className="default text">Gender</div>
                    <div className="menu">
                        <div className="item" data-value="1">Male</div>
                        <div className="item" data-value="0">Female</div>
                    </div>
                </div>
        );
    }
});

module.exports.Component = Component;

这是使用语义 ui 进行服务器端渲染的普遍已知问题还是我做错了?

【问题讨论】:

    标签: jquery node.js reactjs semantic-ui server-side-rendering


    【解决方案1】:

    试试这个:

    componentDidMount: function () {
        var dropdown = require('semantic-ui-dropdown');
        $('.ui.dropdown').dropdown();
    },
    

    我认为调用 require('semantic-ui-dropdown') 需要在 DOM 中初始化现有的 window

    并从文件顶部删除实际的require('semantic-ui-dropdown')

    【讨论】:

    • 会不会和客户端发生冲突?客户端有一个完整的语义用户界面,客户端组件使用它,服务器端渲染的组件也可以使用它,我已经检查过了。
    • 也许吧。我不能说。这取决于它的用途。它可以覆盖现有的客户端“semantic-ui”定义。可能是github帖子会给出更多关于它为什么不起作用的答案:)
    • 不需要 jquery 和单独的语义 ui 组件进行服务器端渲染,如上述配方中所述,并且无需使用语义 ui 生命周期方法添加 jquery,因为在客户端服务器端渲染进入某个地方我将语义 UI javascript 和样式表链接到 index.html 以进行客户端工作。可以这样使用它,以避免在服务器端使用它们吗?在服务器端避免 jquery 和语义 UI 的东西,只注意正确的语义 UI 类名。
    • 或者你描述的方式是必须的。通过我的方式避免可能会导致 React 在页面加载时重新渲染,因为客户端渲染组件与服务器端渲染组件不同,缺少 dropdown() 等方法,因此失去了服务器端渲染的好处,渲染使用它毫无意义。
    • 我同意,保持双方渲染相同以保持服务器端渲染的好处很重要