本篇文章主要记录笔者项目中使用 react-route + webpack 做路由按需加载的心得,可能只有笔者一个人看,权当日记了。
 
很久很久以前,react-route还是2.X和3.X版本的时候,我们是这样做按需的:

  1. const routes = {
  2. path: '/',
  3. component: AppCom,
  4. indexRoute: {
  5. component: Admin
  6. },
  7. childRoutes: [
  8. {
  9. path: 'edit/:id',
  10. getComponent: (nextState, cb) => {
  11. require.ensure([], (require) => {
  12. cb(null, require('../entry/admin/edit.jsx'))
  13. })
  14. }
  15. }
  16. ]
  17. }
  18. <Router routes={routes} history={hashHistory} />
由于笔者公司需要做按需加载的项目并不多,所以在很长一段时间里,笔者对于按需的印象都一直停留在这个阶段。
 
时间到了2018年3月,笔者总算是能用上按需了,这回我们直接上最新版的react-route,版本号4.1.1。
 
新版的react-route相比老版本,改动的程度很大,require.ensure虽然还能用,但是getComponent却已经被处理掉了,笔者根据官方文档摸索了很久,结果官方文档的案例没有一个能看的,直到笔者看到了这篇文章:https://www.jianshu.com/p/547aa7b92d8c
 
这里介绍的,就是这篇文章中提到的使用Bundle来做按需的方式。
 
我们需要引入Bundle.js作为一个加载器,其代码如下:
  1. import React from 'react';
  2.  
  3. export default class Bundle extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. mod: null
  8. };
  9. }
  10.  
  11. componentWillMount() {
  12. this.load(this.props)
  13. }
  14.  
  15. componentWillReceiveProps(nextProps) {
  16. if (nextProps.load !== this.props.load) {
  17. this.load(nextProps)
  18. }
  19. }
  20.  
  21. load(props) {
  22. this.setState({
  23. mod: null
  24. });
  25. props.load().then((mod) => {
  26. this.setState({
  27. mod: mod.default ? mod.default : mod
  28. });
  29. });
  30. }
  31.  
  32. render() {
  33. return this.state.mod ? this.props.children(this.state.mod) : null;
  34. }
  35. }
配置路由页部分代码:
  1. import Bundle from './Bundle';
  2. const routeObj = {
  3. url1:'url1/url1',
  4. url2:'url2/url2',
  5. url3:'url3/url3',
  6. }
  7. let components = {};
  8. for(let route in routeObj){
  9. components[route] = (props) => (
  10. <Bundle load={() => import(`../entry/${routeObj[route]}`)}>
  11. {(Component) => <Component {...props}/>}
  12. </Bundle>
  13. );
  14. }
这里需要注意,import不支持直接使用变量作为参数,webpack官方解释如下:
 
 
也就是说,import后至少要有一部分是真实路径,所以才有了
  1. import(`../entry/${routeObj[route]}`)}
路由声明代码:
  1. <Route exact path="/" component={components.url1}/>
webpack配置:
  1. output: {
  2. path: paths.appBuild,
  3. filename: '[name].bundle.js',
  4. chunkFilename: '[name].bundle.js'
  5. }
这样就完成了按需的配置,开发者工具中也能看到按需加载的代码块了。
 
在这里,我想吟诗一首:
 
啊~~
我编不下去了
 

react-route4 按需加载配置心得的更多相关文章

  1. react antd样式按需加载配置以及与css modules模块化的冲突问题

    通过create-react-app脚手架生成一个项目 然后运行npm run eject 把webpack的一些配置从react-scripts模块弹射出来, 方便自己手工增减,暴露出来的配置文件在 ...

  2. React Router 按需加载+服务器渲染的闪屏问题

    伴随着React协议的『妥协』(v16采用MIT),React为项目的主体,这个在短期内是不会改变的了,在平时使用过程中发现了如下这个问题: 在服务器渲染的时候,刷新页面会出现闪屏的现象(白屏一闪而过 ...

  3. antd按需加载,配置babel-plugin-import插件,编译后报错.bezierEasingMixin()解决方案

    报错如下: ./node_modules/antd/lib/button/style/index.less (./node_modules/css-loader??ref--6-oneOf-7-1!. ...

  4. react路由按需加载方法

    使用router4之后以前的按需加载方法require.ensure 是不好使了. 所以我们改用react-loadable插件做按需加载. 第一步: yarn add react-loadable ...

  5. mybatis 启用延迟加载和按需加载配置

    启用延迟加载和按需加载 Mybatis配置文件中通过两个属性lazyLoadingEnabled和aggressiveLazyLoading来控制延迟加载和按需加载. lazyLoadingEnabl ...

  6. Vuetify按需加载配置

    自己配置vuetify按需加载的步骤,在此记录: 执行npm install vuetify –save 或 yarn add vuetify添加vuetify添加依赖执行npm install -- ...

  7. react CRA antd 按需加载配置 lessloader

    webpack配置 webpack.config.dev.js, webpack.config.prod同理. 'use strict'; const autoprefixer = require(' ...

  8. 配置react / antd 按需加载 并且使用less(react v16)

    1.开启项目   并且执行 yarn eject 下载好我们需要的插件(babel-plugin-import   less  less-loader   antd  react-loadable   ...

  9. nuxt中iview按需加载配置

    在plugins/iview.js中修改 初始代码如下 import Vue from 'vue' import iView from 'iview' import locale from 'ivie ...

随机推荐

  1. hdoj--3062--party(2-sat 可行解)

    Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. NEU 1009 Happiness Hotel

    1009: Happiness Hotel 时间限制: 1 Sec  内存限制: 128 MB提交: 173  解决: 19[提交][状态][讨论版] 题目描述 The life of Little ...

  3. matlab基本语法

    MATLAB基本语法 点乘运算 , 常与其他运算符 点乘运算,常与其他运算符联合使用(如.\) 矩阵生成 矩阵生成 向量生成或子阵提取本节将会介绍一些MATLAB的基本语法的使用. 持续更新... 在 ...

  4. sqlserver数据文件位置如何迁移

    亲测有效的一种方式: 1.对应的数据库脱机 2.迁移物理文件 3.删除原有实例 4.附加

  5. 五步完成一个 VSCode 扩展(插件)开发

    第一步: 安装扩展生成器 npm install -g yo generator-code vsce 第二步: 初始化一个 Hello World 扩展 yo code 图来自 CN-VScode-D ...

  6. 一个基于Vue.js+Mongodb+Node.js的博客内容管理系统

    这个项目最初其实是fork别人的项目.当初想接触下mongodb数据库,找个例子学习下,后来改着改着就面目全非了.后台和数据库重构,前端增加了登录注册功能,仅保留了博客设置页面,但是也优化了. 一.功 ...

  7. vue项目踩坑-引入bootstrap

    1.下载jquery; npm install jquery --save-dev 2.在webpack.base.conf.js中添加如下内容: var webpack = require('web ...

  8. Appstore排名前十的程序员应用软件

    程序员又名程序猿,苦逼劳累的代名词,曾经一个朋友这么开玩笑说,如果你是富二代,你当程序员就是脑残,如果你是穷二代,当程序员的话,死的时候一定是趴键盘. 程序员 哦,可怜的程序员.在那山的这边海的那边有 ...

  9. RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用

    1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...

  10. Python多进程原理与实现

    Date: 2019-06-04 Author: Sun 1 进程的基本概念 什么是进程? ​ 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写 ...