react-route4 按需加载配置心得

本篇文章主要记录笔者项目中使用 react-route + webpack 做路由按需加载的心得,可能只有笔者一个人看,权当日记了。

很久很久以前,react-route还是2.X和3.X版本的时候,我们是这样做按需的:

const routes = {
        path: ‘/‘,
        component: AppCom,
        indexRoute: {
            component: Admin
        },
        childRoutes: [
            {
                path: ‘edit/:id‘,
                getComponent: (nextState, cb) => {
                    require.ensure([], (require) => {
                        cb(null, require(‘../entry/admin/edit.jsx‘))
                    })
                }
            }
        ]
    }
<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作为一个加载器,其代码如下:

import React from ‘react‘;

export default class Bundle extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            mod: null
        };
    }

    componentWillMount() {
        this.load(this.props)
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.load !== this.props.load) {
            this.load(nextProps)
        }
    }

    load(props) {
        this.setState({
            mod: null
        });
        props.load().then((mod) => {
            this.setState({
                mod: mod.default ? mod.default : mod
            });
        });
    }

    render() {
        return this.state.mod ? this.props.children(this.state.mod) : null;
    }
}

配置路由页部分代码:

import Bundle from ‘./Bundle‘;
const routeObj = {
    url1:‘url1/url1‘,
    url2:‘url2/url2‘,
    url3:‘url3/url3‘,
}
let components = {};
for(let route in routeObj){
    components[route] = (props) => (
        <Bundle load={() => import(`../entry/${routeObj[route]}`)}>
            {(Component) => <Component {...props}/>}
        </Bundle>
    );
}

这里需要注意,import不支持直接使用变量作为参数,webpack官方解释如下:

也就是说,import后至少要有一部分是真实路径,所以才有了

import(`../entry/${routeObj[route]}`)}

路由声明代码:

<Route exact path="/" component={components.url1}/>

webpack配置:

output: {
    path: paths.appBuild,
    filename: ‘[name].bundle.js‘,
    chunkFilename: ‘[name].bundle.js‘
 }

这样就完成了按需的配置,开发者工具中也能看到按需加载的代码块了。

在这里,我想吟诗一首:

啊~~

我编不下去了

原文地址:https://www.cnblogs.com/coderhero/p/9210720.html

时间: 2024-11-09 00:29:54

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

react16.8 antd按需加载配置(已经弹出和未弹出分别的配置)

误区,antd按需加载同样是需要先安装antd,只是通过插件的配置实现不用再进行样式的引入,可以直接引用antd组件进行开发 怎样判断按需加载配置成功?通过组件引用的判断,在不引入antd样式的前提下,直接引入,使用组件,看组件样式是否有效,如果生效则按需加载配置成功 完成的配置流程 安装antd npm i antd --save 安装babel-plugin-import插件 npm -s install babel-plugin-import 配置webpack,因为现在的时候,我的web

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

伴随着React协议的『妥协』(v16采用MIT),React为项目的主体,这个在短期内是不会改变的了,在平时使用过程中发现了如下这个问题: 在服务器渲染的时候,刷新页面会出现闪屏的现象(白屏一闪而过) 作为努力最求极致的我,是不能容忍的,而这一现象是半道出现的,也就是在添加按需加载之后.要说清楚这个问题,得从React的服务器渲染开始说起,(急于寻求问题解决方案的,可以直接去文章后半部分) 服务器渲染(SSR)基础原理 React的虚拟DOM是其可被用于服务端渲染的关键.其原理简单的来说就是首

Vuetify按需加载配置

自己配置vuetify按需加载的步骤,在此记录: 执行npm install vuetify –save 或 yarn add vuetify添加vuetify添加依赖执行npm install --save-dev babel-plugin-transform-imports 或 yarn add babel-plugin-transform-imports添加按需加载支持.配置.babelrc文件,添加改为如下配置:"plugins": ["transform-vue-j

使用react dva按需加载

然后子路由组件会报错. Add "publicPath": "/" to .webpackrc or .roadhogrc can fix this issue export default function RouterConfig({ history,app }) { const LoginPage = (dynamic as any)({ app, component:()=>import('./routes/LoginPage/LoginPage')

angualrjs+AMD规范示例(主要使用requirejs)-实现按需加载

1.背景说明 最近一段时间,一直在研究angularjs及AMD.common规范等.但怎么把angularjs有效的与AMD模块组织结合在一起使用,还是值得深思. 本人研究一段时间,为了巩固下研究成果,特意写了一个demo,仅供参考. 2.使用技术点说明       kendo:主要使用kendo开源一些组件(由于本人对kendo研究比较多) angular:angular作为基础框架(MVC.DI.数据绑定.页面路由.相关服务等) requireJS:AMD模块加载器 bootstrap:主

react中执行yarn eject配置antd-mobile的按需加载

在使用react做项目时如果用antd-mobile,如果使用按需加载,则需要修改它的配置文件 如果我们不操作yarn eject,则直接操作下面的步骤即可: 在 create-react-app 搭建脚手架时 cnpm install -g create-react-app create-react-app reactDemo cd reactDemo cnpm start 引入 antd-mobile 因为配置文件隐藏了,从而我们需要引入 react-app-rewired 并修改 pack

react执行yarn eject后配置antd的按需加载

第一步: 用create-react-app创建完成项目后,执行yarn eject .在config文件夹会显示配置文档 第二步: 添加插件yarn add babel-plugin-import --save-dev  yarn add antd --save-dev 第三步:在congif文件夹下webpack.config.dev.js第147行添加代码 options: { + plugins: [ + ['import', [{ libraryName: "antd", s

react-router v4 按需加载的配置方法

在react项目开发中,当访问默认页面时会一次性请求所有的js资源,这会大大影响页面的加载速度和用户体验.所以添加按需加载功能是必要的,以下是配置按需加载的方法: 安装bundle-loader npm install --save-dev bundle-loader 定义Bundle.js import React, { Component } from 'react'; export default class Bundle extends React.Component { constru

react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level

因为项目需要搞一下按需加载,使用import实现代码打包分片按需加载,但是在实际使用中报语法错误.报错信息如下 SyntaxError: 'import' and 'export' may only appear at the top level 啊咧?报错了. 查找发现很多人碰到过,解决方法不同,但是我这个报错适用下边这个方法. npm install --save-dev babel-plugin-syntax-dynamic-import 然后调整babel-loader配置如下: use