React项目如何解决首页加载缓慢的问题

1,020 阅读2分钟

首先React这类框架?

目前主流的前端框架React、Vue、Angular都是采用客户端渲染(服务端渲染暂时不在本文的考虑范围内)。这当然极大的减轻了服务器的压力。相对的浏览器的压力就增加了。这就意味着大量的js文件需要在本地运行。而从服务器下载这些大的js文件需要时间。再运行这些js又需要时间。这是首页加载慢的本质原因。当然只是首页,因为后续有缓存的存在,相对就很快了。那么如何提升速度呢?无非从两个方向入手:

  • 提高下载静态资源的速度
  • 优化代码提高运行速度

提升下载静态资源的速度

提升下载静态资源的速度的方法有很多。

升级HTTP1.1到HTTP2.0,开启gzip数据压缩,上cdn等,这些都是最有效提升速度的方法。

自己的网站也主要从这些方面去一一的优化来提高速度的。

优化代码提高运行速度

安装cnpm install react-loadable -S

如果项目有100个页面,那laodable.js就需要写100遍,这样就感觉有点冗余了,所以这个我们可以封装一下

首先,我们建一个util    src/util/loadable.js

import React from 'react';

import Loadable from 'react-loadable';

import { Spin } from 'antd';

//通用的过场组件

function loadingComponent() {

return (

  <div style={{

     display"flex",

     justifyContent"center",
      alignItems"center",

      textAlign'center',

      width"100%",

      height"1000px"

    }}> 
    <Spin size="large" />
   </div>

  )

}



//过场组件默认采用通用的,若传入了loading,则采用传入的过场组件

export default (loader, loading = loadingComponent) => {

  return Loadable({

    loader,

    loading

  });

}

compression-webpack-plugin还有其它配置项,具体可以去webpack官网,直接搜索compression-webpack-plugin就行。

如果使用的是antd框架,通过打包分析,你会发现有个icons文件500多k,有点大~

解决办法是:

1.随意找个地方建个.js文件,名称也随意~,比如是icons.js (当然要规范哈),用来按需引入在项目中使用到的图标,如下:

复制代码

// 根据自己在项目中使用到的图标 按需引入
export { default as UserOutline} from '@ant-design/icons/lib/outline/UserOutline'
export { default as LockOutline} from '@ant-design/icons/lib/outline/LockOutline'
export { default as GitlabOutline} from '@ant-design/icons/lib/outline/GitlabOutline'
export { default as ProjectOutline} from '@ant-design/icons/lib/outline/ProjectOutline'
export { default as BulbOutline} from '@ant-design/icons/lib/outline/BulbOutline'
export { default as DesktopOutline} from '@ant-design/icons/lib/outline/DesktopOutline'

复制代码

  2.在webpack配置文件中的alias对象,添加一些代码,代码如下:

alias:{
   '@ant-design/icons/lib/dist$': path.resolve(__dirname, '填第一步文件的路径')
   // '@ant-design/icons/lib/dist$': path.resolve(__dirname, '../src/util/icons.js')
}

注:目前使用的antd版本是^3.26.15 。如果项目中,用的图标太多,那就有点麻烦了,可以直接考虑用阿里巴巴矢量图吧~