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 maxAgeSeconds
và maxEntries
.
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
-
giá trị trả về
-
-
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-strategy
có nhó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) => {...}
-
cấu hình
ExpirationPluginOptions không bắt buộc
-
giá trị trả về
-
-
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