Pull to refresh

Comments 54

Решить бы еще на клиентской стороне эту проблему…
Так это и есть решение проблемы именно на клиентской стороне)
Я имею ввиду чтобы куча вкладок не убивала клиентскую машину с точки зрения расхода памяти=)
Полезность вашего решения я не отрицаю, разумеется.
Тоже подумал про проблемы браузера когда увидел название. Не пойму почему до сих пор не сделали опцию полной выгрузки вкладки (или всех неактивных вкладок за последние 30 минут например) в свап с заморозкой всех её скриптов по желанию пользователя.
Да часто и перезагрузить не жалко — трафик дешевле, чем память.
НЕТ! Очень плохое решение! У меня иногда вкладка с набранным текстом висит неделю. А ещё прогресс в играх, выбранные опции и так далее. Не все сайты умеют сохранять state корректно. А если ещё и браузер начнёт вкладки убивать из-за того что я открыл больше одной — это совсем зашквар
Если это выбирает пользователь (и по умолчанию вуключено), то все Ок. Но вообще, я за решение от firk. Только надо не системный своп использовать, а просто сделать правильный дисковый кеш.

Но лично я не отказался бы и просто выгружать вкладки, которые не были активны в течение суток. Еще можно детектировать наличие фокуса на текстовых полях и тд.
Да, это действительно больно. Я как-то обновился на Dev версию Chrome, которая так делала. Это слишком сильно мешало.
иногда во вкладке играет музыка, например, или ожидается событие с внешней стороны — мессенджеры, фронтенды к сервисам и так далее. Нельзя просто так брать и замораживать все вкладки как поведение по умолчанию. Сейчас уже используются технологии энергосбережения, когда выделяется меньше CPU фоновым вкладкам и тд, этого достаточно.
Как опцию или фичу — можно
CPU не узкое место в этом вопросе. Браузер за пару часов забивает память, система убирает другие приложения в своп. А потом вы переходите в любимую IDE и ждете, пока оно оттуда откопается — отзывчивость системы падает радикально.
Chrome + The Great Suspender более менее похоже и делают (насколько можно для расширения сделать). И да — введенный во вкладке текст блокирует ее увод. Играющая музыка — учитывается. Есть белые списки…
А зачем эта драка за главенство, если можно просто отдать его старшей по времени создания среди живых, да хоть и младшей?
Проблема в том, что умирающая вкладка не знает ничего о других. О их количестве и есть ли они вообще. В свою очередь Secondary не знают ничего друг о друге.
Можно хранить массив из времени создания всех вкладок, но это более ресурсоемкая задача — гонять массивы
В LocalStorage нельзя прописать список вкладок с id/timestamp?

Можно. И надо хранить массив открытых вкладок там же. А при закрытии одной из них пробегать счета по всем и сравнивать их по timestamp. Если вкладок >10 это уже будет дольше, чем мой вариант.

SharedWorker — интересная задумка, но поддержка браузеров очень слабая. На мобильных, так вовсе работать не будет. А мое решение абсолютно универсально в плане браузеров и устройств, т.к. localStorage поддерживается везде.
Данную реализацию не встречал, но спасибо за наводку. Покопаюсь в ней)

Неужели юзеры и правда открывают так много вкладок, что это становится проблемой? #янерепрезантативен

У меня как-то в доке уже не помещались окна от хрома, в каждом из которых было открыто вкладок как на иллюстрации.
Бывает такое, что при онлайне в 10 000 юзеров на сайте в каждой вкладке есть чат, в который приходят сообщения. Если мы откроем несколько, хотя бы 2, вкладки у каждого, то наш сервер уже будет загибаться, чтобы всем все отправить.
Либо нужно очень мощное железо, что дорого, либо подобное решение)
Вы трафик через webRTC гоняйте — всё легче чем множество веб сокетов.
С данной технологией не знаком, но выглядит многообещающе. Ознакомлюсь, спасибо!)
А насколько у него хорошо с совместимостью? Ещё год назад использовать его было практически невозможно

Да нет, я понял, какую проблему вы решаете:)
Я просто не понимаю, зачем юзеры открывают по две вкладки с одним и тем же.

