webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)

为什么要做dynamic import?

dynamic import不知道为什么有很多叫法,什么按需加载,懒加载,Code Splitting,代码分页等。
总之,就是在SPA,把JS代码分成N个页面份数的文件,不在用户刚进来就全部引入,而是等用户跳转路由的时候,再加载对应的JS文件。
这样做的好处就是加速首屏显示速度,同时也减少了资源的浪费。

为什么选择 webpack 3?

  • 更高的性能
  • 有scope hosting功能,不再需要rollup来处理代码冗余
  • 可与react-router结合,更优雅的做dynamic import
  • 最重要的一点是,我正经学webpack的时候3已结出了- -

完整的 react spa 项目地址

GitHub项目地址

这个一个完整的项目,这节相关的内容可在router/routerMap.jsx中找到。

第一步:安装 babel-plugin-syntax-dynamic-import

babel用的是babel-env,使用方法可以去babel官方学习,实践可看我项目的源代码。

npm i -D babel-plugin-syntax-dynamic-import 以后, 在.babelrc文件的plungins中加上"syntax-dynamic-import"

第二步:安装 react-loadable

npm i -S react-loadable 以后,我们就能愉快得做dynamic import了。

第三步: 编辑routerMap

import React from 'react';
import { HashRouter as Router, Route, Switch } from 'react-router-dom';
import createHistory from 'history/createBrowserHistory';
const history = createHistory();import App from 'containers';// 按路由拆分代码
import Loadable from 'react-loadable';
const MyLoadingComponent = ({ isLoading, error }) => {// Handle the loading stateif (isLoading) {return <div>Loading...</div>;}// Handle the error stateelse if (error) {return <div>Sorry, there was a problem loading the page.</div>;}else {return null;}
};
const AsyncHome = Loadable({loader: () => import('../containers/Home'),loading: MyLoadingComponent
});
const AsyncCity = Loadable({loader: () => import('../containers/City'),loading: MyLoadingComponent
});
const AsyncDetail = Loadable({loader: () => import('../containers/Detail'),loading: MyLoadingComponent
});
const AsyncSearch = Loadable({loader: () => import('../containers/Search'),loading: MyLoadingComponent
});
const AsyncUser = Loadable({loader: () => import('../containers/User'),loading: MyLoadingComponent
});
const AsyncNotFound = Loadable({loader: () => import('../containers/404'),loading: MyLoadingComponent
});// 路由配置
class RouteMap extends React.Component {render() {return (<Router history={history}><App><Switch><Route path="/" exact component={AsyncHome} /><Route path="/city" component={AsyncCity} /><Route path="/search/:category/:keywords?" component={AsyncSearch} /><Route path="/detail/:id" component={AsyncDetail} /><Route path="/user" component={AsyncUser} /><Route path="/empty" component={null} key="empty" /><Route component={AsyncNotFound} /></Switch></App></Router>);// 说明// empty Route// https://github.com/ReactTraining/react-router/issues/1982  解决人:PFight// 解决react-router v4改变查询参数并不会刷新或者说重载组件的问题 }
}export default RouteMap;

大功告成

我们可以运行webpack,然后就能看到效果(图仅为dev环境,build才会再打包一个vendor.js,为什么要有vendor.js,请见devDependencies和dependencies的区别 >>)

clipboard.png

参考文章

Code Splitting in Create React App

Q&A

有同学表示,我的方法做页面分离并没有什么好处,因为每个页面都依赖了三方库的代码,所以其实页面有很多冗余代码,能想到这点很棒,已经开始有架构思维了。不过,注意这个想法在dev环境下,这个同学是对的。

那到了build环境,或者说到了发布环境,又是怎么样的呢?的确,这篇文章我没有提到,请见我的另一篇文章devDependencies和dependencies的区别。这篇文章主要解释了npm的package.json中devDependencies和dependencies区别是什么。

看完以后,我们就可以知道,为什么我之前说“注意这个想法在dev环境下,这个同学是对的”了。因为,我们npm run build以后,webpack会把三方包打包到vendor.js文件,页面逻辑代码不会牵涉其中,每个页面都会引用vendor.js这个文件,这样的话,就不会出现重复引入冗余代码的情况了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go kegg_工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧

GO和KEGG富集分析是我们在筛选出差异表达基因之后&#xff0c;都会去做的套路性分析。然鹅……我相信&#xff0c;总有那么一些“倒霉孩子”会遇到跟我一样的窘境吧&#xff0c;好不容易筛选出来的差异基因&#xff0c;尝试了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

搭建Telnet服务器

搭建Telnet服务器 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 可能大家都知道现在已经很少有人用TELNET服务器&#xff0c; 因为它传输数据是以明文的方式&#xff0c;我们很容易通过抓包软件讲数据进行抓包&a…

table取tr对象 vue_Vue笔记

Vue集成了React和Angular的优点&#xff0c;摒弃了他们的缺点。Vue的官网&#xff1a;https://cn.vuejs.org/v2/api/Vue诞生于2016年&#xff0c;是现在非常流行的MVVM框架。Vue提供了“引包”的使用方法&#xff0c;初学者可以在这之下学习语法。不需要webpack&#xff0c;不需…

Beats入门简介

使用Beat收集nginx日志和指标数据 项目需求 Nginx是一款非常优秀的web服务器&#xff0c;往往nginx服务会作为项目的访问入口&#xff0c;那么&#xff0c;nginx的性能保障就变得非常重要了&#xff0c;如果nginx的运行出现了问题就会对项目有较大的影响&#xff0c;所以&…

可编程led灯带原理_SCPSD-250-04-27派克真空压力传感器故障和工作原理

SCPSD-250-04-27派克PARKER真空压力传感器故障和工作原理PARKER压力开关现货 PARKER压力传感器特价 派克真空压力传感器 PARKER数字压力开关2020年还剩最后2天了&#xff0c;这一年大家都过得不太容易&#xff0c;尤其是我自己这是30年以来过得最艰难的一年&#xff0c;经…

Kibana入门安装与介绍

Kibana入门 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic Stack 成员之一&#xff0c;设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化…

友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...

练手项目&#xff0c;先上图先实现一个简单的串口工具&#xff0c;为之后的上位机做准备代码如下&#xff1a;pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函数

前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML。然而在一些场景中&#xff0c;真的需要 JavaScript 的完全编程的能力&#xff0c;这就是 render 函数&#xff0c;它比 template 更接近编译器。本文将详细介绍Vue渲染函数 引入 下面是一个例子&#xff0c;如果要…

Logstash入门简介

Logstash入门简介 介绍 Logstash是一个开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到最喜欢的存储库中&#xff08;我们的存储库当然是ElasticSearch&#xff09; 我们回到我们ElasticStack的架构图&a…

Django templates 和 urls 拆分

如果在Django项目 下面新建了blog和polls两个APP应用&#xff0c;在每个APP下面都各自新建自己的url和templates&#xff0c;那么我们需要如何进行项目配置呢&#xff1f; INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, dja…

springboot怎么杀进程_线上服务平均响应时间太长,怎么排查?

线上服务平均响应时间太长&#xff0c;怎么排查&#xff1f;https://xie.infoq.cn/article/914b5c56000a3880016abd8d6前言&#xff1a;最近线上环境某个接口服务响应时间偏长&#xff0c;导致用户体验超差&#xff0c;那平时该怎么快速的排查这类问题呢&#xff1f;①、为代码…

MPEG音视频编解码之MP3编解码概述

2 MP3编解码原理 2.1 MP3音频压缩标准概述 MP3全称是动态影像专家压缩标准音频层面3&#xff08;Moving Picture Experts Group Audio Layer III&#xff09;。是当今较流行的一种数字音频编码和有损压缩格式&#xff0c;它设计用来大幅度地降低音频数据量&#xff0c;而对于…

Python实现GitBook工具

写在前面 本工具是通过Python脚本实现 GitBook 自动 生成 执行 编译 发布的功能 你可以在这里下载exe 使用 1. exe下载,并移动位置 将exe文件放在你的gitbook文件夹中,或者放在空文件夹中 2. file.md 创建 名为file.md的文件,在你要写book的目录下 注意: 这里file.md文件名…

shell脚本中用到的条件和循环语句

本博文介绍一下shell脚本中常用的条件和循环语句&#xff1a;条件语句&#xff1a;循环语句&#xff1a;示例&#xff1a;if语句&#xff1a;eg1.eg2.2.case语句&#xff1a;简单的case语句&#xff1a;配合循环的case语句&#xff1a;3.for语句&#xff1a;简单的for语句&…

processing动态代码大全_做一张动态海报需要多少步?

人们习惯性地把程序员跟设计师分成两种不同性质的人&#xff0c;好像程序员就不会有美感&#xff0c;设计师逻辑思维就一定会很弱&#xff0c;但最近几年我们发现越来越多的程序员学设计&#xff0c;设计师学编程的跨界故事。新媒体艺术家&#xff0c;邱伟豪也是其中一员&#…

手写springboot_Spring Boot 入门教程 | 图文讲解

目录一、Spring Boot 是什么二、为什么要使用 Spring Boot三、快速入门3.1 创建 Spring Boot 项目3.2 项目结构3.3 引入 Web 依赖3.4 编写第一个接口3.5 启动程序&#xff0c;验证效果四、总结五、GitHub 示例代码一、Spring Boot 是什么以下截图自 Spring Boot 官方文档&#…

lunix 安装python3

Linux下默认系统自带python2.6的版本&#xff0c;这个版本被系统很多程序所依赖&#xff0c;所以不建议删除&#xff0c;如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的&#xff0c;所以可以安装python3和python2共存 首先去python官网下载…

机器学习之朴素贝叶斯法

转载请注明出处&#xff1a;http://www.cnblogs.com/Peyton-Li/ 朴素贝叶斯法是机器学习模型中一个比较简单的模型&#xff0c;实现简单&#xff0c;比较常用。 是定义在输入空间上的随机向量&#xff0c;是定义在输出空间上的随机变量。是和的联合概率分布。训练数据集由独立同…

如何让梯形变成平行四边形_开放的课堂 创新的天地——平行四边形的面积教学片段与反思...

一、 课题的确定学生在三年级学过长方形、正方形的面积计算&#xff0c;经历过从数方格的办法得出面积计算公式的过程。因此&#xff0c;学生对于面积计算公式的推导有一定的经验和知识基础。基于上述考虑&#xff0c;我想完全放手让学生去研究如何计算平行四边形的面积。这对学…

bzoj1670【Usaco2006 Oct】Building the Moat 护城河的挖掘

1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 387 Solved: 288[Submit][Status][Discuss]Description 为了防止口渴的食蚁兽进入他的农场&#xff0c;Farmer John决定在他的农场周围挖一条护城河。农场里一共同拥有N(8…