reactjs – 使用webpack和react-router进行延迟加载和代码分割无法加载

前端之家收集整理的这篇文章主要介绍了reactjs – 使用webpack和react-router进行延迟加载和代码分割无法加载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力将我的react v0.14 redux v3.0 react-router v1.0代码库从客户端渲染转移到服务器端渲染,使用webpack v1.12捆绑和代码分割成块来加载路由和组件一经请求.

我跟随并将我的设置基于https://github.com/rackt/example-react-router-server-rendering-lazy-routes,因为我认为它提供了简单性和出色的实用程序.整天昨天我一直在努力转向服务器端渲染,但我遇到了一些我无法解决的问题,我不能完全确定它们是否因为webpack没有正确设置,如果我正在做在服务器/客户端或路由配置上的react-router出了什么问题,或者如果我设置了导致这些问题的redux的错误.

我遇到了以下问题:

>我能够加载初始页面,一切运行良好,但没有其他路线加载,并给了我GET http://localhost:3000/profile 404 (Not Found)
>索引/主页javascript可以工作,但所有资产(css)都呈现为text / javascript,因此样式不会显示,除非它们是内联的.

webpack.config.js

  1. var fs = require('fs')
  2. var path = require('path')
  3. var webpack = require('webpack')
  4.  
  5. module.exports = {
  6.  
  7. devtool: 'source-map',entry: './client/client.jsx',output: {
  8. path: __dirname + '/__build__',filename: '[name].js',chunkFilename: '[id].chunk.js',publicPath: '/__build__/'
  9. },module: {
  10. loaders: [
  11. {
  12. test: /\.jsx?$/,exclude: /(node_modules|bower_components)/,loader: 'babel-loader'
  13. }
  14. ]
  15. },plugins: [
  16. new webpack.optimize.OccurenceOrderPlugin(),new webpack.optimize.DedupePlugin(),new webpack.optimize.UglifyJsPlugin({
  17. compressor: { warnings: false },}),new webpack.DefinePlugin({
  18. 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
  19. })
  20. ]
  21.  
  22. }

server.js

  1. import http from 'http';
  2. import React from 'react';
  3. import {renderToString} from 'react-dom/server';
  4. import { match,RoutingContext } from 'react-router';
  5. import {Provider} from 'react-redux';
  6. import configureStore from './../common/store/store.js';
  7.  
  8. import fs from 'fs';
  9. import { createPage,write,writeError,writeNotFound,redirect } from './server-utils.js';
  10. import routes from './../common/routes/rootRoutes.js';
  11.  
  12. const PORT = process.env.PORT || 3000;
  13.  
  14. var store = configureStore();
  15. const initialState = store.getState();
  16.  
  17. function renderApp(props,res) {
  18. var markup = renderToString(
  19. <Provider store={store}>
  20. <RoutingContext {...props}/>
  21. </Provider>
  22. );
  23. var html = createPage(markup,initialState);
  24. write(html,'text/html',res);
  25. }
  26.  
  27. http.createServer((req,res) => {
  28.  
  29. if (req.url === '/favicon.ico') {
  30. write('haha','text/plain',res);
  31. }
  32.  
  33. // serve JavaScript assets
  34. else if (/__build__/.test(req.url)) {
  35. fs.readFile(`.${req.url}`,(err,data) => {
  36. write(data,'text/javascript',res);
  37. })
  38. }
  39.  
  40. // handle all other urls with React Router
  41. else {
  42. match({ routes,location: req.url },(error,redirectLocation,renderProps) => {
  43. if (error)
  44. writeError('ERROR!',res);
  45. else if (redirectLocation)
  46. redirect(redirectLocation,res);
  47. else if (renderProps)
  48. renderApp(renderProps,res);
  49. else
  50. writeNotFound(res);
  51. });
  52. }
  53.  
  54. }).listen(PORT)
  55. console.log(`listening on port ${PORT}`)

服务器utils的

与我上面发布的repo相同,例如react-react-router-server-rendering-lazy-routes只是导航到repo中的/modules/utils/server-utils.js.唯一的区别是createPage函数

  1. export function createPage(html,initialState) {
  2. return( `
  3. <!doctype html>
  4. <html>
  5. <head>
  6. <Meta charset="utf-8"/>
  7. <Meta name="viewport" content="width=device-width,initial-scale=1">
  8. <link rel="stylesheet" href="./../bower_components/Ionicons/css/ionicons.min.css">
  9. <link rel="stylesheet" href="./../dist/main.css">
  10. <title>Sell Your Soles</title>
  11. </head>
  12. <body>
  13. <div id="app">${html}</div>
  14. <script>window.__INITIAL_STATE__ = ${JSON.stringify(initialState)};</script>
  15. <script src="/__build__/main.js"></script>
  16. </body>
  17. </html>
  18. `);
  19. }

rootRoute.js

  1. // polyfill webpack require.ensure
  2. if (typeof require.ensure !== 'function') require.ensure = (d,c) => c(require)
  3.  
  4. import App from '../components/App.jsx'
  5. import Landing from '../components/Landing/Landing.jsx'
  6.  
  7. export default {
  8. path: '/',component: App,getChildRoutes(location,cb) {
  9. require.ensure([],(require) => {
  10. cb(null,[
  11. require('./UserProfile/UserProfileRoute.js'),require('./UserHome/UserHomeRoute.js'),require('./SneakerPage/SneakerPageRoute.js'),require('./Reviews/ReviewsRoute.js'),require('./Listings/ListingsRoute.js'),require('./Events/EventsRoute.js')
  12. ])
  13. })
  14. },indexRoute: {
  15. component: Landing
  16. }
  17. }

userProfileRoute.js

  1. import UserProfile from '../../components/UserProfile/UserProfile.jsx';
  2.  
  3. export default {
  4. path: 'profile',component: UserProfile
  5. }

client.js

  1. import React from 'react';
  2. import { match,Router } from 'react-router';
  3. import { render } from 'react-dom';
  4. import { createHistory } from 'history';
  5. import routes from './../common/routes/rootRoutes.js';
  6. import {Provider} from 'react-redux';
  7. import configureStore from './../common/store/store.js';
  8.  
  9.  
  10. const { pathname,search,hash } = window.location;
  11. const location = `${pathname}${search}${hash}`;
  12.  
  13. const initialState = window.__INITIAL_STATE__;
  14. const store = configureStore(initialState);
  15.  
  16.  
  17.  
  18. // calling `match` is simply for side effects of
  19. // loading route/component code for the initial location
  20. match({ routes,location },() => {
  21. render(
  22. <Provider store={store}>
  23. <Router routes={routes} history={createHistory()} />
  24. </Provider>,document.getElementById('app')
  25. );
  26. });
我帮助你解决了不和谐,但我想我也会在这里发布答案.

如果您使用babel6(而不是babel5)并在组件中使用export default,则需要将路由更新为以下内容

  1. getChildRoutes(location,(require) => {
  2. cb(null,[
  3. require('./UserProfile/UserProfileRoute.js').default,require('./UserHome/UserHomeRoute.js').default,require('./SneakerPage/SneakerPageRoute.js').default,require('./Reviews/ReviewsRoute.js').default,require('./Listings/ListingsRoute.js').default,require('./Events/EventsRoute.js').default
  4. ])
  5. })
  6. }

有关更多详细信息,请参阅此SO讨论:Babel 6 changes how it exports default

猜你在找的React相关文章