В последнее время появилось много статей о недостатках современного софта, при этом никто не пробует предложить свои решения, чтобы поменять ситуацию. Эта статья — ответ на некоторые статьи об этом, равно как и о мечтах о идеальном браузере. Как можно было бы переработать браузер, его UI, методы взаимодействия с сайтами, улучшить протоколы и пользовательский опыт в целом. Если у вас есть какие-то, пусть даже самые смелые мысли по этому поводу, то предлагаюсь обсудить их и быть может заложить основы для создания идеального браузера. В конечном счете, рано или поздно это нужно будет сделать, так как ситуация на рынке браузеров на данный момент совсем не радостная. И не проблема, что другие браузеры очень сложны и их сложно догнать — мы можем пойти по своему пути, реализовывать только необходимые части стандартов, при этом можем вводить свои нестандартные расширения. Не надо бежать за другими, пусть другие бегут за нами. Пусть наш браузер будет создан для людей, а не во имя коммерческих интересов корпораций добра и странных консорциумов, от которых давно нет никакой пользы.
Что же должно быть в идеальном браузере?
Поиск
Если делать новый браузер, то первое, что в нем должно быть — это локальный поиск по всему. По открытым вкладкам, кешу, закачанным файлам и по тоннам метаинформации внутри. Поиск должен быть как по индексам, так и по регуляркам, причем пользователь должен иметь возможность выбрать все возможные опции, включая кодировки документов (к примеру, очень неплохой поиск в Far).
Однажды на одном из форумов я нашел интересную концепцию алгоритма. Обсуждения не было, так что я быстро закрыл вкладку, но сама концепция осела у меня в голове. Поразмышляв над ней в фоновом режиме, я решил поделиться своими идеями… Но где? Быстро посмотрев форумы, где я обычно обитал — я не нашел ничего подобного. В поисковиках тоже ничего, но это и не удивительно — форумы не мгновенно индексируются. Я начал рыться в хистори браузера — ничего не нашел, но это и не удивительно, так как она большая, ей неудобно пользоваться, я мог что-то пропустить. Я заново открывал почти все странички — ничего подобного не нашел. Я начал искать сообщения в почте, в мессенджерах, даже спрашивать людей — без результата. Я уже было начал думать, что мной управляют рептилоиды, внушающие концепты, как решился применить последнее средство: поиск по файлам браузерного кеша. И почти мгновенно нашел то место, которое искал. Оказалось, что поскольку никто не отвечал в тему форума, автор подумал, что он написал глупость, ему стало стыдно и он просто удалил тред. А я эту удаленную тему долго искал и не мог найти, накручивая себя.
В другой раз мне понадобилось обновить видеофайл. Файл назывался 1.mp4 (думаю, у многих таких файлов много). Он представлял определенную ценность для меня, но к сожалению, он оказался битым. Где я его скачал? Пришлось заново искать его по тем кейвордам, что были в самом видео.
Сессии
Когда пытаешься разобраться с какой-то новой темой, то сами собой открываются десятки вкладок. Ссылка за ссылкой и у нас чтива на несколько дней. Причем каждая вкладка — это что-то важное, что надо прочитать. Что делать нам? Особенно когда все это копится все сильнее и сильнее?
Можно просто закрыть все виденное и положиться на историю, дескать в будущем, если это будет нужно, оно найдется. Или свалить все вкладочки в букмарки. Или даже сохранять/распечатывать страницы — это не очень удобно, зато точно найденная информация никогда не пропадет (впрочем, про сохранение информации будет написано далее).
А может быть сохранять всю сессию целиком, как некий проект? Давать им осмысленные имена вида «Искал модель лодки», «Учусь программировать» и включать/выгружать по мере надобности? Механизм профилей или сессий есть сейчас в каждом браузере, только он зачастую как-то спрятан, что отыскать его сложно, а пользоваться еще сложнее. Пожалуй единственный браузер, где такой механизм хорошо реализован — это браузер Edge в своих последних версиях. При всех недостатках данного браузера, данный механизм сделан в нем максимально удобно и позволяет не накапливать вкладки, а удобно их сортировать. Конечно, нет предела совершенству, но иметь хотя бы такой вариант — обязательно. А еще лучше иметь возможность сохранять такие сессии вместе с кешем/контентом страниц. Только не так, как это делают браузеры сейчас, сохраняя кеш в некотором бинарном виде, а чтобы можно было открыть 100 вкладок по новой теме, сохранить их в какой-то читаемый другими устройствами формат (.html/.pdf) и залить себе на телефон, где спокойно читать, быть может в отдалении от цивилизации.
Приватность
Пользователь должен сам решать, какой информацией с сайтом он хочет поделиться. Я не должен искать разные переключалки User-Agent-ов, такая функциональность должна быть встроена в сам браузер. К примеру, поисковик Google.com отлично работает, если представиться links-ом, а неприятного инстант-поиска, поедающего вводимый текст, не появляется.
Я хочу иметь возможность:
- задавать ширину и высоту экрана (любую, хоть 50000x50000 пикселей)
- глубину цвета, независимо от текущих настроек
- добавить сайт в доверенные, чтобы его куки не прокисали при нажатии «очистить все»
- заменить шрифты на странице, при этом предоставлять сайту тот список шрифтов, который он хочет
- предоставлять произвольный User-Agent, быть может даже рандомный, взятый из большого файла вариантов или привязанный к конкретному сайту
- выбирать язык контента и видеть то, что передается серверу, а не просто «предпочитаемый язык», который еще неизвестно во что развернется
- количество и последовательность заголовков, включая эмуляцию известных багов других браузеров
И вообще, все то, что можно отфингерпринтить, надо иметь возможность изменить. Я хочу иметь такую возможность.
Самое смешное, что древние браузеры имеют кучу настроек для этого. К примеру, такие браузеры как links, w3m и netsurf позволяют не только отключать Referrer/User-Agent, но и предоставляют множество разных интересных опций, где можно достаточно тонко настроить поведение браузера, как он будет заполнять эти поля. В то время как только будущие версии Firefox научатся это делать, причем лишь частично, не давая 100% защиты пользователя, без каких-либо опций, жестко определяя поведение лишь при некоторых условиях (впрочем, о настройках сайтов и условиях мы еще поговорим).
Летающие корабли
Очень долгое время MSIE не поддерживал position:fixed, за что его ругали. И как показывает практика — хорошо, что не поддерживал. Правда людей это не останавливало и они эмулировали его через JS с прыгающими менюшками, которые сохранились и по сей день на миллионах сайтов.
Сегодня перекрытие элементов используется для всякого полезного: окна логина на весь экран, вылезающие во время просмотра страниц и которые нельзя убрать (facebook), всплывающие ассистенты, оказывающиеся чат-ботами, сообщения на весь экран о акциях и подарках, как я что-то выиграл, иногда просто мне показывают рекламу (само собой без рекламы, но и без кнопки закрытия), прозрачные попапы, которые не дают кликать по странице (pornhub), ну и апофеоз: мне рассказывают, что я должен отключить AdBlock, которого у меня нет.
А вы пробовали распечатать любую страницу? А я вот достаточно часто «печатаю» PDF и мне хочется бить тех, кто делают всплывающие растяжки вида «мы используем кукисы» или «вот тут брейкин-ньюз» где-то вверху или снизу экрана. Ну, или просто фиксированное меню сверху и простой футер снизу. Не, ну на экране это выглядит еще ничего, можно страничку поскроллить и как-то прочитать то, что они загораживают. А вы знаете, что эта гадость печатается на каждой странице? И печатается поверх текста? И что бумагу не поскроллить, хотя очень охота, ведь эта гадость загораживает часть контента, который никак не прочитать? Пока что я вынужден через инспектор элементов/ublock отламывать стили или удалять какие-то отдельные менюшки, только после этого я могу «распечатать» страницу. Это несколько напрягает. А вот если бы были простые управляемые элементы, то такого бы даже не случилось!
Зато внутри движка браузера можно детектировать, когда элемент перекрывает собой текстовую информацию и… Ну, к примеру, убирать его куда-то в сторону. Или вообще отламывать стили, объявляя их опасными. Вариантов масса. Можно представить страницу как слои и дать пользователю пару кнопок, чтобы «срезать» верхние слои или возвращать обратно, как это сделано в некоторых игрушках или трехмерных редакторах — я джва года хочу такую функцию!
Забавно, но когда-то IE отказался от рендеринга тега blink, но он позволял из JS подвигать окно браузера и сделать незакрываемые попапы. Нынче даже отобразить текст в статусной строке уже сложно, проще ее эмулировать. Теперь я предлагаю что-то сделать с перекрывающими текст блоками, возможно как-то отломать эту функцию. И приходиться отламывать все больше фич, чтобы их нельзя было использовать их во вред. Да, ради этого можно написать свой браузер, пусть без соблюдения стандартов, зато удобный для чтения текста, к тому же программить меньше.
Снапшот страницы
Бывает так, что, открыв какую-то незатейливую страничку с каким-то текстом, порой забываешь о ней и оставляешь висеть во вкладках, «на потом», «чтобы не забыть». Как правило, там нет ничего особенного. Например, там рассказывают как выращивать клубнику на даче и совсем ничего такого, что предвещает неприятности.
А придя к компьютеру через несколько часов замечаешь, что КУРСОР МЫШКИ ЕЛЕ ДВИГАЕТСЯ, ВСЕ В СВОПЕ, РАБОТАТЬ ЗА КОМПЬЮТЕРОМ НЕВОЗМОЖНО, В УЖАСЕ ОТКРЫВАЕШЬ СПИСОК ПРОЦЕССОВ И КИЛЯЕШЬ ГАДА (если сможешь дождаться отрисовки списка процессов). И тут закрывается вкладочка как раз с этим невинным сайтом.
Чтобы такого не было, я в свое время написал для Firefox плагин, который спустя 5 секунд после загрузки страницы (события onload) подменял setInterval/setTimeout/requestAnimationFrame на пустые вызовы, которые ничего не делали, а существующие отключал. В принципе, я радовался. Правда всякие интерактивные элементы, вроде разворачивающихся спойлеров, тоже перестали работать, так как таймеров больше не было, а открытие спойлера запускало таймер для анимации. Большая ли это цена? Мне пришлось отказаться от своего плагина, так как я не мог возвращать обработчики по какому-то событию, но если мы пишем свой браузер — почему нет?
Альтернативная реализация: спустя 10 секунд от события onload, мы останавливаем весь JS, выгружаем DOM и оставляем только те структурки в памяти, которые нужны для рендеринга прямоугольничков с текстом, таблицами и картинками. Все, пусть фоновая вкладка будет чем-то вроде картинки с текстом, не более того. Еще одна альтернатива: весь лейаут мы рендерим в отдельном процессе, а загружаем только координаты текста и картинок после рендеринга, как это было в Opera Mini, таким образом наш браузер будет еще чуток безопаснее.
Самое интересное, что в современной Опере нечто подобное уже есть, но включается только при переключении на питание от батарей. Я же хочу всегда иметь такую опцию для сайтов, особенно для сайтов, которые я посещаю впервые. Вообще, в кишках всех современных браузеров есть много полезных функций, но они захардкожены и не могут быть настроены пользователем, из-за чего браузеры практически теряют огромный потенциал.
Кеширование контента локально
Рассказываю идею на миллион баксов: загрузка страницы за 0мс. Нет, даже если сайт полностью лежит в нашем кеше, то он не откроется, пока мы не пошлем запрос, не подождем Round Trip Time, не распарсим ответ, а потом не проделаем аналогичное со всеми оставшимися скриптами и стилями. А что мешает открывать его СРАЗУ из кеша и в фоне проводить валидацию контента, посылая сразу запросы ко ВСЕМ ресурсам в фоне, в фоне же, используя двойную буферизацию, обновлять данные в случае изменений, как просто перерисовывая картинки, так и блоки текста? Скажете, что уже было в IE и называлось «Работать автономно»? Да, в IE до сих пор много хороших и интересных функций, но во-первых, данная функция работала не всегда, а во-вторых, мы не сможем обновить страницу, а в моем случае страница будет автоматически перерисована по мере валидации.
К сожалению, в современном вебе кеширование не просто плохо работает, а скорее не работает вообще. Но что мешает принудительно сохранять странички на диск? Это позволило бы не только открыть сайт в случае его смерти, спасти какой-то полезный контент, но и отслеживать, к примеру, динамику изменения цен на товары или ловить собеседников на том, что они изменили свои посты. Конечно, можно сохранять странички на диск вручную… Но как правило вспоминаешь об этом только тогда, когда уже надо вернуться к какой-то старой версии, а ее нету, а на веб-архив надежды мало. Иногда можно выковырять контент из поисковиков, но это работает не всегда, особенно если сразу не успел. Особенно это было бы полезно в тех случаях, когда контент легко разделяем на отдельные управляемые элементы, но об этом немного позже.
Само собой, кеширование должно быть в виде инкрементальных diff-ов (иначе места не хватит на всё), с интеллектуальным парсингом неотображаемой информации (незачем хранить изменяющийся код счетчиков), с подсветкой изменений, с выбором старых версий прямо из адресной строки. Хранить можно уже распаршенные странички, как набор прямоугольников и их координат на экране, таким образом можно ускорить рендеринг, а изображения можно даунскейлить и хранить в виде h265, который гораздо лучше jpeg-картинок — мы экономим место. И если уж мы столько сил потратили на принудительный кеш и его облагораживание, то почему бы не поделиться им с кем-то еще? Юзер-интерфейс тут главное. Фича не только должна быть, но ей должно быть удобно пользоваться: открывать разные версии страницы, удалять или сохранять версии страниц, анонсировать их как публичный кеш, делать выборку страниц и выгружать локальные версии сайта (страниц, по которым ходили), делать что-то вроде mht/pdf с рабочими ссылками, чтобы их можно было открывать на других устройствах, а не только они оседали где-то во внутренних хранилищах браузера, как происходит в некоторых мобильных браузерах.
Чтобы ускорить загрузку страниц и застраховать себя от нежданных инъекций кода, различные скрипты, такие как jquery и ему подобные, хранящиеся на разных CDN, можно подгружать прямо с локального диска, как это делает расширение Decentraleyes. Загрузка шрифтов и икон-паков станет мгновенной. Узнать больше о том, что уже есть: addons.mozilla.org/en-US/firefox/addon/decentraleyes. Разумеется, неплохо бы сделать инъекции своего кода, по аналогии с browser.js (только не руками авторов) или Grease Monkey (только без троянов), чтобы можно было изменять/исправлять код сайтов. Нет, не костыли в виде плагина, а нативную поддержку, которая не будет тормозить, как это когда-то было в Опере. Но увы, сейчас удобных средств для патчинга кода сайтов просто нет. Ричард Столлман называет это «тивоизацией» сайтов, но об этом будет написано в разделе о подписях кода.
Добавим сюда некий гипотетический sitemap.xml, определяющий родство статей, страницы для упреждающего кеширования, ссылку на некий трекер для p2p-обмена контентом… И мы получаем самореплицирующийся сайт, который можно сохранить и использовать локально, который будет выдерживать любые нагрузки и контент которого не умрет никогда. Впрочем об этом, равно как и о распределенных сайтах, мы поговорим далее.
Подпись кода
Многие из нас не задумываются, но в браузере может исполняться код разных людей, написанный под различными, в том числе и несвободными лицензиями. И не факт, что пользователь согласен с этими лицензиями. Это как вступать в сексуальные отношения без предварительного согласия. В принципе, в большинстве случаев ничего плохого не произойдет, но могут быть нюансы. Ричард Столлман написал отличную статью «Ловушка Javascript», по мотивам которой было написано расширение LibreJS: en.wikipedia.org/wiki/GNU_LibreJS — это то, что должно стать отправной точкой в деле интерпретации Javascript в нашем браузере!
Если бы указание лицензии было частью стандарта, жизнь была бы чуточку легче, но этого нет. Если бы авторы кода его подписывали своим публичным ключем, то я мог бы хотя бы доверять различным авторам, но нет и этого. Остается только хешировать скрипты, включая самые мелкие, вшитые в страницу и спрашивать пользователя «разрешить ли это?» для запуска каждого из них, ведя базу разрешенных или запрещенных скриптов. Что-то уровня антивируса. Тоже поиск «вирусни» по сигнатурам, но вместо эвристического анализатора — указание лицензии и вопросы к пользователю. На основе таких хешей можно не только обезопасить себя от вредоносного кода, но и построить систему версионирования. Создать инфраструктуру, где будет запускаться только тот код, которому вы доверяете! Вам ведь надоело бороться со скриптами, которые переворачивают текст и просят отключить Адблок? Я бы отключил, но у меня нету Адблока, равно как и уверенности в том, что завтра меня не попросят сделать донейт или подписаться на какую-то аферу.
Если вы еще не знакомы с замечательным трудом Ричарда Столлмана, то рекомендую почитать: www.gnu.org/philosophy/javascript-trap.ru.html (на русском языке).
Оценка сайтов / антирейтинг
Некоторые браузеры, такие как Опера, зачем-то пытались исправить каждый сайт руками, делая патчи через инъекцию кастомного кода. И однажды им это надоело, итог мы все знаем. Хотя они вполне заслуженно гордились своими достижениями, которые подтверждались в разных пузомерках, выполняя тесты на соответствие стандарту.
Но можно было пойти другим путем: вместо того, чтобы что-то патчить, писать кому-то на емейл, использовать личные связи и все такое, можно было бы выводить текст патча прямо поверх страницы со словами «автор этого сайта не придерживается стандарта, следующий код мог бы починить этот сайт». Дернул вызов IE-only? Никакой эмуляции, вместо неё большой красный попап о профпригодности автора (конечно же, не перекрывая контента). Многие пользователи конечно проигнорируют это, но кто-то может задать авторам сайта вопрос: «А что это тут так много красненького?». И владельцы сайта будут рассказывать, как они экономили деньги на программистах. Или рассказывать клиенту о том, что надо бы поставить «нормальный Гуугле Кхроме», из-за чего клиент скорее уйдет от них. Если же такой сайт будет выводить что-то вроде «location.href = 'http://google.com/', приходите к нам еще» — так это еще лучше, не надо связываться с такими людьми.
Можно пойти дальше: картинка на странице отображается как 100х100, а на самом деле 500х500? Красный попап с сообщением о том, что автор не умеет ресайзить картинки. Картинка с фотореалистичной графикой пожата в PNG? Красный попап о том, что автор не разбирается в форматах файлов. На странице нету ссылки на главную страницу? Красный попап с сообщением о том, что автор сайта не сделал нормальную навигацию.
Конечно, красный попап выводить можно не всегда. К примеру, если PNG изображение можно лучше оптимизировать через optipng, то можно выводить просто красненький варнинг, как выводят их блокировщики рекламы. Нечто подобное уже делают различные CDN-оптимизаторы, которые и картинки пережимают, и код минифицируют, а на входе даже SQL-инъекции пытаются фильтровать. Но вся эта радость будет только в том случае, если автор заплатил денег и подключил соответствующие услуги, а что делать простому пользователю? А простой пользователь может просто отказаться от использования некачественного сайта, и его браузер должен ему в этом помочь.
Уже сейчас отчет блокировщиков рекламы, который выводит цифирки, можно считать неким антирейтингом сайта. Чем больше антирейтинг — тем хуже сайт и автору надо бы что-то с этим сделать. При некоторых значениях можно просто выводить варнинги о том, что посещение этого сайта может быть нежелательным. Причем я считаю, что браузер должен делиться своими находками с сообществом. Можно создать глобальный рейтинг каждого сайта, цепляя заветные цифирки к каждой ссылке, чтобы случайно не перейти куда-то туда, где пользователя ждет «плохой опыт». Конечно, автоматизировать все нельзя. Поэтому можно создать несколько рейтингов, часть из которых будут вести живые люди, вручную проверяя код, проверяя их лицензии и качество кода, качество сайта в целом. Конечно же, механизм должен быть децентрализованным и неподконтрольным конкретным лицам. Пусть пользователь сам решит, на какие подписки будет подписан.
Индивидуальные настройки сайтов
Каждый сайт или группа сайтов должны иметь свои индивидуальные настройки, подобно тому, как это можно было настроить в старой Опере (до 12-х версий включительно). Только данный механизм можно улучшить.
Во-первых, идентифицировать сайты не только по домену или поддомену, но и по регулярному выражению в домене. Или по полученному IP-адресу этого домена. К примеру, я не хочу выполнять скрипты на сайтах/ресурсах от Яндекса (о причинах см. далее), я бы мог найти списки блоков IP-адресов, пренадлежащих Яндексу и нежно перебанить выполнение неблагонадежного кода. Это просто и легко. Но на данный момент я вынужден ограничиться лишь баном отдельных доменов (а их всех я не знаю!), занесением всех диапазонов адресов в фаерволл, что крайне неудобно, или же поднятием своего DNS-сервера с указанием адресов для маски *yandex*, что я делаю на данный момент.
Во-вторых, чтобы не плодить сущности, можно создать базовые профили, такие как «доверенный сайт», «обычный сайт», «плохой сайт», «для сайтов от Васяна», «для Алиэкспресса» и присваивать свои настройки тому или иному сайту. И в зависимости от профиля, будет отправляться свой User-Agent, последовательность и содержимое заголовков, поддерживаться или неподдерживаться загрузка стилей, шрифтов, скриптов и всего остального, что только можно настроить. Даже определить, можно ли перехватывать правый клик мыши, с какой точностью запускать таймеры или воспроизводить ли анимации и звуки (с непонятной целью на AliExpress зачем-то появляется запрос на MIDI). Можно предусмотреть и настройки, меняющиеся рандомно, такие как случайные значения User-Agent из большого списка или произвольный прокси для конкретного сайта (об этом позднее).
Копирование и вставка
Казалось бы, что может быть самой основной фунцией в программах, которые отображают текст? Работа с выделением/копированием/вставкой текста конечно же!
Увы, но даже с простым выделением уже начинаются проблемы. Вы пробовали выделить ссылку? В браузере, в почте, в IM? И как оно? Где-то ссылка начинает перетаскиваться, где-то осуществляется переход по ней, даже если вы не отпускали кнопку, а где-то надо целиться в миллиметровый зазор, чтобы иметь возможность выделить ее. Выделение картинок — отдельная лотерея, порой этого вообще нельзя сделать, кроме как нажав секретную хакерскую комбинацию CTRL+A. Шаг вправо-влево — и у нас выделена вся страница, а не тот абзац, в который мы целились.
Или текст может не выделяться вообще, создавая иллюзию сломанной кнопки мышки. Если даже мы прицелились и смогли выделить текст, то не факт, что при нажатии правой кнопки мыши у нас не появится крутое предупреждение вида «Текст этой страницы круто защищен». Или вообще ничего не появится, благо браузеры научились отламывать такие скрипты автоматически. Или не вылезет просьба отправить отчет о найденной на странице опечатке. Я во время чтения текста часто его выделяю мышкой для удобства восприятия, а подобная гадость неимоверно бесит.
Со вставкой еще хуже. Будет ли сохранено форматирование или нет? Иногда это зависит от того, используете ли вы хоткей, или пользуетесь «колесиком» — разное поведение, для вроде бы одного действия. Будут ли пробелы в том, что вставляется в сторонние приложения, если между блоками не было пробелов? А иногда от форматирования не избавишься: вставляешь скопированный текст в пределах страницы, к примеру, в пределах набираемого письма, а набираемый абзац вдруг становится жирным и/или превращается в цитату.
Последний писк моды: подменять содержимое буфера обмена. Вы скопировали текст про котиков, неглядя вставили его в чат и… Огребли бан, так как вместе с желаемым текстом вставилась еще и реклама ресурса, откуда было копирование. Конечно, надо быть внимательным и осторожным, смотреть что и куда отправляешь… Но с другой стороны, почему мои инструменты для просмотра текста позволяют себе так себя вести?
Распределенное хранилище
Локальное кеширование контента, о котором мы говорили ранее — это только часть потребностей пользователя современного веба. Вторая важная часть проблемы — кеширование контента на сервере, по пути к клиенту на разных CDN и тому подобном. Фактически, небольшие сайты могут столкнуться с тем, что нужно слишком много трафика чтобы доставить, по сути, практически статические файлы. Всё снова и снова. И у них практически нет никакого выхода, кроме как кормить зажравшуюся CloudFlare, чтобы она предоставляла свой распределенный кеш.
У самой же CloudFlare есть интересная технология RailGun: www.cloudflare.com/website-optimization/railgun — это крутой костыль, который позволяет кешировать не кешируемое, при помощи которого они не просто кешируют старые версии страниц, а еще делают diff-ы с ними и отсылают уже пересобранную разницу со своих серверов. Таким образом получается, что можно обновлять страничку всего 1 пакетом данных в 400 байт (число взято из описания), а оригинальный сервер может хоститься хоть на телефоне (на самом деле это не так). Но за такую штуку надо платить, от $200 в месяц, что очень существенные деньги для небольших сайтов.
Эх, а если бы можно было разделить контент на небольшие управляемые элементы… Но да, об этом позже. Пока есть костыли вроде diff и cloudflare с его Railgun.
А вот разделенная файловая система IPFS уже существует. А еще существует ZeroNet, который уже прямо сейчас, из коробки, позволяет хостить вебсайты распределенно. Можно попробовать скачать клиент и заглянуть в эту необычную сеть, которой не нужны сервера!
Впрочем, ничего нового тут нет. Лет 15 назад у популярных вебсайтов был свой десктопный клиент (и порой не один) и что-то вроде торрент-раздач в комплекте к нему. Да и сегодня это существует в том или ином виде, например, приложение WikiTaxi, которое позволяет держать Википедию в своем кармане. А еще я вспоминаю о такой штуке как AportExpress, внутри которой был полноценный шаблонизатор и родные шаблоны Апорта с сервера, собиравший странички на клиенте.
Улучшенная работа с сетью
Вы можете себе представить, что иногда люди выходят в сеть через разные GSM-модемы, где и без того невысокая скорость дорезается плохими условиями приема сигнала / плохими условиями договора? И существуют сайты вроде imgur.com/a/XJmb7, где лежат ну очень красивые вещи, но и вес самой странички, включая всю графику, превышает десятки мегабайт. Вот только проблема — такие странички невозможно посмотреть при таком соединении.
Сегодня браузер пытается грузить все картинки одновременно, замедляя загрузку каждой из них (для этого еще делают кучу суб-доменов, чтобы обойти лимиты на количество соединений). Через какое-то время наступает таймаут и сервер просто закрывает соединение, оставляя нас с битыми картинками, которые хорошо если вообще как-то откроются. Если нажать F5, то на мгновение произойдет отрисовка (отмена загрузки и отображение того, что успело прогрузится), а потом загрузка пойдет с самого начала, без докачки индивидуальных изображений. А еще вы ведь часто замечали, что браузер «загружает» страничку или файл сначала со скоростью в 50кб/сек, потом в 20кб/сек, а потом 3кб/сек? Это значит, что реальная скорость загрузки по какой-то причине стала равна 0 байт/сек, а оборвать соединение и начать заново черевато большими сложностями, даже если технически докачать файл возможно.
А ведь вебсервер может генерировать torrent-файлы для статики и раздавать их в автоматическом режиме, что позволит как докачивать файлы, так и снимать нагрузку с сетевого канала! По своей сути, torrent-файл есть всего лишь список контрольных сумм, которые позволяют скачивать файл с произвольного места и проверять корректность скачанного. Таким образом даже недокачанные картинки можно будет легко выкачать, пусть с 5-й попытки, точно решить вопрос с версионностью и валидациями кеша.
И раз уж мы выдаем клиенту метаданные о файлах, то можно оформлять всю страницу как «одну большую раздачу» в виде одного пакета с данными, внутри которого будет указана как информация о странице, так и о файлах-картинках, стилях, связанных страницах и прочих референсах (в том числе на другие «раздачи»), эдакий маленький бинарный sitemap. Это позволит лучше кешировать/прекешировать сайты, быстрее загружать все ресурсы, не дожидаясь полной прогрузки страницы или скриптов и даже оптимизировать сайты для людей с ограниченными возможностями, предлагая им расширенную навигацию по страницам. Или не загружать какие-то элементы сразу, к примеру, Эппловые иконки на половину экрана или множество видео.
К сожалению, современные разработчики пытаются бороться с этими проблемами по-своему, не предоставляя настроек и реализуя все это собственными руками, т.е. «как получится». К примеру, подгрузка картинок/видео через кучу JS, множество доменов и обработку скроллинга страницы, из-за чего быстро промотать страницу до «десятой страницы» уже нельзя, что меня очень сильно бесит. К счастью, некоторые крупные вендоры, такие как Сяоми начали с этим бороться, спрашивая каждый раз «Вы хотите воспроизвести видео? За это может сниматься дополнительная плата!», но пока нельзя настроить автоматический запрет на подобные безобразия, да и способов обхода со стороны разработчика все еще много.
Если уж мы затронули бесконечные сайты с бесконечной прокруткой, то хотелось бы заметить: ничто не мешает показывать пользователю пустой остов всей гигантской ленты, чтобы он мог спокойно ориентироваться в ней, а сам контент подгружать динамически. Но этого никто не делает.
Скачивание сайтов
Допустим, я нашел сайт с мануалами по выращиванию клубники. Восхитился, загорелся идеей, поехал на дачу и… И столкнувшись с проблемами понял, что надо было каждую страничку сконвертить в PDF, а только потом ехать на дачу. Почему в PDF? Да потому, что современные странички даже поштучно не хотят сохраняться корректно, а что будет отображено при открытии локального HTML и куда оно напихает Cookie остается только гадать.
А ведь в былые времена я мог взять Teleport Pro и выкачать весь сайт с клубникой, залить это себе на телефон и спокойно поехать на дачу! Все картинки будут выкачаны, все ссылки будут перелинкованы, практически все будет работать. Были даже сайты с уже выкачанными сайтами — незаменимая штука для обучения в те годы, равно как и поисковые системы на JS, работающие прямо в браузере!
Но что будет сегодня, если я попытаюсь сделать так? Меня ждет открытие, что в современных сайтах странички динамические, у каждой страницы есть тысяча URL-ов и я легко выкачаю три странички 10000 раз, тщательно их перелинкую, а при просмотре до нужной странички так и не дойду, даже если она будет скачана (по пути из 50 ссылок, который я должен буду пройти точно так же, как это сделала качалка).
А если очень хочется? В таком случае мы сегодня берем и пишем парсер сайта, выковыриваем контент (регулярками или xpath), как-то это перелинковываем при помощи самодельных скриптов, приделываем индекс из говна и палок, может быть даже простейший поисковик. Все это занимает от 1 дня, до тех пор, пока не надоест. Можно просто накопипастить текст в Word и материться от того, что все вставляется красным Импактом и разметка едет до такой степени, что на это невозможно смотреть. Можно включить записывалку видео и листать странички — менее затратный вариант по времени, хоть и весить такая запись будет много, но в наши времена это мало кого волнует.
В этом месте я должен был бы написать, что в идеальном браузере мне нужна функция выкачивания сайтов, чтобы потом я мог легко перенести контент на телефон или любое другое *автономное* устройство. Но с учетом вышенаписанного, увы, это невозможно. А вот если бы наш контент был разделен на маленькие управляемые элементы… Но увы. Поэтому современный браузер, в довесок ко всему сказанному выше, должен уметь не только парсить эти самые элементы, но и хранить их в локальной базе, версионировать и быть своего рода маленькой CMS.
И не надо думать, что современные сайты в принципе невозможно выкачать. Наоборот, в моду снова входит статика, есть даже интересные и популярные проекты вроде github.com/jekyll/jekyll для генерации статики. Так почему бы не раздавать «исходники» сайта?
Дисклеймер: Teleport Pro тут используется лишь как наиболее известная софтина для выкачивания сайтов, это ни разу не реклама или ностальгия, лично я его недолюбливал из-за кучи временных файлов и неумение корректно парсить javascript. Моим выбором были другие качалки, не так широко известные, вроде webzip, которые хоть и требовали кучу ресурсов, вставляли рекламу в странички, но выкачивали контент корректно и полностью.
to be continued…
Автор: qyk