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 遍历验证所有文本框的值
Aug 27 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
前台js调用后台方法示例
Dec 02 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
Underscore.js常用方法总结
Feb 28 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
JavaScript setInterval()与setTimeout()计时器
Dec 27 Javascript
js实现无缝轮播图效果
Mar 09 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 sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python 实现多维数组转向量
2019/11/30 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
基于python实现对文件进行切分行
2020/04/26 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
土木工程专业自荐信
2013/10/04 职场文书
大学应届生求职简历的自我评价
2013/10/08 职场文书
初中地理教学反思
2014/01/11 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
村官个人总结范文
2015/03/03 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python