IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> react性能优化-懒加载原理 -> 正文阅读

[JavaScript知识库]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,与预请求的用法相似,但是他是将该资源的权重升级,首页就需要加载这个资源,就是预加载,用的不好会影响首页加载时间。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:23:13  更:2022-03-12 17:27:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:31:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码