网上关于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. 安装mysql5.7.17

    参见 网易云课堂的视频教程 :mysql视频教程

  2. C# ini

    C# ini文件操作[源码下载] 介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivat ...

  3. Ajax打开三种页面的请求

    xmlhttprequest对象可以打开两种方式的页面请求 1,.asmx格式的webservice页面. 2,.aspx格式的web窗体 其中web窗体可以是调用一新建的web窗体,同时调用和被调用 ...

  4. OpenGL(九) 三维混色和深度缓存设置

    颜色的混合在现实世界中非常常见,例如隔着有色玻璃观看物体,此时在观察者严重呈现出来物体的颜色就是玻璃的颜色和物体的颜色的混合. OpenGL在RGBA颜色模式下使用函数glenable(GL_BLEN ...

  5. img前置显示屏装load图片

    只需要设置img的background能够 <img src="" alt="" class="detailImg"  > cs ...

  6. Java数据存储机制的实现

    原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在执行时须要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...

  7. MySql 5.7 重置root密码

    一.以安全模式登录 # Stop MySQL sudo service mysql stop # Make MySQL service directory. sudo mkdir -p /var/ru ...

  8. SwiftCafe 咖啡时光 - 了解 Swift 中的闭包

    闭包(Closure) 是现代开发语言的必备特性,极大的提高了我们的开发效率. 关于闭包,你可以把它理解为一种特殊的变量或对象.简而言之,我们通常的对象,里面存储的是变量或对象的值,而闭包里面存储的是 ...

  9. JS注册事件

    <html xmlns="http://www.w3.org/1999/xhtml"><head>    <title></title&g ...

  10. 图像滤镜艺术---Photoshop实现Instagram Amaro滤镜特效

    原文:图像滤镜艺术---Photoshop实现Instagram Amaro滤镜特效 本文是我收集的一些使用Photoshop来实现Instagram滤镜的一些内容,在这里跟大家分享一下,这些效果是完 ...