javascript - 使用服务器端渲染和 React-Router-v4 的 Webpack 2 代码拆分

标签 javascript node.js reactjs universal code-splitting

使用 webpack2.2.0-rc1 和 react routerv4,并使用这个 gist使代码拆分工作,说明如下

function asyncComponent(getComponent) {
  return class AsyncComponent extends React.Component {
    static Component = null;
    state = { Component: AsyncComponent.Component };

    componentWillMount() {
      if (!this.state.Component) {
        getComponent().then(Component => {
          AsyncComponent.Component = Component
          this.setState({ Component })
        })
      }
    }
    render() {
      const { Component } = this.state
      if (Component) {
        return <Component {...this.props} />
      }
      return null
    }
  }
}

const Foo = asyncComponent(() =>
  System.import('./Foo').then(module => module.default)
)

它确实有效,但我使用的是服务器端渲染。所以在服务器上我需要组件 A,然后在客户端上我需要 System.import 组件 A。 最后,当我访问延迟加载的路由时,我得到了这个 react 重用标记警告,因为客户端呈现了 最初从 https://gist.github.com/acdlite/a68433004f9d6b4cbc83b5cc3990c194#file-app-js-L21 加载 null 在加载组件 A 时。 Warning: React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server: (client) CO 0.0.0 </h1></div><!-- react-empty: 6 - (server) CO 0.0.0 </h1> </div><div data-radium="tru

我怎样才能使这项工作没有错误?

最佳答案

我刚刚更改了这个 line在 AsyncComponent 上使其返回制动标记
而代码拆分组件尚未加载。然后不需要实际组件呈现服务器端,我只是抛出另一个制动标记,因此标记实际上匹配。

这远非理想

export function Shell(Component) {
    return React.createClass({
        render: function () {
            return (
                <div>
                    <Bar/>
                    <Component {...this.props}/>
                </div>
            );
        }
    });
};

export const Waiting = React.createClass({
    render: function () {
        return (
            <div>
                <Bar/>
                <br/>
            </div>
        );
    }
});


// Client routes
const AsyncDash = Utils.asyncRoute(() => System.import("../components/dashboard/dashboard.tsx"));
const AsyncLogin = Utils.asyncRoute(() => System.import("../components/login/login"));

const routes = () => {
    return (<div>
            <Match exactly pattern="/" component={Shell(AsyncLogin)}/>
            <Match exactly pattern="/dashboard" component={Shell(AsyncDash)}/>
        </div>
    );
};


// Server routes
const routes = () => {
    return (<div>
            <Match exactly pattern="/" component={Waiting}/>
            <Match exactly pattern="/dashboard" component={Waiting}/>
        </div>
    );
};

关于javascript - 使用服务器端渲染和 React-Router-v4 的 Webpack 2 代码拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41748101/

相关文章:

javascript - 如何在 Javascript 上创建函数后更改接受的参数?

node.js - 将 Socket.io 与 Sequelize 结合使用

javascript - 在 jsfiddle 中运行 react-tippy

javascript - 当使用 this.props.children 呈现子项时,React 上下文未定义

javascript - 使用 Styled-Components,如何在 Styled Component 之外设置颜色数组?

javascript - js中括号错误

javascript - 使用 Devbridge Autocomplete,有没有办法检测到没有结果?

javascript - JS新手: how to execute part of the HTML after clicking on a button

javascript - Angular 模板解析错误 : The pipe could not be found

javascript - Slack API 不返回私有(private) channel