Prefetch

本文介绍了浏览器优化技术Prefetch,探讨了如何通过HTML、HTTP头、ServiceWorkers和Webpack实现预取资源,以减少加载时间,提升用户在页面交互时的体验。
摘要由CSDN通过智能技术生成

Prefetch (<link rel="prefetch">) 是一种浏览器优化,它允许我们在需要后续路由或页面之前获取可能需要的资源。可以通过几种方式实现预取。它可以在 HTML 中以声明方式完成(例如在下面的示例中),通过 HTTP 头(Link: </js/chat-widget.js>; rel=prefetch)、Service Workers 或通过更自定义的方式(例如通过 Webpack)。

<link rel="prefetch" href="/pages/next-page.html" />
<link rel="prefetch" href="/js/emoji-picker.js" />

在展示如何根据可见性或交互导入模块的示例中,我们看到在单击按钮以切换组件和在屏幕上显示实际组件之间经常存在一些延迟。发生这种情况,因为当用户单击按钮时,模块仍然必须被请求和加载!

在许多情况下,我们知道用户会在页面初始呈现后不久请求某些资源。尽管它们可能无法立即显示,因此不应包含在初始 bundle 包中,但尽可能减少加载时间以提供更好的用户体验会很棒!

我们知道可能在应用程序中的某个时间点使用的组件或资源可以预取。我们可以通过在 import 语句中添加一个神奇的注释来让 Webpack 知道某些 bundle 需要预取: /* webpackPrefetch: true */

const EmojiPicker = import(/* webpackPrefetch: true */ "./EmojiPicker");
// ChatInput.js

import React, { Suspense, lazy } from "react";
import Send from "./icons/Send";
import Emoji from "./icons/Emoji";

const EmojiPicker = lazy(() =>
  import(/*webpackPrefetch: true,
    webpackChunkName: "emoji-picker"*/
  "./EmojiPicker")
);
const ChatInput = ({ emojiPicker, gifPicker }) => {
  const [pickerOpen, togglePicker] = React.useReducer(state => !state, false);

  return (
    <div className="chat-input-container">
      <input type="text" placeholder="Type a message..." />
      <Emoji onClick={togglePicker} />
      {pickerOpen && (
        <Suspense fallback={<p id="loading">loading</p>}>
          <EmojiPicker />
        </Suspense>
      )}
      <Send />
    </div>
  );
};

console.log("ChatInput loading", Date.now());

export default ChatInput;

构建应用程序后,我们可以看到 EmojiPicker 将被预取。

 Asset                             Size       Chunks                          Chunk Names
    emoji-picker.bundle.js         1.49 KiB   emoji-picker [emitted]          emoji-picker
    vendors~emoji-picker.bundle.js 171 KiB    vendors~emoji-picker [emitted]  vendors~emoji-picker
    main.bundle.js                 1.34 MiB   main  [emitted]                 main

Entrypoint main = main.bundle.js
(prefetch: vendors~emoji-picker.bundle.js emoji-picker.bundle.js)

实际输出在文档head显示为带有 rel="prefetch" link标签。

<link rel="prefetch" href="emoji-picker.bundle.js" as="script" />
<link rel="prefetch" href="vendors~emoji-picker.bundle.js" as="script" />

浏览器甚至在用户请求资源之前就请求和加载预取的模块。当浏览器处于空闲状态并计算出它有足够的带宽时,它将发出请求以加载资源并缓存它。缓存资源可以显著减少加载时间,因为我们不必在用户单击按钮后等待请求完成。它可以简单地从缓存中获取加载的资源。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在语言中,prefetch是一种优化技术,用于预先加载数据到CPU缓存中,以减少访存延迟和提高程序性能。它可以在循环迭代或函数调用之前,先将未来循环迭代或函数调用中可能需要的数据加载到CPU缓存中。 在C语言中,使用预处理器指`#pragma`来指定prefetch的相关操作。具体的实现方式可能因为编译器和硬件平台的不同而有所差异。 下面是一个简单的示例代码,展示了如何使用prefetch来提高数据访问效率: ```c #include <stdio.h> #define PREFETCH_DISTANCE 4 void prefetch_example(int* array, int size) { int i; // Prefetch the data for future iterations for (i = 0; i < size; i += PREFETCH_DISTANCE) { __builtin_prefetch(&array[i + PREFETCH_DISTANCE]); } // Process the data for (i = 0; i < size; i++) { // Access array[i] here printf("%d ", array[i]); } } int main() { int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int size = sizeof(array) / sizeof(array[0]); prefetch_example(array, size); return 0; } ``` 在上面的代码中,我们使用`__builtin_prefetch`函数来进行数据预取。在循环中,我们通过指定一个距离`PREFETCH_DISTANCE`来控制预取的间隔。这样,循环中的每个迭代都会预先加载未来迭代可能需要的数据到CPU缓存中,以提高访问效率。 需要注意的是,prefetch的效果可能因为硬件平台和具体的应用场景而有所不同。因此,在使用prefetch时,需要进行实际测试和性能评估,以确保它能够带来实际的性能提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值