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事件列表解说
Dec 22 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
JS for...in 遍历语句用法实例分析
Aug 24 Javascript
BootStrap入门教程(二)之固定的内置样式
Sep 19 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
axios 处理 302 状态码的解决方法
Apr 10 Javascript
js中自定义react数据验证组件实例详解
Oct 19 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
jsonp实现百度下拉框功能的方法分析
May 10 Javascript
Javascript三种字符串连接方式及性能比较
May 28 Javascript
JavaScript判断数组类型的方法
Oct 23 Javascript
微信小程序接入vant Weapp组件的详细步骤
Oct 28 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操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
Python生成随机数组的方法小结
2017/04/15 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python3.6数独问题的解决
2019/01/21 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
将相和教学反思
2014/02/04 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
学生实习证明范文
2014/09/28 职场文书
班主任高考寄语
2015/02/26 职场文书
任命通知范文
2015/04/21 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
信息技术研修心得体会
2016/01/08 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
Java死锁的排查
2022/05/11 Java/Android