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 标题的自动翻转实现代码
Oct 14 Javascript
JS中的异常处理方法分享
Dec 22 Javascript
js中跨域方法原理详解
Jul 19 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
js前端实现图片懒加载(lazyload)的两种方式
Apr 24 Javascript
node.js中debug模块的简单介绍与使用
Apr 25 Javascript
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
layui框架中layer父子页面交互的方法分析
Nov 15 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
Apr 22 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
python的类方法和静态方法
2014/12/13 Python
python通过线程实现定时器timer的方法
2015/03/16 Python
Python中字符串的格式化方法小结
2016/05/03 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python中six模块基础用法
2019/12/08 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
暑期实习鉴定
2013/12/16 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
2015年公务员工作总结
2015/04/24 职场文书
2015年药房工作总结
2015/04/25 职场文书
超市员工辞职信范文
2015/05/12 职场文书
六五普法学习心得体会
2016/01/21 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python实现排序方法常见的四种
2021/07/15 Python