hết hạn hộp làm việc

Khá phổ biến là muốn đặt các hạn chế vào bộ nhớ đệm về thời lượng cho phép các mục được lưu trữ trong bộ nhớ đệm hoặc số lượng mục sẽ được lưu trong bộ nhớ đệm. Workbox cung cấp chức năng này thông qua trình bổ trợ workbox-expiration cho phép bạn giới hạn số lượng mục nhập trong bộ nhớ đệm và / hoặc xoá các mục nhập đã được lưu vào bộ nhớ đệm trong một thời gian dài.

Giới hạn số lượng mục nhập trong bộ nhớ đệm

Để hạn chế số lượng mục nhập được lưu trữ trong bộ nhớ đệm, bạn có thể sử dụng tuỳ chọn maxEntries như sau:

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {ExpirationPlugin} from 'workbox-expiration';

registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new ExpirationPlugin({
        maxEntries: 20,
      }),
    ],
  })
);

Bằng cách này, Trình bổ trợ sẽ được thêm vào tuyến này. Sau khi sử dụng phản hồi đã lưu vào bộ nhớ đệm hoặc một yêu cầu mới được thêm vào bộ nhớ đệm, trình bổ trợ sẽ xem xét bộ nhớ đệm đã định cấu hình và đảm bảo rằng số lượng mục nhập đã lưu vào bộ nhớ đệm không vượt quá giới hạn. Nếu có, các mục cũ nhất sẽ bị xoá.

Giới hạn độ tuổi của mục nhập được lưu vào bộ nhớ đệm

Để hạn chế thời lượng một yêu cầu được lưu vào bộ nhớ đệm, bạn có thể xác định độ tuổi tối đa tính bằng giây bằng cách sử dụng tuỳ chọn maxAgeSeconds như sau:

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {ExpirationPlugin} from 'workbox-expiration';

registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new ExpirationPlugin({
        maxAgeSeconds: 24 * 60 * 60,
      }),
    ],
  })
);

Trình bổ trợ này sẽ kiểm tra và xoá các mục sau mỗi lần yêu cầu hoặc cập nhật bộ nhớ đệm.

Cách sử dụng nâng cao

Nếu muốn sử dụng logic hết hạn tách biệt với bất kỳ mô-đun Workbox nào khác, bạn có thể thực hiện việc này bằng lớp CacheExpiration.

Để áp dụng các hạn chế cho một bộ nhớ đệm, bạn sẽ tạo một bản sao của CacheExpiration cho bộ nhớ đệm mà bạn muốn kiểm soát như sau:

import {CacheExpiration} from 'workbox-expiration';

const cacheName = 'my-cache';
const expirationManager = new CacheExpiration(cacheName, {
  maxAgeSeconds: 24 * 60 * 60,
  maxEntries: 20,
});

Mỗi khi cập nhật một mục đã lưu vào bộ nhớ đệm, bạn cần gọi phương thức updateTimestamp() để cập nhật tuổi của mục đó.

await openCache.put(request, response);

await expirationManager.updateTimestamp(request.url);

Sau đó, bất cứ khi nào muốn hết hạn một tập hợp mục nhập, bạn có thể gọi phương thức expireEntries() để thực thi cấu hình maxAgeSecondsmaxEntries.

await expirationManager.expireEntries();

Loại

CacheExpiration

Lớp CacheExpiration cho phép bạn xác định thời hạn và / hoặc giới hạn về số lượng phản hồi được lưu trữ trong Cache.

