2017-01-19 3 views
5

Использования webpack2.2.0-rc1 и реагировать routerv4, и с помощью этого gist, чтобы сделать код spliting работать, в котором говорится следующееWebpack 2 Код Spliting с сервером Side Rendering и React-маршрутизатор-v4

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) 
) 

It на самом деле работает, но я использую рендеринг на стороне сервера. Поэтому на сервере мне нужен компонент A, а затем на клиентском компоненте I System.import A. FInally, когда я обращаюсь к ленивому загруженному маршруту, я получаю это предупреждение о повторной загрузке повторного использования, потому что клиент, получивший , первоначально загрузил нуль от https://gist.github.com/acdlite/a68433004f9d6b4cbc83b5cc3990c194#file-app-js-L21 при загрузке компонента 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

Как я могу сделать эту работу без ошибок?

ответ

0

Я только изменил это line на AsyncComponent, чтобы сделать его вернуть тормозной тег
в то время как код-расщепленной компонента не загружается yet.Then вместо того, чтобы требовать фактического компонента для визуализации на сторону сервера, я просто бросить другой тормозной тег , поэтому разметка фактически соответствует.

Это далеко от идеала

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> 
    ); 
}; 
+0

Сталкивались ли Вы решение для этого? –

+2

Много решений. React-async-component, старый хак. Только не надо. Перезаряжаемый, новый взлом. React-универсальный компонент еще лучше нового взлома. – CESCO

Смежные вопросы