react 实现页面代码分割、按需加载

虽然一直有作 react 相关的优化,按需加载、dll 分离、服务端渲染,可是历来没有从路由代码分割这一块入手过,昨天在本地开发时没有测试成功,今天又搞了下,已经部署到线上环境了,今天就这个记录一下。javascript

修改配置

  • 开发环境:webpack@v3react-router@v4
  • 安装依赖:css

    $ yarn add babel-plugin-syntax-dynamic-import -dev
  • 修改 .babelrc 文件:在 plugins 中添加 "syntax-dynamic-import"

改造项目代码

  • 安装依赖:java

    $ yarn add react-loadable
  • 根据 react-loadable 文档提示,咱们须要提供一个载入新页面时的 Loading 组件,同时对加载和超时状态进行区别提示:react

    import React from 'react';
    import { Icon } from 'antd';
    
    const Loading = ({ pastDelay, timedOut, error }) => {
      if (pastDelay) {
        return <div><Icon type="loading" /></div>;
      } else if (timedOut) {
        return <div>Taking a long time...</div>;
      } else if (error) {
        return <div>Error!</div>;
      }
      return null;
    };
  • 更改页面组件导入方法:webpack

    import React from 'react';
    import Loadable from 'react-loadable';
    import { Route, Switch } from 'react-router-dom';
    
    const Home = Loadable({
      loader: () => import('../Home'),
      loading: Loading,
      timeout: 10000
    });
    const EditArticle = Loadable({
      loader: () => import('../EditArticle'),
      loading: Loading,
      timeout: 10000
    });
    
    ...
    
    <Switch>
        <Route exact path="/home" component={Home} />
        <Route path="/editarticle" component={EditArticle} />
    </Switch>

    而后打包结果就会分离出各页面代码:git

    打包结果

    在页面中咱们只须要载入入口文件 app.js ,其余脚本在访问到对应页面时都会经由这个文件载入。github

验证结果

在将静态资源上传到 cdn 以后,在页面中加载 app.cssapp.js ,运行以后访问各个页面就会依次加载对应脚本,结果如图:web

运行结果

能够看到,在访问第一个页面时加载的页面脚本经 gzip 压缩后仅有 21.8KB !!!固然这与页面复杂度也有关,可是相较于加载所有脚本,已是大幅减小了,这种优化对访问目标性很强的用户感觉起来尤其明显。缓存

这么作的另外一个好处就是当咱们只更改项目中某些页面的业务代码时,其余页面的代码依然是不变的,因此这个时候其余页面用的是客户端缓存,从另外一个层面又作了一次优化。bash

Tips

该文章首发于个人博客https://blog.bingqichen.me/

相关文章
相关标签/搜索