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 19 Javascript
jquery删除提示框弹出是否删除对话框
Jan 07 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
webpack external模块的具体使用
Mar 10 Javascript
vue-cli项目使用mock数据的方法(借助express)
Apr 15 Javascript
vue 实现LED数字时钟效果(开箱即用)
Dec 08 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
May 15 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 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 信息采集程序代码
2009/03/17 PHP
PHP 面向对象实现代码
2009/11/11 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python global全局变量函数详解
2018/09/18 Python
详解Python的循环结构知识点
2019/05/20 Python
python 项目目录结构设置
2020/02/14 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
出国签证在职证明
2014/01/16 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
社区务虚会发言材料
2014/10/20 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
社区工作者个人总结
2015/02/28 职场文书
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript