react性能优化-懒加载原理

Posted lin-fighting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react性能优化-懒加载原理相关的知识,希望对你有一定的参考价值。

编译阶段的优化

开发阶段构建更快

  • loader的include和exclude属性
 
        test: /.(j|t)sx?$/,
        use: [
          
            loader: "thread-loader",
          ,
          
            loader: "babel-loader",
            options: 
              presets: [
                ["@babel/preset-env",  modules: false ], //es6->es5
                "@babel/preset-react", // react->es5
                "@babel/preset-typescript", //ts->es5
              ],
              plugins: [
                //按需加载
                ["import",  libraryName: "antd", style: "css" ],
              ],
            ,
          ,
        ],
        include: path.resolve("src"),
        exclude: /node_modules/,
      ,
  • resolve
  resolve: 
    modules: [path.resolve('node_modules')], //配置模块的查找范围
    extensions: [".ts", ".tsx", ".js", ".json", ".jsx"],
    alias: 
      "@": resolvePath("./src"),
      views: resolvePath("@/views"),
    ,
    // webpack5之后不再有node模块的profill了,不配置也行
    fallback: 
      crypto: false, //不包含crypto的profill
      buffer: false,//不包含crypto的profill
      stream: false,//不包含crypto的profill
    
  ,
  • 编译缓存
    cache 会在开发 模式被设置成 type: ‘memory’ 而且在 生产 模式 中被禁用。 cache: true 与 cache: type: ‘memory’ 配置作用一致
    开发模式下默认开启。

  // webpack5新增的新功能,缓存
  cache: 
    type: "memory",
  ,

webpack4的话可以使用插件进行缓存

const  HardSourceWebpackPlugin = require('hard-source-webpack-plugin')

plugins: [new HardSourceWebpackPlugin()]

第二次编译速度快80%,也是进行缓存。

  • 开启多进程
    thread-loader,会开启多进程来执行babel-loader。
 
        test: /.(j|t)sx?$/,
        use: [
          
            loader: "thread-loader",
          ,
          
            loader: "babel-loader",
            options: 
              presets: [
                ["@babel/preset-env",  modules: false ], //es6->es5
                "@babel/preset-react", // react->es5
                "@babel/preset-typescript", //ts->es5
              ],
              plugins: [
                //按需加载
                ["import",  libraryName: "antd", style: "css" ],
              ],
            ,
          ,
        ],
        include: path.resolve("src"),
        exclude: /node_modules/,
      ,

路由切换优化

懒加载实现

类似React.lazy的功能。当需要用到的时候才会去加载。原理类似jsonp。

  • 实现懒加载:
const LoadHome: any = React.lazy(() => import("./Home"));
const LoadUser: any = React.lazy(() => import("./User"));

const App = () => 
  useSetRem();
  return (
    <HashRouter>
      <React.Suspense fallback=<div>loading....</div>>
        <ul>
          <li>
            <Link to="/">home</Link>
          </li>
          <li>
            " "
            <Link to="/user">user</Link>
          </li>
        </ul>
        <Routes>
          <Route path="/" element=<LoadHome />></Route>
          <Route path="/user" element=<LoadUser />></Route>
        </Routes>
      </React.Suspense>
    </HashRouter>
  );
;

官方提供了React.lazy方法,


点home的时候再去加载。原理其实很容易。
实现:

const lazy = (loadComponent) => 
  return class extends React.Component 
    state =  Component: null ;
    componentDidMount() 
      loadComponent().then((res) => 
        this.setState( Component: res.default );
      );
    

    render() 
      const  Component  = this.state as any;
      return Component && <Component />;
    
  ;
;

  • 主要就是()=>import(‘xx’)返回的是一个Promise,
  • 首先lazy返回一个什么都不渲染的组件,只有等组件开始渲染才会执行生命周期函数。
  • 配合Route,当匹配到路径的时候,Route才会去渲染element,
  • 所以当匹配到home的时候,页面开始渲染经过lazy包裹的类组件,
  • 执行componentDidMount,执行promise,通过then获取到函数组件,然后通过setState改变状态,返回去渲染,从而达到懒加载的目的。

预先请求

浏览器首屏的时候不加载,空闲的时候再加载,如

const LoadHome: any = React.lazy(
  () =>
    import("./Home" /*webpackPrefetch: true */ /*webpackChunkName: 'home' */)
);
const LoadUser: any = React.lazy(
  () =>
    import("./User" /*webpackPrefetch: true */ /*webpackChunkName: 'user' */)
);

const LoadTest: any = React.lazy(
  () =>
    import("./Test" /*webpackPrefetch: true */ /*webpackChunkName: 'test' */)
);

使用魔法注释,效果:

会加入这一条link的标签。

当我们切换的时候会发现,已经预先请求好的。
除此之外还有预加载,preloader,与预请求的用法相似,但是他是将该资源的权重升级,首页就需要加载这个资源,就是预加载,用的不好会影响首页加载时间。

以上是关于react性能优化-懒加载原理的主要内容,如果未能解决你的问题,请参考以下文章

网页性能优化02-懒加载工作原理

react 懒加载

react 懒加载

react 懒加载

前端面试题之性能优化篇

前端优化 lazy-load(懒加载)