Đồng bộ hoá dữ liệu của ứng dụng web ở chế độ nền để mang lại trải nghiệm giống ứng dụng hơn
Bạn đã bao giờ gặp phải tình huống nào sau đây chưa?
- Đi tàu hoặc tàu điện ngầm không kết nối mạng hoặc kết nối không ổn định
- Đã bị nhà mạng điều tiết sau khi xem quá nhiều video
- Sống ở một quốc gia có băng thông gặp khó khăn trong việc đáp ứng nhu cầu
Nếu có, thì chắc chắn bạn sẽ cảm thấy khó chịu khi bị một số việc được thực hiện trên web và tự hỏi tại sao các ứng dụng dành riêng cho nền tảng lại thường làm tốt hơn trong các trường hợp này. Các ứng dụng dành riêng cho nền tảng có thể tìm nạp nội dung mới như tin bài hoặc thời tiết thông tin. Ngay cả khi không có mạng trên tàu điện ngầm, bạn vẫn có thể đọc tin tức.
Tính năng Đồng bộ hoá dưới nền định kỳ cho phép các ứng dụng web đồng bộ hoá định kỳ dữ liệu trong nền, đưa các ứng dụng web đến gần hơn với hành vi của một nền tảng cụ thể .
Dùng thử
Bạn có thể thử tính năng đồng bộ hoá ở chế độ nền theo định kỳ thông qua bản minh hoạ trực tiếp ứng dụng. Trước khi sử dụng, hãy đảm bảo rằng:
- Bạn đang dùng Chrome 80 trở lên.
- Bạn cài đặt ứng dụng web trước khi bật tính năng đồng bộ hoá định kỳ ở chế độ nền.
Khái niệm và cách sử dụng
Tính năng đồng bộ hoá định kỳ ở chế độ nền giúp bạn hiển thị nội dung mới khi một ứng dụng web tiến bộ hoặc trang dựa trên trình chạy dịch vụ được khởi chạy. Công cụ này thực hiện việc này bằng cách tải dữ liệu xuống trong trong nền khi không dùng ứng dụng hoặc trang. Việc này ngăn chặn làm mới nội dung sau khi ra mắt trong lúc đang xem. Tốt hơn nữa, ngăn ứng dụng hiển thị vòng quay nội dung trước khi làm mới.
Nếu không định kỳ đồng bộ hoá ở chế độ nền, các ứng dụng web phải dùng những phương thức thay thế để tải dữ liệu xuống. Một ví dụ phổ biến là sử dụng thông báo đẩy để đánh thức một dịch vụ . Người dùng bị gián đoạn bởi một thông báo, chẳng hạn như "có dữ liệu mới". Về cơ bản, việc cập nhật dữ liệu chỉ là một tác dụng phụ. Bạn vẫn có thể chọn thông qua thông báo đẩy cho những nội dung cập nhật thực sự quan trọng, chẳng hạn như tin nổi bật.
Tính năng đồng bộ hoá định kỳ ở chế độ nền dễ bị nhầm lẫn với tính năng đồng bộ hoá ở chế độ nền. Mặc dù có tên tương tự, trường hợp sử dụng của chúng khác nhau. Ngoài ra, đồng bộ hoá dưới nền thường được dùng nhất để gửi lại dữ liệu đến máy chủ khi yêu cầu trước đó không thành công.
Có được mức độ tương tác của người dùng phù hợp
Nếu được thực hiện không đúng cách, việc đồng bộ hoá định kỳ ở chế độ nền có thể gây lãng phí của chúng tôi. Trước khi phát hành, Chrome sẽ trải qua giai đoạn dùng thử để giúp đảm bảo rằng thông tin đó đúng. Phần này giải thích một số quyết định về thiết kế của Chrome đã thực hiện để làm cho tính năng này trở nên hữu ích nhất có thể.
Quyết định thiết kế đầu tiên mà Chrome đưa ra là một ứng dụng web chỉ có thể sử dụng đồng bộ hoá trong nền sau khi một người cài đặt ứng dụng đó trên thiết bị của họ và khởi chạy ứng dụng dưới dạng một ứng dụng riêng biệt. Không dùng được tính năng đồng bộ hoá định kỳ ở chế độ nền bối cảnh là một thẻ thông thường trong Chrome.
Hơn nữa, vì Chrome không muốn các ứng dụng web không được sử dụng hoặc ít khi được sử dụng một cách vô cớ
tiêu thụ pin hoặc dữ liệu, Chrome đã thiết kế tính năng đồng bộ hoá trong nền theo định kỳ sao cho
nhà phát triển sẽ phải kiếm được lợi ích đó
bằng cách cung cấp giá trị cho người dùng của họ. Cụ thể,
Chrome đang sử dụng điểm tương tác trang web
(about://site-engagement/
) để xác định xem liệu và tần suất đồng bộ hoá trong nền có thể diễn ra định kỳ hay không
cho một ứng dụng web nhất định. Nói cách khác, sự kiện periodicsync
sẽ hoàn toàn không được kích hoạt trừ phi lượt tương tác
điểm số lớn hơn 0 và giá trị của nó ảnh hưởng đến tần suất mà
Sự kiện periodicsync
sẽ kích hoạt. Điều này đảm bảo rằng các ứng dụng duy nhất đồng bộ hoá trong
nền là những nền mà bạn đang sử dụng.
Tính năng đồng bộ hoá định kỳ ở chế độ nền có một số điểm tương đồng với các API và trên các nền tảng phổ biến. Chẳng hạn như đồng bộ hoá nền một lần cũng như thông báo đẩy cho phép logic của ứng dụng web tồn tại lâu hơn một chút (thông qua service worker) sau khi một người đã đóng trang. Trên hầu hết các nền tảng, những người đã cài đặt các ứng dụng truy cập mạng định kỳ trong nền để cung cấp trải nghiệm người dùng tốt hơn cho các bản cập nhật quan trọng, tìm nạp trước nội dung, đồng bộ hoá dữ liệu, v.v. Tương tự, định kỳ đồng bộ hoá ở chế độ nền kéo dài thời gian tồn tại của logic của một ứng dụng web để chạy định kỳ cho những gì có thể mất vài phút.
Nếu trình duyệt cho phép điều này xảy ra thường xuyên và không có hạn chế, thì trình duyệt có thể dẫn đến một số vấn đề về quyền riêng tư. Sau đây là cách Chrome giải quyết vấn đề này rủi ro đồng bộ hoá định kỳ ở chế độ nền:
- Hoạt động đồng bộ hoá ở chế độ nền chỉ diễn ra trên mạng mà thiết bị đã kết nối trước đó. Chrome đề xuất chỉ kết nối với các mạng do các bên đáng tin cậy.
- Giống như tất cả các hình thức giao tiếp Internet, quá trình đồng bộ hoá định kỳ trong nền sẽ tiết lộ IP địa chỉ của máy khách, máy chủ giao tiếp và tên của máy chủ. Để giảm mức phơi sáng này ở mức gần như nếu ứng dụng chỉ được đồng bộ hoá khi chạy ở nền trước, trình duyệt sẽ giới hạn tần suất của một nền của ứng dụng sẽ đồng bộ hóa để phù hợp với tần suất người dùng sử dụng ứng dụng đó. Nếu một người ngừng thường xuyên tương tác với ứng dụng, đồng bộ hoá ở chế độ nền theo định kỳ sẽ ngừng kích hoạt. Đây là một điểm cải tiến ròng so với hiện trạng trong phiên bản dành riêng cho từng nền tảng của chúng tôi.
Khi nào có thể sử dụng?
Quy tắc sử dụng sẽ khác nhau tuỳ theo trình duyệt. Tóm lại, Chrome sẽ đặt các yêu cầu sau đây về quá trình đồng bộ hoá định kỳ ở chế độ nền:
- Một điểm số tương tác của người dùng cụ thể.
- Sự hiện diện của mạng đã sử dụng trước đây.
Nhà phát triển không kiểm soát thời gian đồng bộ hoá. Chiến lược phát hành đĩa đơn tần suất đồng bộ hoá sẽ phù hợp với tần suất sử dụng ứng dụng. (Lưu ý rằng các ứng dụng dành riêng cho nền tảng hiện không làm điều này.) Tính năng này cũng lấy nguồn điện của thiết bị và trạng thái kết nối.
Khi nào nên sử dụng công cụ này?
Khi trình chạy dịch vụ của bạn thức dậy để xử lý sự kiện periodicsync
, bạn sẽ có
cơ hội yêu cầu dữ liệu, nhưng không có nghĩa vụ phải thực hiện việc đó. Khi xử lý
sự kiện, bạn nên đưa điều kiện mạng và dung lượng lưu trữ còn trống vào
và tải các lượng dữ liệu khác nhau xuống. Bạn có thể sử dụng
các tài nguyên sau để trợ giúp:
Quyền
Sau khi cài đặt trình chạy dịch vụ, hãy sử dụng quyền Quyền
API để truy vấn
với giá periodic-background-sync
. Bạn có thể thực hiện việc này từ cửa sổ hoặc
ngữ cảnh của trình chạy dịch vụ.
const status = await navigator.permissions.query({
name: 'periodic-background-sync',
});
if (status.state === 'granted') {
// Periodic background sync can be used.
} else {
// Periodic background sync cannot be used.
}
Đăng ký đồng bộ hoá định kỳ
Như đã đề cập, quá trình đồng bộ hoá ở chế độ nền định kỳ cần có một trình chạy dịch vụ. Truy xuất
PeriodicSyncManager
sử dụng ServiceWorkerRegistration.periodicSync
rồi gọi
register()
trên đó. Để đăng ký, bạn phải có cả thẻ và tối thiểu
khoảng thời gian đồng bộ hoá (minInterval
). Thẻ này xác định quá trình đồng bộ hoá đã đăng ký
để có thể đăng ký nhiều lần đồng bộ hoá. Trong ví dụ bên dưới, tên thẻ là
'content-sync'
và minInterval
là một ngày.
const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {
try {
await registration.periodicSync.register('content-sync', {
// An interval of one day.
minInterval: 24 * 60 * 60 * 1000,
});
} catch (error) {
// Periodic background sync cannot be used.
}
}
Xác minh việc đăng ký
Gọi periodicSync.getTags()
để truy xuất một mảng thẻ đăng ký. Chiến lược phát hành đĩa đơn
ví dụ bên dưới sử dụng tên thẻ để xác nhận rằng quá trình cập nhật bộ nhớ đệm đang hoạt động nhằm tránh
đang cập nhật lại.
const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {
const tags = await registration.periodicSync.getTags();
// Only update content if sync isn't set up.
if (!tags.includes('content-sync')) {
updateContentOnPageLoad();
}
} else {
// If periodic background sync isn't supported, always update.
updateContentOnPageLoad();
}
Bạn cũng có thể dùng getTags()
để hiển thị danh sách các thông tin đăng ký đang hoạt động trên web
để người dùng có thể bật hoặc tắt các loại
bản cập nhật.
Phản hồi sự kiện đồng bộ hoá ở chế độ nền theo định kỳ
Để phản hồi một sự kiện đồng bộ hoá ở chế độ nền định kỳ, hãy thêm một sự kiện periodicsync
cho trình chạy dịch vụ của bạn. Đối tượng event
được truyền vào sẽ chứa một
Tham số tag
khớp với giá trị dùng trong quá trình đăng ký. Ví dụ: nếu một
quá trình đồng bộ hoá ở chế độ nền định kỳ được đăng ký bằng tên 'content-sync'
, sau đó
event.tag
sẽ là 'content-sync'
.
self.addEventListener('periodicsync', (event) => {
if (event.tag === 'content-sync') {
// See the "Think before you sync" section for
// checks you could perform before syncing.
event.waitUntil(syncContent());
}
// Other logic for different tags as needed.
});
Đang huỷ đăng ký quá trình đồng bộ hoá
Để kết thúc quá trình đồng bộ hoá đã đăng ký, hãy gọi periodicSync.unregister()
bằng tên của
đồng bộ hoá mà bạn muốn huỷ đăng ký.
const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {
await registration.periodicSync.unregister('content-sync');
}
Giao diện
Dưới đây là thông tin tóm tắt về các giao diện do Nền tảng định kỳ cung cấp API đồng bộ hoá.
PeriodicSyncEvent
. Đã truyền đến trình xử lý sự kiệnServiceWorkerGlobalScope.onperiodicsync
tại thời gian mà trình duyệt chọn.PeriodicSyncManager
. Đăng ký và huỷ đăng ký đồng bộ hoá định kỳ và cung cấp thẻ cho các tài khoản đã đăng ký đồng bộ hoá. Truy xuất một thực thể của lớp này từ ServiceWorkerRegistration.periodicSync` thuộc tính này.ServiceWorkerGlobalScope.onperiodicsync
. Đăng ký một trình xử lý để nhậnPeriodicSyncEvent
.ServiceWorkerRegistration.periodicSync
. Trả về tham chiếu đếnPeriodicSyncManager
.
Ví dụ:
Cập nhật nội dung
Ví dụ sau đây sử dụng tính năng đồng bộ hoá định kỳ ở chế độ nền để tải xuống và lưu các bài viết mới nhất vào bộ nhớ đệm cho một trang web tin tức hoặc blog. Hãy lưu ý tên thẻ cho biết loại đồng bộ hoá này ('update-articles'
). Lệnh gọi đến updateArticles()
được gói trong event.waitUntil()
để trình chạy dịch vụ không kết thúc trước khi các bài viết được tải xuống và lưu trữ.
async function updateArticles() {
const articlesCache = await caches.open('articles');
await articlesCache.add('/api/articles');
}
self.addEventListener('periodicsync', (event) => {
if (event.tag === 'update-articles') {
event.waitUntil(updateArticles());
}
});
Thêm tính năng đồng bộ hoá định kỳ ở chế độ nền vào một ứng dụng web hiện có
Cần có nhóm thay đổi này để thêm đồng bộ hoá định kỳ ở chế độ nền với một PWA hiện có. Ví dụ này bao gồm một số câu lệnh ghi nhật ký hữu ích mô tả trạng thái đồng bộ hoá định kỳ ở chế độ nền trong ứng dụng web.
Gỡ lỗi
Việc xem và xem từ đầu đến cuối quá trình đồng bộ hoá định kỳ ở chế độ nền có thể là một thách thức trong khi kiểm thử cục bộ. Thông tin về các lượt đăng ký đang hoạt động, số liệu đồng bộ hoá gần đúng các khoảng thời gian và nhật ký về các sự kiện đồng bộ hoá trước đây cung cấp bối cảnh có giá trị khi gỡ lỗi hành vi của ứng dụng web. Rất may là bạn có thể tìm thấy tất cả các thông tin đó thông qua một tính năng thử nghiệm trong Công cụ của Chrome cho nhà phát triển.
Ghi lại hoạt động tại địa phương
Phần Đồng bộ hoá nền định kỳ của Công cụ cho nhà phát triển được sắp xếp xoay quanh các sự kiện chính trong vòng đời đồng bộ hoá định kỳ ở chế độ nền: đăng ký đồng bộ hoá, thực hiện đồng bộ hoá nền và huỷ đăng ký. Để có được thông tin về các sự kiện này, nhấp vào Start recording(Bắt đầu ghi).
Trong khi ghi, các mục nhập sẽ xuất hiện trong Công cụ cho nhà phát triển tương ứng với các sự kiện, với ngữ cảnh và siêu dữ liệu được ghi lại cho mỗi báo cáo.
Sau khi bật tính năng ghi lại một lần, tính năng này sẽ luôn bật trong tối đa 3 ngày. cho phép Công cụ cho nhà phát triển thu thập thông tin gỡ lỗi cục bộ về đồng bộ hoá trong nền có thể diễn ra, thậm chí là nhiều giờ trong tương lai.
Mô phỏng sự kiện
Mặc dù việc ghi lại hoạt động ở chế độ nền có thể hữu ích, nhưng đôi khi bạn sẽ
muốn kiểm tra trình xử lý periodicsync
ngay lập tức mà không phải chờ
sự kiện kích hoạt theo tần suất bình thường.
Bạn có thể thực hiện việc này qua phần Service Workers trong bảng điều khiển Application (Ứng dụng) trong Công cụ của Chrome cho nhà phát triển. Trường Đồng bộ hoá định kỳ cho phép bạn cung cấp thẻ cho để sử dụng và kích hoạt sự kiện đó bao nhiêu lần tuỳ thích.
Sử dụng giao diện Công cụ cho nhà phát triển
Kể từ Chrome 81, bạn sẽ thấy phần Đồng bộ hóa trong nền định kỳ trong phần Bảng điều khiển Ứng dụng của Công cụ cho nhà phát triển.