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 相关文章推荐
jquery的extend和fn.extend的使用说明
Jan 09 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
Feb 11 Javascript
jQuery中before()方法用法实例
Dec 25 Javascript
轻量级javascript 框架Backbone使用指南
Jul 24 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
bootstrap datetimepicker日期插件使用方法
Jan 13 Javascript
JavaScript常用正则函数用法示例
Jan 23 Javascript
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
JavaScript实现三级联动效果
Jul 15 Javascript
深入浅析React中diff算法
May 19 Javascript
JavaScript实现一键复制内容剪贴板
Jul 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实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
js创建对象的方式总结
2015/01/10 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python 对象和json互相转换方法
2018/03/22 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
python制作抖音代码舞
2019/04/07 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
铭立家具面试题
2012/12/06 面试题
党员民主评议个人总结
2014/10/20 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL
httpclient调用远程接口的方法
2022/08/14 Java/Android