Допустим, это twitch. У меня открыта главная страница со списком стримов, вторая на втором мониторе с активным стоимость, который я смотрю и ещё одна на фоне, я просто хочу посмотреть, что там происходит.
Или же это сайт-биржа. Я слежу сразу за несколькими котировками валюты в реалтайме

А можно ли так сделать — при уходе вкладки в фон закрывать сокет, а при приходе на вкладку опять открывать?
P.S. да, сработает лишь в ряде случаев, т.к. оперативно обновлятся фоновая вкладка не будет.

Это решение породит куда больше проблем. В браузерах есть событие о том, что пользователь сделала вкладку аквтивной или ушел с нее. Т.е. мы можем открывать и закрывать соединения, а вот на сервере активные клиенты все равно будут какое-то время существовать и им будет все отдаваться в сокеты. Они будут умирать через некое время, что в моменте может порождать большое количество мертвых, но активных соединений. Это же даёт возможность при переключении их вкладки во вкладку быстро положить даже самый сильный бекенд

Я например на хабре открываю статьи на почитать потом. «Потом» иногда оказывается… сильно не скоро.
В моем случае — хабр можно заменить и например на Gitlab.com/СИ/Goodreads…
Как тут ниже заметили, «потом прочитаю». Вот прям сейчас у меня только хабровых вкладок открыто десятка два — пробежался быстренько по /all, пооткрывал потенциально интересное и потихоньку просматриваю. Или ютупчик пока гундосят нечто невнятное — поглядываешь что он там еще предлагает по теме и в фоновую вкладку открываешь. На другом видео из списка — повторить. Таким образом открывается 100500 вкладок которые уже изучаешь…
Еще одна реализация, подобная той, что писал KYuri. Надо будет посмотреть.
Именно для этого мы здесь и собрались, чтобы находить лучшие решения)
У меня проблема была в том, что на Хабре я не смог ничего подобного найти, а разобраться самому во всех тонкостях работы такой большой библиотеки сложновато
Еще одна реализация, подобная той, что писал KYuri. Надо будет посмотреть.
Именно для этого мы здесь и собрались, чтобы находить лучшие решения)
Интересно как оно работает с «засыпанием» (hibernation) вкладок в Vivaldi.
Содержимое вкладки при этом стирается и заменяется «пустой» вкладкой.

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

Эта идея у меня как раз в первом ангуляре и нашла свое первое воплощение)
А как получается, если открыты не вкладки, а окна? Иногда могут открыть одно и то же в разных окнах. Зачем — не спрашивайте, но такое бывает
localStorage на то и local, что существует локально. Он существует только в рамках одного окна.
Разве? Как может существовать в рамках одного окна то, что сохраняется при закрытии браузера?
Хм… да, вот здесь я ошибся. Не знал о таком поведение localStorage. Если открыть один и тот же домен в нескольких! окнах!, то и LS у них будет общий. приношу извинения за смуту. Занятная механика)

А разве браузеру не все равно — разные это вкладки или окна? Это уже детали отображения, не более

То есть, primary-вкладка будет определяться и в других окнах?
UFO landed and left these words here
Самый полезное, функциональное и удобное расширение для работы с кучей вкладок — Tabs Outliner. Не благодарите :)
function now() {
    return new Date().getTime();
}

Лучше заменить на
function now() {
    return Date.now();
}

А не логичнее ли в современных реалиях вынести общий коннект в ServiceWorker? Он будет гарантированно один на все вкладки одного сайта. Так же из плюсов вижу, что браузер его прибьет сам (а с ним и коннект) при длительном отсутствии активности во всех подключившихся к воркеру вкладок.

А почему бы не сделать так:


  1. Открываем вкладку, спрашиваем, кто главный, если тишина — становимся главным, иначе говорим главному свой ид
  2. в beforeunload для слейвов отправляем главному свой ID и говорим прощай
  3. в beforeunload для главного посмотреть список слейвов, и явно указать кто будет следующим главным.

Думаю будет меньше плясок с рандомами...

Sign up to leave a comment.

Articles