react 实现页面代码分割、按需加载的方法


Posted in Javascript onApril 03, 2018

虽然一直有做 react 相关的优化,按需加载、dll 分离、服务端渲染,但是从来没有从路由代码分割这一块入手过,昨天在本地开发时没有测试成功,今天又搞了下,已经部署到线上环境了,今天就这个记录一下。

修改配置

开发环境:webpack@v3 、react-router@v4

安装依赖:

$ yarn add babel-plugin-syntax-dynamic-import -dev

修改 .babelrc 文件:在 plugins 中添加 "syntax-dynamic-import"

改造项目代码

安装依赖:

$ yarn add react-loadable

根据 react-loadable 文档提示,我们需要提供一个载入新页面时的 Loading 组件,同时对加载和超时状态进行区别提示:

import React from 'react';
import { Icon } from 'antd';

const Loading = ({ pastDelay, timedOut, error }) => {
 if (pastDelay) {
 return <div><Icon type="loading" /></div>;
 } else if (timedOut) {
 return <div>Taking a long time...</div>;
 } else if (error) {
 return <div>Error!</div>;
 }
 return null;
};

更改页面组件导入方法:

import React from 'react';
import Loadable from 'react-loadable';
import { Route, Switch } from 'react-router-dom';

const Home = Loadable({
 loader: () => import('../Home'),
 loading: Loading,
 timeout: 10000
});
const EditArticle = Loadable({
 loader: () => import('../EditArticle'),
 loading: Loading,
 timeout: 10000
});

...

<Switch>
 <Route exact path="/home" component={Home} />
 <Route path="/editarticle" component={EditArticle} />
</Switch>

然后打包结果就会分离出各页面代码:

react 实现页面代码分割、按需加载的方法

在页面中我们只需要载入入口文件 app.js ,其他脚本在访问到对应页面时都会经由这个文件载入。

验证结果

在将静态资源上传到 cdn 之后,在页面中加载 app.css 和 app.js ,运行之后访问各个页面就会依次加载对应脚本,结果如图:

react 实现页面代码分割、按需加载的方法

可以看到,在访问第一个页面时加载的页面脚本经 gzip 压缩后仅有 21.8KB !!!当然这与页面复杂度也有关,但是相较于加载全部脚本,已经是大幅减少了,这种优化对访问目标性很强的用户感受起来尤为明显。

这么做的另一个好处就是当我们只更改项目中某些页面的业务代码时,其他页面的代码依然是不变的,所以这个时候其他页面用的是客户端缓存,从另一个层面又做了一次优化。

Tips

react-loadable 还有其他配置选项,可以按需配置;

这里还需要注意的一点是:webpack 中的 output.publicPath 选项,这个配置会影响 app.js 从何处加载页面脚本,正确的写法应该是脚本文件载入的前缀地址,例如: 0.js 的远程链接为 http://static.domain.com/release/0.js ,那么这个应该配置为http://static.domain.com/release/。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
jQuery 过滤not()与filter()实例代码
May 10 Javascript
window.open()实现post传递参数
Mar 12 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
Aug 23 Javascript
angularJs关于指令的一些冷门属性详解
Oct 24 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
Feb 23 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
vue实现随机验证码功能(完整代码)
Dec 10 Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 Javascript
通过实例了解Javascript柯里化流程
Mar 03 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
深入浅析Vue中的slots/scoped slots
Apr 03 #Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 #Javascript
vue内置指令详解
Apr 03 #Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 #Javascript
Angular2进阶之如何避免Dom误区
Apr 02 #Javascript
Vue项目分环境打包的实现步骤
Apr 02 #Javascript
详解webpack-dev-server的简单使用
Apr 02 #Javascript
You might like
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
javascript string字符串优化问题
2011/07/31 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
layui树形菜单动态遍历的例子
2019/09/23 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python创建学生管理系统
2019/11/22 Python
浅谈django 重载str 方法
2020/05/19 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
大一期末自我鉴定
2013/12/13 职场文书
学校消防安全制度
2014/01/30 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
2014年个人委托书范本
2014/10/13 职场文书
2014年标准化工作总结
2014/12/17 职场文书
紧急迫降观后感
2015/06/15 职场文书
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android