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 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
Jun 27 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
javascript实现倒计时(精确到秒)
Jun 26 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
动态加载js文件简单示例
Apr 21 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
JavaScript制作简单分页插件
Sep 11 Javascript
js如何找出字符串中的最长回文串
Jun 04 Javascript
深入浅析angular和vue还有jquery的区别
Aug 13 jQuery
javascript实现导航栏分页效果
Jun 27 Javascript
微信小程序云开发如何实现数据库自动备份实现
Aug 16 Javascript
vue实现折线图 可按时间查询
Aug 21 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批量删除数据
2007/01/18 PHP
php日历[测试通过]
2008/03/27 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
VUE安装使用教程详解
2019/06/03 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
使用matplotlib画散点图的方法
2018/05/25 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
英国电器零售商:PRC Direct
2018/06/21 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
Java面向对象面试题
2016/12/26 面试题
气象学专业个人求职信
2014/04/22 职场文书
活动总结报告怎么写
2014/07/03 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL