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 相关文章推荐
Date对象格式化函数代码
Jul 17 Javascript
js Form.elements[i]的使用实例
Nov 13 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
Dec 21 Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
Dec 06 jQuery
微信小程序实现文字跑马灯
May 26 Javascript
小程序云开发之用户注册登录
May 18 Javascript
基于iview的router常用控制方式
May 30 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 Javascript
简单了解JavaScript作用域
Jul 31 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 Javascript
js实现点击按钮随机生成背景颜色
Sep 05 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预定义常量
2006/12/25 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
js导出txt示例代码
2014/01/14 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
优秀公益广告词大全
2014/03/19 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
国庆节活动总结
2014/08/26 职场文书
电影雨中的树观后感
2015/06/15 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS