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 相关文章推荐
JS URL传中文参数引发的乱码问题
Sep 02 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
jQuery $.get 的妙用 访问本地文本文件
Jul 12 Javascript
JavaScript数组和循环详解
Apr 27 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
用js动态添加html元素,以及属性的简单实例
Jul 19 Javascript
node结合swig渲染摸板的方法
Apr 11 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 Javascript
js实现树形数据转成扁平数据的方法示例
Feb 27 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 Javascript
深入浅析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语法(5)
2006/10/09 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
js树形控件脚本代码
2008/07/24 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
python处理大数字的方法
2015/05/27 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
Flask框架配置与调试操作示例
2018/07/23 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
团支部推优材料
2014/05/21 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2014年除四害工作总结
2014/12/06 职场文书
英语邀请函范文
2015/02/02 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL