Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SOK-31] Service Worker #19

Merged
merged 4 commits into from
Oct 10, 2024
Merged

[SOK-31] Service Worker #19

merged 4 commits into from
Oct 10, 2024

Conversation

VladToby
Copy link
Collaborator

@VladToby VladToby commented Oct 8, 2024

### Какую задачу решаем

Скриншоты/видяшка (если есть)

TBD (если есть)

if (cachedResponse) {
return cachedResponse
}
return new Response('Network error happened', {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выглядит так, что где-то тут приложение упадет, если пользователь не залогинен. Нам нужно как-то обработать сценарий, где пользователь попал на главую, приложение закешировалось, затем интернет отвалился. У пользователя должна остаться возможность хотябы попасть на главую.

Верхом будет, если закинуть ему тостер, что "Ваше интернет соединение не стабильно".

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так смотри. Если после отвала интернета, пользователь заходит в приложение (на главную), то тут сработает сценарий на 19 строке. Он достанет страницу из кеша и отдаст. Так что тут всё хорошо в плане логики.

const DYNAMIC_CACHE_NAME = 'dynamic-data-v1'
const urlsToCache = [
'/',
'/manifest.json',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А имеет ли смысл тут указывать все файлы, если первый "/" уже покрывает все остальные?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил

}
return response
} catch (error) {
console.error('Fetch failed; returning cached page instead.', error)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Возможно не стоит это указывать в error. Ведь это поведение мы отлавливаем. И ожидаем, что такой сценарий может быть.

Возможно стоит warning или info использовать. Но не уверен.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут на ваше усмотрение. Консоль только разработчики открывают. Если так удобно, то окей.

В реальном же мире, на реальном продукте, тут будет отправка запроса в аналитику (раз интернета нет, то сохранение где-то в localStorage, а отправка уже при появлении инета), чтобы аналитики, да и разработчики могли отслеживать графики того, как часто у юзеров отваливается инет

const cache = await caches.open(DYNAMIC_CACHE_NAME)
try {
const response = await fetch(request)
if (response && response.status === 200 && response.type === 'basic') {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Возможно стоит вынести в переменную isResponseSuccess, так как если добавиться хотя бы еще одно условие, может быть слишком много условий в if-е.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поддерживаю. Доп. переменные — это всегда хорошо, потому что код становится более читаемым.

@@ -0,0 +1,58 @@
const STATIC_CACHE_NAME = 'static-data-v1'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не понимаю смысла разделения тут кеша на два. Если направишь меня, буду благодарен.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Честно, я тоже не до конца понимаю. Я изначально подумал, что тут просто несколько стратегий реализуется, и для каждой стратегии свой кеш.

Думаю, что в данном случае, это просто доп. усложнение, так как придётся в случае сброса кеша, обновлять две переменные, а не одну.

Copy link

@MikeDevice MikeDevice left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Всё написано на хорошем уровне! Можно, конечно, тут извернуться, и описать больше кейсов, но для текущего проекта не стоит.

Оставил комменты, которые желательно изучить.

const cache = await caches.open(DYNAMIC_CACHE_NAME)
try {
const response = await fetch(request)
if (response && response.status === 200 && response.type === 'basic') {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поддерживаю. Доп. переменные — это всегда хорошо, потому что код становится более читаемым.

@@ -0,0 +1,58 @@
const STATIC_CACHE_NAME = 'static-data-v1'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Честно, я тоже не до конца понимаю. Я изначально подумал, что тут просто несколько стратегий реализуется, и для каждой стратегии свой кеш.

Думаю, что в данном случае, это просто доп. усложнение, так как придётся в случае сброса кеша, обновлять две переменные, а не одну.

return
}

if (!(url.indexOf('http') === 0)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно сразу !== сделать, чем отрицать равенство, через !.

Можно лучше: немного сложная проверка, потому что сложно читать, и легко ошибиться. Давай разбираться. Ты ищешь в урле http. Метод indexOf либо вернёт индекс, либо -1. Ты проверяешь, что http находится не в начале строки. И если это так, то делаешь return. То есть ты не обрабатываешь не http(s) запросы через sw.

Тут понятно. Но можно красивее:
!url.startsWith('http')

}
return response
} catch (error) {
console.error('Fetch failed; returning cached page instead.', error)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут на ваше усмотрение. Консоль только разработчики открывают. Если так удобно, то окей.

В реальном же мире, на реальном продукте, тут будет отправка запроса в аналитику (раз интернета нет, то сохранение где-то в localStorage, а отправка уже при появлении инета), чтобы аналитики, да и разработчики могли отслеживать графики того, как часто у юзеров отваливается инет

return cachedResponse
}
return new Response('Network error happened', {
status: 408,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут можно кинуть 408, но чаще тут кидают 503

if (cachedResponse) {
return cachedResponse
}
return new Response('Network error happened', {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так смотри. Если после отвала интернета, пользователь заходит в приложение (на главную), то тут сработает сценарий на 19 строке. Он достанет страницу из кеша и отдаст. Так что тут всё хорошо в плане логики.

Copy link

@MikeDevice MikeDevice left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Всё написано на хорошем уровне! Можно, конечно, тут извернуться, и описать больше кейсов, но для текущего проекта не стоит.

Оставил комменты, которые желательно изучить.

@VladToby VladToby merged commit fde4655 into develop Oct 10, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants