时间:2021-05-26
前言
本文讲述怎么实现动态加载组件,并借此阐述适配器模式。
一、普通路由例子
以上是最常见的React router。在简单的单页应用中,这样写是ok的。因为打包后的单一js文件bundle.js也不过200k左右,gzip之后,对加载性能并没有太大的影响。
但是,当产品经历多次迭代后,追加的页面导致bundle.js的体积不断变大。这时候,优化就变得很有必要。
二、如何优化
优化使用到的一个重要理念就是——按需加载。
可以结合例子进行理解为:只加载当前页面需要用到的组件。
比如当前访问的是/center页,那么只需要加载Center组件即可。不需要加载Data组件。
业界目前实现的方案有以下几种:
•react-router的动态路由getComponent方法(router4已不支持)
•使用react-loadable小工具库
•自定义高阶组件进行按需加载
而这些方案共通的点,就是利用webpack的code splitting功能(webpack1使用require.ensure,webpack2/webpack3使用import),将代码进行分割。
接下来,将介绍如何用自定义高阶组件实现按需加载。
三、自定义高阶组件
3.1 webpack的import方法
webpack将import()看做一个分割点并将其请求的module打包为一个独立的chunk。import()以模块名称作为参数名并且返回一个Promise对象。
因为import()返回的是Promise对象,所以不能直接给<Router/>使用。
3.2 采用适配器模式封装import()
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
当前场景,需要解决的是,使用import()异步加载组件后,如何将加载的组件交给React进行更新。
方法也很容易,就是利用state。当异步加载好组件后,调用setState方法,就可以通知到。
那么,依照这个思路,新建个高阶组件,运用适配器模式,来对import()进行封装。
3.3 实现异步加载方法asyncComponent
如例子所示,新建一个asyncComponent方法,用于接收import()返回的Promise对象。
当componentWillMount时(服务端渲染也有该生命周期方法),执行import(),并将异步加载的组件,set入state,触发组件重新渲染。
3.4 释疑
•state.Component初始化
这里的null,主要用于判断异步组件是否已经加载。
•module.default ? module.default : module
这里是为了兼容具名和default两种export写法。
•return (Component) ? <Component {...this.props} /> : null;
这里的null,其实可以用<LoadingComponent />代替。作用是:当异步组件还没加载好时,起到占位的作用。
this.props是通过AsyncComponent组件透传给异步组件的。
3.5 修改webpack构建
在输出项中,增加chunkFilename即可。
四、小结
自定义高阶组件的好处,是可以按最少的改动,来优化已有的旧项目。
像上面的例子,只需要改变import组件的方式即可。花最少的代价,就可以得到页面性能的提升。
其实,react-loadable也是按这种思路去实现的,只不过增加了很多附属的功能点而已。
以上所述是小编给大家介绍的React router动态加载组件之适配器模式的应用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP设计模式之适配器模式原理与用法。分享给大家供大家参考,具体如下:一、什么是适配器模式适配器模式有两种:类适配器模式和对象适配器模式。其中类适
本文实例讲述了Java适配器模式应用之电源适配器功能。分享给大家供大家参考,具体如下:一、模式定义存在两种适配器模式1对象适配器模式,在这种适配器模式中,适配器
本文实例讲述了Python设计模式之适配器模式原理与用法。分享给大家供大家参考,具体如下:适配器模式(AdapterPattern):将一个类的接口转换成为客户
java中设计模式之适配器模式前言:适配器模式可以将一个类或接口应用于另一个不同但是却有联系的接口,主要的做法是通过声明一个目标接口的实现类,在该类中声明一个将
要点:1.适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。2.适配器模式有对象适配器