守纪律的孩子 發表於 2019-7-18 16:01:00

react路由懒加载(异步组件)------react-loadable

<div>
<div class="cnblogs_code">
<pre>https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.npmjs.com/package/react-loadable</span></pre>
</div>
<h4>安装</h4>
<div class="cnblogs_code">
<pre>cnpm install react-loadable</pre>
</div>
<h4>基本使用</h4>
<p>假设现在项目中有个 home页面组件<code>src/pages/home/index.js</code></p>
<div class="cnblogs_code">
<pre>import React, { Component } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Home extends Component {
    render(){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;这个是home页面&lt;/div&gt;<span style="color: rgba(0, 0, 0, 1)">
      )
    }
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Home</pre>
</div>
<p>在没有使用react-loadable之前,在我们的route.js里面是直接import Home这个组件的<code>router.js</code></p>
<div class="cnblogs_code">
<pre>import React, { Fragment } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { BrowserRouter, Route } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">

import Home </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@pages/home</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 0, 255, 1)">const</span> Routes = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> (
    </span>&lt;BrowserRouter&gt;
      &lt;Route path=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/home</span><span style="color: rgba(128, 0, 0, 1)">"</span> component={Home}/&gt;
    &lt;/BrowserRouter&gt;<span style="color: rgba(0, 0, 0, 1)">
);

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Routes</pre>
</div>
<p>运行项目后我们可以看chrome的network记录</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="985" data-height="96"><img src="//upload-images.jianshu.io/upload_images/13890429-9a987ca248cfa9dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/985/format/webp" alt="" data-original-src="//upload-images.jianshu.io/upload_images/13890429-9a987ca248cfa9dd.png" data-original-width="985" data-original-height="96" data-original-format="image/png" data-original-filesize="23143"></div>
</div>
<div class="image-caption">image</div>
</div>
<br>
<p>可以看到1.chunk.js是687k</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>现在我们来添加react-loadable</strong></span></p>
<p>在home文件下新建一个<code>loadable.js</code>文件</p>
<div class="cnblogs_code">
<pre>src/pages/home/<span style="color: rgba(0, 0, 0, 1)">loadable.js

import React </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import Loadable </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-loadable</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通用的过场组件</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> loadingComponent =()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div&gt;loading&lt;/div&gt;<span style="color: rgba(0, 0, 0, 1)">
    )
}


export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> Loadable({
    <span style="color: rgba(255, 0, 0, 1)"><strong>loader:import(</strong></span></span><span style="color: rgba(255, 0, 0, 1)"><strong>'./index.js'</strong></span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><strong>),
    loading:loadingComponent</strong></span>
});</span></pre>
</div>
<p>然后再router里面调用</p>
<div class="cnblogs_code">
<pre>import React, { Fragment } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { BrowserRouter, Route } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">

import Home </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@pages/home/loadable</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 0, 255, 1)">const</span> Routes = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> (
    </span>&lt;BrowserRouter&gt;
      &lt;Route path=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/home</span><span style="color: rgba(128, 0, 0, 1)">"</span> component={Home}/&gt;
    &lt;/BrowserRouter&gt;<span style="color: rgba(0, 0, 0, 1)">
);

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Routes</pre>
</div>
<p>&nbsp;</p>
<p>现在再看看chrome的network记录</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="998" data-height="139"><img src="//upload-images.jianshu.io/upload_images/13890429-cba9972914d8fb3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/998/format/webp" alt="" data-original-src="//upload-images.jianshu.io/upload_images/13890429-cba9972914d8fb3f.png" data-original-width="998" data-original-height="139" data-original-format="image/png" data-original-filesize="30130"></div>
</div>
<div class="image-caption">image</div>
</div>
<p>这个时候1.chunk.js是156k,因为只加载首页所需的依赖,所以体积会小很多,而且这个差距会随着项目的增大而变大</p>
<p>看代码,可以知道,工作原理其实就是在页面组件上有包了一成高级组件来代替原来的页面组件</p>
<h5><span style="color: rgba(255, 0, 0, 1)">到这里,代码分割其实已经解决了,但是如果项目有100个页面,那laodable.js就需要写100遍,这样就感觉有点冗余了,所以这个我们可以封装一下</span></h5>
<p>首先,我们建一个util&nbsp; &nbsp;&nbsp;<code>src/util/loadable.js</code></p>
<div class="cnblogs_code">
<pre>import React <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import Loadable </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-loadable</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通用的过场组件</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> loadingComponent =()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div&gt;loading&lt;/div&gt;<span style="color: rgba(0, 0, 0, 1)">
    )
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">过场组件默认采用通用的,若传入了loading,则采用传入的过场组件</span>
<span style="color: rgba(255, 0, 0, 1)"><strong>export default (loader,loading = loadingComponent)=&gt;{
    return Loadable({
      loader,
      loading
    });
}</strong></span></pre>
</div>
<p>&nbsp;</p>
<p>不难看出,我们可以将按需加载的组件和过渡组件通过参数传入最后返回包装后的组件,如此一来,home下面的laodable.js就不需要再建了</p>
<p>router里面调用方式改为如下</p>
<div class="cnblogs_code">
<pre>import React, { Fragment } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { BrowserRouter, Route } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import loadable </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">../util/loadable</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 0, 255, 1)">const</span> Home =<span style="color: rgba(255, 0, 0, 1)"><strong> loadable(()=&gt;import('@pages/home'))

</strong></span><span style="color: rgba(0, 0, 255, 1)">const</span> Routes = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> (
    </span>&lt;BrowserRouter&gt;
      &lt;Route path=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/home</span><span style="color: rgba(128, 0, 0, 1)">"</span> component={Home}/&gt;
    &lt;/BrowserRouter&gt;<span style="color: rgba(0, 0, 0, 1)">
);

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Routes</pre>
</div>
<p>&nbsp;</p>
<p>封装之后,laodable只需写一次,改变的只是组件的引入方式,这样一来就方便多了,</p>
<p>react-loadable是以组件级别来分割代码的,这意味着,我们不仅可以根据路由按需加载,还可以根据组件按需加载,使用方式和路由分割一样,只用修改组件的引入方式即可</p>
</div>
<p><br><br><br></p><br><br>
来源:https://www.cnblogs.com/SRH151219/p/11207919.html
頁: [1]
查看完整版本: react路由懒加载(异步组件)------react-loadable