简体   繁体   English

使用create-react-app和react-loadable进行代码拆分不起作用

[英]Code splitting with create-react-app and react-loadable is not working

I've followed various articles, particularly these... 我关注了各种文章,特别是这些...

Here's a example of the code splitting -- getRoutes() is called in a component's render method: 这是代码拆分的示例-在组件的render方法中调用getRoutes()

// Edit: commented out original `Loadable` abstraction to use standard `Loadable`

import React from 'react'
// import L from 'react-loadable'
import Loadable from 'react-loadable'
import { BrowserRouter, Route, Switch } from 'react-router-dom'

import { LoadingIndicator } from '../components'

// const Loadable = opts =>
//   L({
//     loading: LoadingIndicator,
//     delay: 300,
//     ...opts
//   })

const AuthenticateContainer = Loadable({
  loading: LoadingIndicator,
  loader: () => import(/* webpackChunkName: "auth" */ '../containers/Authenticate')
})

...

export default function getRoutes (isAuthed, browserHistory) {

  return (
    <BrowserRouter>
      <Switch>
        <Route path="/auth" component={AuthenticateContainer} />
        ...
      </Switch>
    </BrowserRouter>
  )
}

..but my code is not splitting: ..但我的代码未拆分:

$ npm run build

> my-app@0.1.0 build /path/to/my-app
> bash -ac '. .env.production; react-scripts build'

Creating an optimized production build...

File sizes after gzip:

  854.84 KB (+4 B)  build/static/js/main.1aa92927.js
  17.53 KB          build/static/css/main.36b767d9.css

The bundle size is significantly larger than recommended.
Consider reducing it with code splitting: https: // goo.gl/9VhYWB
You can also analyze the project dependencies: https: // goo.gl/LeUzfb

The project was built assuming it is hosted at the server root.
You can control this with the homepage field in your package.json.
For example, add this to build it for GitHub Pages:

  "homepage" : "http: // myname.github.io/myapp",

The build folder is ready to be deployed.
You may serve it with a static server:

  yarn global add serve
  serve -s build

Find out more about deployment here:

  http: // bit.ly/2vY88Kr

As you can see, the build result is not chunked, but a single JS file. 如您所见,构建结果不是分块的,而是单个JS文件。

What am I doing wrong? 我究竟做错了什么?


Current versions used: 当前使用的版本:

react-scripts: 1.1.4
react-router-dom: 4.3.1
webpack: 3.8.1
npm: 6.1.0

OK, I worked this out eventually... 好,我最终解决了这个问题...

I had a file at /src/containers/index.js which contained the following line: 我在/src/containers/index.js有一个文件,其中包含以下行:

export { default as AuthenticateContainer } from './Authenticate/AuthenticateContainer'

This allowed me to import my AuthenticateContainer using the following shorthand: 这使我可以使用以下速记来导入AuthenticateContainer

import { AuthenticateContainer } from '../containers'

rather than the slightly longer 而不是稍长

import AuthenticateContainer from '../containers/Authenticate/AuthenticateContainer'

However, leaving that line in /src/containers/index.js also prevents code splitting as the AuthenticateContainer logic has already been bundled into main.js before we even try async loading. 但是,将该行保留在/src/containers/index.js还可以防止代码分裂,因为AuthenticateContainer逻辑在我们尝试异步加载之前已经被捆绑到main.js

Remove the line and code splitting works as expected. 删除行,并按预期进行代码拆分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM