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函数详解
Nov 17 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
JavaScript中Number对象的toFixed() 方法详解
Sep 02 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
Angular4编程之表单响应功能示例
Dec 13 Javascript
node.js到底要不要加分号浅析
Jul 11 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
Vue3 中的数据侦测的实现
Oct 09 Javascript
jquery实现烟花效果(面向对象)
Mar 10 jQuery
深入浅析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实时显示输出
2008/10/02 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
python关闭windows进程的方法
2015/04/18 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python正规则表达式学习指南
2016/08/02 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
Django视图扩展类知识点详解
2019/10/25 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
python自定义函数def的应用详解
2020/06/03 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
SQL数据库笔试题
2016/03/08 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
写给老婆的检讨书
2014/02/21 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
2014年工人工作总结
2014/11/25 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
学校教学工作总结2015
2015/05/19 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技