概念

无需用户下载整个应用之后才能访问访问它。即边访问边下载。因此我们设计一个组件<Bundle>当用户导航到它是来动态加载组件。

import loadSomething from 'bundle-loader?lazy!./Something'

<Bundle load={loadSomething}>
{(mod) => (
// do something w/ the module
)}
</Bundle>

如果model是一个component:

<Bundle load={loadSomething}>
{(Comp) => (Comp
? <Comp/>
: <Loading/>
)}
</Bundle>

这个组件拥有一个load属性(即webpack的 bundle loader)。当组件挂载或者得到一个新的load属性,它将调用load属性,然后放置组件的returned value 到state中,最后在组件的render中回掉该model。源码:

import React, { Component } from 'react'

class Bundle extends Component {
state = {
// short for "module" but that's a keyword in js, so "mod"
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((mod) => {
this.setState({
// handle both es imports and cjs
mod: mod.default ? mod.default : mod
})
})
} render() {
return this.state.mod ? this.props.children(this.state.mod) : null
}
} export default Bundle

上面render中表明,在model获取之前,render将调用 null state.mod。这样,我们就可以向用户展示一个等待的动画,表明我们正在等待什么东西。

Why bundle loader, and not import()?

TC39 最近提出的官方的动态导入是import(),我们可以调整我们的Bundle来使用它:

<Bundle load={() => import('./something')}>
{(mod) => ()}
</Bundle>

bundle loader的最大好处是它第二次同步回调。这样可以在用户每次访问一个代码分离的页面时防止加载页面而造成的页面闪烁。

忽视你import的方式,思想时一样的:code splitting 即,当组件呈现时用来处理该组件加载的组件。现在你要做的就是在你想要动态加载代码的地方使用<Bundle>

Loading after rendering is complete

Bundle component同样也有利于预在后台预加载app的其余部分。

import loadAbout from 'bundle-loader?lazy!./loadAbout'
import loadDashboard from 'bundle-loader?lazy!./loadDashboard' // components load their module for initial visit
const About = (props) => (
<Bundle load={loadAbout}>
{(About) => <About {...props}/>}
</Bundle>
) const Dashboard = (props) => (
<Bundle load={loadDashboard}>
{(Dashboard) => <Dashboard {...props}/>}
</Bundle>
) class App extends React.Component {
componentDidMount() {
// preloads the rest
loadAbout(() => {})
loadDashboard(() => {})
} render() {
return (
<div>
<h1>Welcome!</h1>
<Route path="/about" component={About}/>
<Route path="/dashboard" component={Dashboard}/>
</div>
)
}
}

什么时候,多少个你的app要被加载,由你决定。不需要绑定特殊的route。也许你仅仅在用户不活跃的时候,也或许仅仅在用户访问一个route时,或许你想在初始render之后预加载app的其余部分去处理它

ReactDOM.render(<App/>, preloadTheRestOfTheApp)

react-router之代码分离的更多相关文章

  1. [转] React Router 使用教程

    PS:react-route就是一个决定生成什么父子关系的组件,一般和layout结合起来,保证layout不行,内部的子html进行跳转 你会发现,它不是一个库,也不是一个框架,而是一个庞大的体系. ...

  2. React Router 使用教程

    一.基本用法 React Router 安装命令如下. $ npm install -S react-router 使用时,路由器Router就是React的一个组件. import { Router ...

  3. Webpack4 splitChunks配置,代码分离逻辑

    博客不知道啥时候写的了,一直在草稿箱没写完,突然感觉今年过去大半了,又没怎么写博客.写写完,有始有终 1.代码分离升级 原来项目代码分离是通过下面的配置,基于bundle-loader插件,通过rou ...

  4. React Router学习笔记(转自阮一峰老师博客)

    React Router是一个路由库,通过管理URL来实现组件切换和状态转变. 1.安装和使用 $ npm install -S react-router 在使用时,作为React组件导入 impor ...

  5. react router 4.0以上的路由应用

    thead>tr>th{padding:8px;line-height:1.4285714;border-top:1px solid #ddd}.table>thead>tr& ...

  6. 关于react router 4 的小实践

    详细代码栗子:https://github.com/wayaha/react-dom-CY clone然后 npm install npm start 分割线 1.这个项目使用create-react ...

  7. React Router 4.x 开发,这些雷区我们都帮你踩过了

    前言 在前端框架层出不穷的今天,React 以其虚拟 DOM .组件化开发思想等特性迅速占据了主流位置,成为前端开发工程师热衷的 Javascript 库.作为 React 体系中的重要组成部分:Re ...

  8. React router动态加载组件-适配器模式的应用

    前言 本文讲述怎么实现动态加载组件,并借此阐述适配器模式. 一.普通路由例子 import Center from 'page/center'; import Data from 'page/data ...

  9. React Router教程

    React Router教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-router-dom 应用于浏览 ...

  10. React Router API文档

    React Router API文档 一.<BrowserRouter> 使用HTML5历史记录API(pushState,replaceState和popstate事件)的<Rou ...

随机推荐

  1. 20155305 2016-2017-2《Java程序设计》课程总结

    20155305 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 [预备作业1](http://www.cnblogs.com/20155305ql/p/6 ...

  2. 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验三

    20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验三 并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现 ...

  3. 20155310第一周JAVA实验报告

    20155310第一周JAVA实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 使用JDK和IDE编译.运行简单 ...

  4. 初识Linux的感受与对它的印象——20155328张钰清

    之前从未接触过虚拟机的我,由于这次寒假预备作业,稍稍地认识了一下Linux操作系统. 在自己笔记本上安装Linux操作系统 根据老师提供的<基于VirtualBox虚拟机安装Ubuntu图文教程 ...

  5. C#基础之反射

    虽然还在学校读书,反射实际写的不多.但感觉反射在程序开发中用得还是挺多的,对我来说也是.NET中的一个难点.通过反射,我们可以在运行时获得.NET中的每一个类型的成员,这些类型包括类.结构.委托和枚举 ...

  6. 北京Uber优步司机奖励政策(4月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. C/C++ 下mysql应用封装(连接增删改查)

    mysql - 初始化 1) mysql_init():初始化数据库 2) mysql_real_connect()(不推荐用Mysql_connect()):连接数据库 详细代码如下: bool d ...

  8. MongoDB Chapter1:Introduction

    你是在防火墙后面吗? 为了继续本课程,您必须能够将计算机的传出请求发送到我们在MongoDB Atlas中设置的数据库服务器.这些服务器在Amazon AWS中的端口27017上运行. 请单击http ...

  9. Facebook190亿美元收购WhatsApp

    Facebook收购WhatsApp,前后只花费10天时间.这是Facebook迄今规模最大的一笔收购,可能也是史上最昂贵的一笔针对靠私人风投起家的企业的收购案. 2月9日,马克•扎克伯格(Mark ...

  10. ES6的新特性(1)——ES6 的概述

    ES6 的概述 首先,感谢马伦老师的ES6新特性的教程. ECMAScript 和 JavaScript 的关系是 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前 ...