Thuộc tính

  • hàm khởi tạo

    void

    Để tạo một thực thể CacheExpiration mới, bạn phải cung cấp ít nhất một trong các thuộc tính config.

    Hàm constructor sẽ có dạng như sau:

    (cacheName: string, config?: CacheExpirationConfig) => {...}

    • cacheName

      string

      Tên của bộ nhớ đệm để áp dụng các hạn chế.

    • cấu hình

      CacheExpirationConfig không bắt buộc

  • xóa

    void

    Xoá kho lưu trữ đối tượng IndexedDB dùng để theo dõi siêu dữ liệu hết hạn của bộ nhớ đệm.

    Hàm delete sẽ có dạng như sau:

    () => {...}

    • giá trị trả về

      Promise<void>

  • expireEntries

    void

    Hết hạn các mục nhập cho bộ nhớ đệm và tiêu chí đã cho.

    Hàm expireEntries sẽ có dạng như sau:

    () => {...}

    • giá trị trả về

      Promise<void>

  • isURLExpired

    void

    Có thể dùng để kiểm tra xem URL đã hết hạn hay chưa trước khi sử dụng.

    Việc này yêu cầu bạn tra cứu từ IndexedDB nên có thể chậm.

    Lưu ý: Phương thức này sẽ không xoá các mục đã lưu trong bộ nhớ đệm, hãy gọi expireEntries() để xoá các mục đã được lập chỉ mục trong bộ nhớ đệm và indexDB.

    Hàm isURLExpired sẽ có dạng như sau:

    (url: string) => {...}

    • url

      string

    • giá trị trả về

      Promise<boolean>

  • updateTimestamp

    void

    Cập nhật dấu thời gian cho URL được cung cấp. Điều này đảm bảo thời điểm xoá các mục nhập dựa trên các mục nhập tối đa, được sử dụng gần đây nhất là chính xác hoặc khi hết hạn, dấu thời gian sẽ là mới nhất.

    Hàm updateTimestamp sẽ có dạng như sau:

    (url: string) => {...}

    • url

      string

    • giá trị trả về

      Promise<void>

ExpirationPlugin

Bạn có thể sử dụng trình bổ trợ này trong workbox-strategy để thường xuyên thực thi giới hạn về độ tuổi và / hoặc số lượng yêu cầu được lưu vào bộ nhớ đệm.

Bạn chỉ có thể dùng thuộc tính này với các thực thể workbox-strategynhóm thuộc tính cacheName tuỳ chỉnh. Nói cách khác, bạn không thể dùng phương thức này để hết hạn các mục nhập trong chiến lược sử dụng tên bộ nhớ đệm mặc định trong thời gian chạy.

Bất cứ khi nào một phản hồi đã lưu vào bộ nhớ đệm được sử dụng hoặc cập nhật, trình bổ trợ này sẽ xem xét bộ nhớ đệm liên kết và xoá mọi phản hồi cũ hoặc thừa.

Khi sử dụng maxAgeSeconds, phản hồi có thể được sử dụng một lần sau khi hết hạn vì quá trình dọn dẹp thời hạn sẽ không diễn ra cho đến sau khi sử dụng phản hồi đã lưu vào bộ nhớ đệm. Nếu phản hồi có tiêu đề "Date" (Ngày), thì quy trình kiểm tra thời hạn nhẹ sẽ được thực hiện và phản hồi sẽ không được sử dụng ngay lập tức.

Khi sử dụng maxEntries, mục nhập được yêu cầu gần đây nhất sẽ bị xoá khỏi bộ nhớ đệm trước tiên.

Thuộc tính

  • hàm khởi tạo

    void

    Hàm constructor sẽ có dạng như sau:

    (config?: ExpirationPluginOptions) => {...}

  • deleteCacheAndMetadata

    void

    Đây là một phương thức trợ giúp thực hiện hai thao tác:

    • Xoá tất cả các thực thể Bộ nhớ đệm cơ bản được liên kết với phiên bản trình bổ trợ này bằng cách thay mặt bạn gọi caches.delete().
    • Xoá siêu dữ liệu khỏi IndexedDB dùng để theo dõi thông tin chi tiết về thời hạn của từng thực thể Bộ nhớ đệm.

    Khi sử dụng tính năng hết hạn bộ nhớ đệm, bạn nên gọi phương thức này trực tiếp caches.delete(), vì điều này sẽ đảm bảo rằng siêu dữ liệu IndexedDB cũng bị xoá sạch và các thực thể IndexedDB mở.

    Lưu ý rằng nếu bạn không sử dụng tính năng hết hạn bộ nhớ đệm cho một bộ nhớ đệm nhất định, thì bạn chỉ cần gọi caches.delete() và truyền tên của bộ nhớ đệm vào là đủ. Trong trường hợp đó, không cần phương pháp riêng cho Workbox để dọn dẹp.

    Hàm deleteCacheAndMetadata sẽ có dạng như sau:

    () => {...}

    • giá trị trả về

      Promise<void>

ExpirationPluginOptions

Thuộc tính

  • matchOptions

    CacheQueryOptions không bắt buộc

  • maxAgeSeconds

    số không bắt buộc

  • maxEntries

    số không bắt buộc

  • purgeOnQuotaError

    boolean không bắt buộc