2017-12-26 24 views
0

私は複数のルートを持つSPAを持っています。 Webpack 2とReact Router 4を使用したルートに基づいてコード分割を実装しようとしています。ルートに基づいて異なるチャンクを作成することができます。たとえば、ホームページの場合はvendor.jsmain.jshome.jsです。 3つのファイルはすべて正常に読み込まれますが、出力は表示されません。 nullがレンダリングされています。以下は、React developerツールと使用されたコードのスクリーンショットです。私はここに何が欠けているのか分かりますか?リアクター・ルータ|コンポーネントがレンダリングされない

enter image description here

アプリケーションコンポーネント/ App.js

import React, { Component } from 'react'; 
import { BrowserRouter, Route, Switch } from 'react-router-dom'; 
import NotificationContainer from '../containers/NotificationContainer'; 

class App extends Component { 
    constructor(props) { 
     super(props); 
    } 

    render() { 
     return (
      <div> 
       <NotificationContainer /> 
       <BrowserRouter> 
        <Switch> 
         <Route 
          exact 
          path="/" 
          getComponent={(nextState, callback) => { 
           // import('./homepage/index').then(module => callback(null, module.default)); 
           require.ensure(
            [], 
            require => { 
             callback(null, require('./homepage/index').default); 
            }, 
            'home' 
           ); 
          }} 
         /> 
         <Route 
          path="/login" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/LoginContainer'], 
            require => { 
             require('../containers/LoginContainer'); 
            }, 
            'login' 
           ); 
          }} 
         /> 
         <Route 
          path="/forgetPassword" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/ForgetPasswordContainer'], 
            require => { 
             require('../containers/ForgetPasswordContainer'); 
            }, 
            'forgetPassword' 
           ); 
          }} 
         /> 
         <Route 
          path="/generateNewPassword" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/GenerateNewPasswordContainer'], 
            require => { 
             require('../containers/GenerateNewPasswordContainer'); 
            }, 
            'generateNewPassword' 
           ); 
          }} 
         /> 
         <Route 
          path="/signup" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/SignupContainer'], 
            require => { 
             require('../containers/SignupContainer'); 
            }, 
            'signup' 
           ); 
          }} 
         /> 
         <Route 
          path="/contact" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['./Contact'], 
            require => { 
             require('./Contact'); 
            }, 
            'contact' 
           ); 
          }} 
         /> 
         <Route 
          path="/tech" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['./Tech'], 
            require => { 
             require('./Tech'); 
            }, 
            'tech' 
           ); 
          }} 
         /> 
         <Route 
          path="/error" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['./Error'], 
            require => { 
             require('./Error'); 
            }, 
            'error' 
           ); 
          }} 
         /> 
         <Route 
          path="/user/dashboard" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/DashBoardContainer'], 
            require => { 
             require('../containers/DashBoardContainer'); 
            }, 
            'dashboard' 
           ); 
          }} 
         /> 
         <Route 
          path="/movie/:movieId" 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['../containers/MovieContainer'], 
            require => { 
             require('../containers/MovieContainer'); 
            }, 
            'movieContainer' 
           ); 
          }} 
         /> 
         <Route 
          getComponent={(nextState, callback) => { 
           require.ensure(
            ['./Error'], 
            require => { 
             require('./Error'); 
            }, 
            'error' 
           ); 
          }} 
         /> 
        </Switch> 
       </BrowserRouter> 
      </div> 
     ); 
    } 
} 

export default App; 

WebPACKのコンフィグ

const webpack = require('webpack'); 
var BundleTracker = require('webpack-bundle-tracker'); 
var BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; 

module.exports = { 
    entry: './src/index.js', 
    output: { 
     path: __dirname + '/public/assets/js', 
     filename: '[name].js', 
     chunkFilename: '[name].js', 
     publicPath: 'assets/js/' 
    }, 
    plugins: [ 
     new BundleTracker({ filename: './webpack-stats.json' }), 
     new webpack.DefinePlugin({ 
      'process.env': { 
       NODE_ENV: JSON.stringify('production') 
      } 
     }), 
     new webpack.optimize.CommonsChunkPlugin({ 
      name: 'vendor', 
      filename: '[name].js', 
      minChunks: module => /node_modules/.test(module.resource) 
     }), 
     new webpack.LoaderOptionsPlugin({ 
      minimize: true, 
      debug: false 
     }), 
     new webpack.optimize.UglifyJsPlugin({ 
      beautify: false, 
      mangle: { 
       screw_ie8: true, 
       keep_fnames: true 
      }, 
      compress: { 
       screw_ie8: true, 
       warnings: false 
      }, 
      comments: false 
     }), 
     new BundleAnalyzer({ analyzerMode: 'static' }) 
    ], 
    resolve: { 
     modules: ['node_modules'], 
     extensions: ['*', '.js', '.jsx'] 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.js$/, 
       loader: 'babel-loader', 
       options: { 
        plugins: [ 
         [ 
          'transform-semantic-ui-react-imports', 
          { 
           convertMemberImports: true, 
           addCssImports: false, 
           importMinifiedCssFiles: false, 
           addLessImports: false, 
           addDuplicateStyleImports: false 
          } 
         ] 
        ], 
        presets: [['es2015', { modules: false }], 'react', 'stage-2', 'node6'] 
       } 
      } 
     ] 
    }, 
    node: { 
     console: true, 
     fs: 'empty', 
     net: 'empty', 
     tls: 'empty' 
    } 
}; 

ホームコンポーネント|コンポーネントがルートに戻されないように、ホームページ/ index.js

import React, { Component, PropTypes } from 'react'; 
import LayoutContainer from '../../containers/LayoutContainer'; 
import Hero from './Hero'; 
import About from './About'; 
import Working from './Working'; 

class Homepage extends Component { 
    render() { 
     return (
      <LayoutContainer scrollBound={600}> 
       <div className="homepage-container"> 
        <p>Here</p> 
        <Hero /> 
        <About /> 
        <Working /> 
       </div> 
      </LayoutContainer> 
     ); 
    } 
} 

export default Homepage; 

答えて

0

react-routerのドキュメントは、大きな脂肪の嘘つきでなければ、ルートのgetComponentメソッドは、もはやありません。しかし、自分のレイジーローディングコンポーネントをローリングすることはそれほど悪くありません。私はよりエキゾチックなルータのために1つをしなければならなかった、そしてこのアプローチは同様に[email protected]のために働くはずです。まず、簡単なHOC作成:

export default function DeferredComponent(loadingFn) { 
    return class DeferredComponentInstance extends React.Component { 
    constructor() { 
     super(...arguments); 
     this.state = { 
     InnerComponent: Spinner 
     }; 
    } 

    componentDidMount() { 
     loadingFn((err, component) => { 
     if (err) { 
      throw err; // Maybe render an error component instead? 
     } 

     this.setState({ InnerComponent: component }); 
     }); 
    } 

    render() { 
     const { InnerComponent } = this.state; 
     return <InnerComponent { ...this.props }/>; 
    } 
    }; 
} 

を...そして今、あなたはこのようにそれを使用することができます:

<Route 
    path="/login" 
    component={DeferredComponent(cb => { 
    require.ensure(['../containers/LoginContainer'], require => { 
     cb(null, require('../containers/LoginContainer').default); 
    }); 
    })} 
/> 
私は `/`まだ家ルートのように `ヌルにコールバックを呼び出しています
+0

はい、 'getComponent'は実際には現在サポートされていないと思います。ウェブはチュートリアルでいっぱいですが。どのように私はそれを動作させるために私自身のいくつかのバリエーションでこれを使用しました。ありがとう! – Yomesh

1

あなたは、すべてのケースでcallbackを呼び出していません。たとえば、この:

<Route 
    path="/login" 
    getComponent={(nextState, callback) => { 
    require.ensure(['../containers/LoginContainer'], require => { 
     require('../containers/LoginContainer'); 
    }, 'login'); 
    }} 
/> 

が...次のようになります。

<Route 
    path="/login" 
    getComponent={(nextState, callback) => { 
    require.ensure(['../containers/LoginContainer'], require => { 
     callback(null, require('../containers/LoginContainer')); 
    }, 'login'); 
    }} 
/> 
+0

'がレンダリングされています。 – Yomesh

+0

私は 'getComponent'のドキュメントを見つけようとしていますが、私はそれを見ません。おそらく '反応ルータ 'のためにはもううまくいきません。 – Jacob

関連する問題