2016-11-14 5 views
2

내 경로가 jsx로 매핑됩니다. 내가 물건을 번들 webpack을 사용하고 경로에 따라 청크로 출력 js 파일을 분할하고 싶습니다.반응 라우터 jsx를 사용하는 웹팩 코드 분할

나는 require.ensure를 시도했지만 webpack은 아무것도 분할하지 않았다. 결국에는 하나의 번들 파일 만 생성합니다. 내가 여기서 잘못하고있는 것이 확실하지 않습니다. 나는 루트가 사는 곳을 2 곳 유지하고 싶지 않습니다. 이상적으로 webpack은 이미 정의 된 경로를 사용합니다.

export const renderRoutes =() => (
    <Provider store={store}> 
    <Router history={history}> 
     <Route path='en' component={AppContainer}> 
     <Route path='cart' getComponent={(location, cb) => { 
     require.ensure([], (require) => { 
      cb(null, require('./Cart/CartContainer')); 
     }); 
     }}/> 
     <Route path='checkout'> 
      <Route path='shipping_address' component={ShippingAddressFormContainer} /> 
      <Route path='delivery_options' component={DeliveryOptionFormContainer} /> 
      <Route path='payment' component={PaymentContainer} /> 
      <Route path='review_order' component={ReviewOrderContainer} /> 
      <Route path='confirmation' component={ConfirmationContainer} /> 
     </Route> 
     </Route> 
    </Router> 
    </Provider> 
); 

render(
    renderRoutes(), 
    document.getElementById('react-root') 
); 

gruntfile 설정 :

dev: { 
     entry: [ 
      './<%= paths.src %>/javascripts/react/containers/Root' 
     ], 
     output: { 
      path: path.join(__dirname, '<%= paths.dist %>/javascripts'), 
      filename: 'bundle.js', 
      chunkFilename: '[id].chunk.js', 
      publicPath: '/en/' 
     }, 
     devtool: 'cheap-module-source-map', 
     plugins: [ 
      new webpack.optimize.CommonsChunkPlugin('bundle.js'), 
      new webpack.optimize.OccurrenceOrderPlugin(), // Chunk ids by occurrence count. Ids that are used often get lower (shorter) ids. 
      new webpack.DefinePlugin({ 
      'process.env': { 
       'NODE_ENV': JSON.stringify('development') 
      } 
      }) 
     ], 
     module: { 
      preLoaders: [ 
      { 
       test: /\.json$/, 
       loader: 'json' 
      }, 
      ], 
      loaders: [ 
      { 
       test: /\.js$/, 
       loaders: ['babel'], 
       exclude: /node_modules/, 
       include: __dirname 
      } 
      ] 
     } 
     }, 

dev에 작업 출력

 Asset  Size Chunks    Chunk Names 
    bundle.js 2.76 MB 0, 1, 0 [emitted] bundle.js, main 
bundle.js.map 3.17 MB 0, 1, 0 [emitted] bundle.js, main 

나는 몇 자습서를 읽을 수 있지만,이 경우는 너무 일반적이지 보인다. 때문에 때 (첫 번째 라인)을 import CartContainer,

// ... Some imports here 
import CartContainer from './Cart/CartContainer'; 
// ... More imports here 

export const renderRoutes =() => (
    <Provider store={store}> 
     <Router history={history}> 
      // Some other routes here 
      <Route path='cart' getComponent={(location, cb) => { 
       require.ensure([], (require) => { 
        cb(null, require('./Cart/Container').default); 
       }); 
      }} /> 
     </Router> 
    </Provider> 
); 

지금 당신이 그것을 볼 수 있지만 웹팩를 "속여"야 : 당신의 코드에서

+0

코드가 정확하다고 보입니다. 질문에 대한 자세한 내용을 업데이트하십시오. 오류가있는 것과 같습니다. 빌드 단계는 무엇입니까? 빌드 폴더를 확인 했습니까? 나는 이것을 재현하려했기 때문에 이것을 요구하고 있으며, 당신이 원하는 것을 성취 할 수있었습니다. –

+0

둘러보기 주셔서 감사합니다! 업데이트 된 코드에 오류가 없습니다. 당신은 모든 경로에서 require.ensure를 사용해야한다고 생각합니까? 카트 경로에서 요구되는 시간을 할 때 적어도 한 번 덩어리가 나올 것이라고 예상했을 것입니다. – Stefanie

+0

너무 이상합니다. 한가지 더 궁금한 점은'./<%= paths.src %>/javascripts/react/containers/Root'는 'main'파일입니까? Btw, 원하는 경로 만 분리 할 수 ​​있습니다. 테스트에서 하나의 경로에 대해서만 하나의 청크를 생성했습니다. –

답변

2

I talked to OP in chat, he showed me his entire code and I figured it out!

, 당신은 그런 일이 , 당신은 "ok,이 덩어리 (메인)는 CartContainer을 가지고 있습니다. 번들에 추가하십시오"라고 말하고있는 것입니다. 그런 다음 require.ensure을 사용하면 webpack은이 종속성이로드되었음을 이미 알고 있으므로 (메인 청크로 갔다) 다른 분할로 분할 할 필요가 없습니다.

첫 번째 가져 오기를 제거하기 만하면 webpack은 CartContainer을 별도의 청크에 넣으 려한다는 사실을 알게됩니다! babel을 사용하고 있으므로이 여분의 청크가 필요할 때 .default을 추가해야합니다.

희망이 있습니다.

+1

이것은 그 것이었다! 당신의 고집과 도움에 감사드립니다! – Stefanie