网上关于React Router 4.0的按需加载文章有很多,大致的思路都一样,但是其实具体实现起来却要根据自己的实际情况来定,这里主要介绍一下我的实现方式。

  主要方式是通过Route组件的render方法加载一个空的组件作为中间,通过空的组件用来加载具体的页面js文件,然后这个组件的内部加载完成的时候就使用webpack 的 import方法动态请求js,当js请求成功后,这个空组件显示具体的加载js内容,说起来比较晦涩,直接上代码。

  1、先看看中间组件,(由于我这里使用了Typescript, 代码里的ts代码不感兴趣的可以直接忽略即可)

  

import * as React from 'react';
export namespace LoadComponentAsync {
export interface Props {
componentName: string
} export interface State {
Component: React.ReactType
}
} export class LoadComponentAsync extends React.Component<LoadComponentAsync.Props, LoadComponentAsync.State> {
constructor(props) {
super(props)
this.state = {
Component: null
}
} componentDidMount() {
    // 这里使用的import进行动态加载组件
import(`../componentPublicPath/${this.props.componentName}`
/* webpackChunkName: "[request]" */
).then(Component => {
this.setState({
Component: Component.default
})
})
} render () {
let Component = this.state.Component
if (Component) {
return <Component />
} else {
return null
}
}
}

  是的,就是这么简单的一个空组件。

  2、Router部分怎么使用这个组件呢?

<Switch>
<Route path='/some/path'} exact render={() => {
return <LoadComponentAsync key={'someKey'} componentName={yourComponentName}/>
}}/>
    <Route path='/some/path2'} exact render={() => {
return <LoadComponentAsync key={'someKey2'} componentName={yourComponentName2}/>
}}/>
</Switch>

  是的还是这么的超级简单。

  3、具体的思路上面的已经是核心代码了,

  你可能还需要配置一下东西,默认的情况你每次加载对应的路由请求的js可能是0.js 1.js 2.js这个样子的,显然十分丑陋,我想看他们每个js组件的具体名字是什么怎么办呢?

  首先找的你的webpack.config.js,然后,加入一个chunkFilename,

   

  Yes, 就是这样。然后注意到上面的import里面有个注释了吗

  

  这是个啥,Magic Comments, 魔法注释 这个webpackChunkName可以告诉webpack 每个 chunkname 是什么,这里我[request]表示的意思是每次请求的组件名称作为chunkname ,

  本文正文结束啦。

  顺便提一句,如果你的 Magic Comments 不生效注意你的.babelrc 或者tsconfig.json里是否有去掉注释的逻辑(类似removeComments: true ),有的话需要关掉,然后就可以完美按需加载你的组件喽。

                                                                      注:本文出自博客园 https://home.cnblogs.com/u/mdengcc/ ,转载请注明出处。 稍微尊重一下原创OK?

React Router 4.0 + webpack 实现组件按需加载的更多相关文章

  1. 【react学习二】create-react-app 接入antd 并按需加载组件

    1.安装 cnpm i babel-plugin-import --save-dev 2.使用 在根目录下的package.json下的bable中添加相应代码 "babel": ...

  2. webpack学习笔记--按需加载

    为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...

  3. Vue性能优化之组件按需加载(以及一些常见的性能优化方法)

    关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...

  4. vue3.0使用ant-design-vue进行按需加载原来这么简单

    下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...

  5. webpack中实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

  6. vue的异步组件按需加载

    当build打包后,app.js过大的时候,可以考虑用异步组件的方式. import HomeHeader from "./components/Header"; import H ...

  7. webpack 事件触发 按需加载

    比较易懂, 方法简单 var util_sync = require('./util-sync.js') alert(util_sync.data) document.getElementById(& ...

  8. webpack require.ensure 按需加载

    使用 vue-cli构建的项目,在 默认情况下 ,会将所有的js代码打包为一个整体比如index.js.当使用存在多个路由代码的时候,index.js可能会超大,影响加载速度. 这个每个路由页面除了i ...

  9. React(九)create-react-app创建项目 + 按需加载Ant Design

    (1)create-react-app如何创建项目我前面第一章介绍过了,这里就不过多写了, (2)我们主要来说说按需加载的问题 1. 引入antd npm install antd --save 2. ...

随机推荐

  1. Matlab Tricks(十八)—— 矩阵间元素距离的计算

    两个矩阵间元素(向量)距离的度量,首先想到的是遍历,循环的方式,显然 matlab 下的编程并不推荐,matlab 下矩阵向量化编程效率尤高. 先考虑两个向量距离的计算: ∥x−y∥2=∥x∥2+∥y ...

  2. latex 常用环境(environment)

    align \begin{align} \overline{A \cup B} &= \overline{A} \cap \overline{B}, \\ \overline{A \cap B ...

  3. [C#]Windows系统特殊文件夹路径获取

    原文:[C#]Windows系统特殊文件夹路径获取 由于软件开发的需要,近期对Windows特殊文件夹(如桌面,我的文档等)路径的查找方法进行了研究,结果如下. 获取特殊文件夹的方法不止一种,下面列出 ...

  4. 在Style中将EventTrigger与Trigger同时使用

    原文:在Style中将EventTrigger与Trigger同时使用 现在在看WPF关于Trigger的有关实例,然后找到一篇不错的文章,特此转载,收藏一下!!   一般情况下,使用Style时,可 ...

  5. Linking different libraries for Debug and Release builds in Cmake on windows?

    问题叙述性说明: So I've got a library I'm compiling and I need to link different third party things in depe ...

  6. [LeetCode OJ] Copy List with Random Pointer 扩大

    职务地址:https://oj.leetcode.com/problems/copy-list-with-random-pointer/ 题意:对一个有回路的链表的深复制 解题:这道题我AC了之后才发 ...

  7. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...

  8. XF相对控件布局

    using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompila ...

  9. XF堆栈布局

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  10. IOS开发之把 JSON 数据转化成 Arrays 或者 Dictionaries

    1 前言通过 NSJSONSerialization 这个类的 JSONObjectWithData:options:error:方法来实现,把JSON 数据解析出来放在数据或者字典里面保存. 2 代 ...