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 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
关于js获取radio和select的属性并控制的代码
May 12 Javascript
js的Boolean对象初始值示例
Mar 04 Javascript
js模拟hashtable的简单实例
Mar 06 Javascript
JS解析XML实例分析
Jan 30 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
Dec 14 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
vue中子组件传递数据给父组件的讲解
Jan 27 Javascript
es6数值的扩展方法
Mar 11 Javascript
vue 实现动态路由的方法
Jul 06 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插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
JavaScript格式化数字的函数代码
2010/11/30 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python读取图片并修改格式与大小的方法
2018/07/24 Python
Python安装selenium包详细过程
2019/07/23 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
工地安全检查制度
2014/02/04 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
部门年终奖分配方案
2014/05/07 职场文书
2016年党建工作简报
2015/11/26 职场文书
人力资源部工作计划
2019/05/14 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL