动态路径导入,用于使用react-loadable延迟加载组件

时间:2018-10-30 07:37:05

标签: reactjs lazy-loading code-splitting react-loadable

我正在使用create-react-app创建一个应用,并使用react-loadable延迟加载该组件。

我要做的是为加载器对象或react-loadble模块的Loadable函数导入动态路径。

代码:

const LoadableComponent = path =>
 Loadable({
  loader: () => import(`${path}`),
  loading: Loader,
 })

const Home = LoadableComponent('./../../pages/Home')
const User = LoadableComponent('./../../pages/User')

如果我将路径字符串放在路径变量(例如import('./pages/Home'))的位置,然后调用它起作用的函数。但是,当我使用它时,就像上面的代码一样,Loader将加载,但不再继续加载该组件。如果我在import中使用变量,为什么它不起作用?

3 个答案:

答案 0 :(得分:1)

找到了答案here

“为了使Webpack能够处理导入,它必须至少能够大致猜测出import()所要引用的内容。”

结果证明您的路径不能太匿名。猜猜它堆积得很深,Webpack可以自信地知道我要导入的内容。

答案 1 :(得分:1)

据我所知,捆绑程序(Webpack)需要能够预先处理文件路径。

我的问题是为什么要这样做?仅仅写东西有什么不好的?

const Home = Loadable({
  loader: () => import('./pages/Home'),
  loading: Loader,
})

const User = Loadable({
  loader: () => import('./pages/User'),
  loading: Loader,
})

加分点:看一下{1}中最新发布的new React's lazy API。链接的页面还提供了一些有关代码拆分的良好信息。

答案 2 :(得分:0)

为简化配置延迟加载,解决方案如下:

import React, {Component, lazy, Suspense} from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter} from "react-router-dom";
let routers={
    '/about': import('./pages/about'),
    '/contact':  import('./pages/contact'),
}

class Content() extends Component{
   render(){
     return (<Switch>
        {Object.keys(this.props.routers).map((path, idx) => {
            let Child = lazy(()=>this.props.routers[path])
            return (
                <Route path={path} key={idx}>
                    <Suspense fallback={<div>Loading...</div>}>
                        <Child></Child>
                    </Suspense>
                </Route>)
        })}
    </Switch>
   }
}

ReactDOM.render(
    (
    <BrowserRouter>
        <div>
            <ul>
                <li><Link to="/about"> About</Link></li>
                <li><Link to="/contact">Contact</Link></li>
            </ul>
            <Content routers={config.routers}></Content>
        </div>
    </BrowserRouter>
    ),
    document.getElementById('root') as HTMLElement
)