Вчера вышла новая версия Node.JS 12.11.0.
V8 был обновлён до версии 7.7. С новой версией движка в Node.JS улучшилось управление памятью, была ускорена сериализация стектрейсов, в
В модуле
В модуле
В модуле
Модуль
C этой версии начался процесс добавления в Node.JS поддержки source maps. На данном этапе был добавлен сбор и кеширование source maps в директорию с покрытием при установке переменной окружения
#release #node
https://github.com/nodejs/node/releases/tag/v12.11.0
V8 был обновлён до версии 7.7. С новой версией движка в Node.JS улучшилось управление памятью, была ускорена сериализация стектрейсов, в
Intl.NumberFormat появилась поддержка единиц измерения, научной и инженерной нотации.В модуле
crypto была добавлена поддержка опции oaepLabel для шифрования RSA-OAEP. Эта опция может использоваться для идентификации сторон, участвующих в обмене информацией.В модуле
events была добавлена поддержка EventTarget в once для лучшей совместимостью с web-платформой.В модуле
fs при работе с файлами можно использовать флаг UV_FS_O_FILEMAP (работает только для Windows). С помощью него файл может быть смаплен в виртуальную память системы. В этом случае изменение и чтение файла будет проксироваться через память (полезно при работе с очень большими файлами).Модуль
worker_threads стал стабилен. Каких-либо изменений в API больше не ожидается. Также был обновлён API inspector для улучшения отладки воркеров.C этой версии начался процесс добавления в Node.JS поддержки source maps. На данном этапе был добавлен сбор и кеширование source maps в директорию с покрытием при установке переменной окружения
env.NODE_V8_COVERAGE.#release #node
https://github.com/nodejs/node/releases/tag/v12.11.0
GitHub
Release 2019-09-25, Version 12.11.0 (Current), @BridgeAR · nodejs/node
Notable changes
crypto:
Add oaepLabel option #29489
deps:
Update V8 to 7.7.299.11 #28918
More efficient memory handling
Stack trace serialization got faster
The Intl.NumberFormat API gained n...
crypto:
Add oaepLabel option #29489
deps:
Update V8 to 7.7.299.11 #28918
More efficient memory handling
Stack trace serialization got faster
The Intl.NumberFormat API gained n...
Сегодня будет ещё один релизный пост. Пару часов назад в блоге V8 появился анонс фич, которые попадут в версию 7.8.
Script streaming — загрузка скриптов из сети в парсер без ожидания главного потока Chrome — теперь будет работать для preload-скриптов (в Chrome 76 и выше). Эта фича позволит сократить время инициализации страницы.
При компиляции JavaScript в байткод движок собирает специальные таблицы, которые матчат байткод на конкретные позиции в исходном коде. Эти таблицы потребляют память. С версии 7.8 они будут генерироваться, только во время создания стектрейсов. Разработчики пошли на компромисс, так как эта операция требует повторного парсинга и перекомпиляции. В результате потребление памяти было уменьшено на 1-2.5%.
Ускорили деструктуризацию объектов и работу регулярных выражений в случае, когда искомый паттерн не может быть найден в строке.
Поддержка Wasm С/C++ API перешла из экспериментального статуса в официальный. Это API позволяет использовать V8 как движок для исполнения WebAssembly в C/C++-приложениях. Был ускорен старт wasm-модулей.
#release #v8
https://v8.dev/blog/v8-release-78
Script streaming — загрузка скриптов из сети в парсер без ожидания главного потока Chrome — теперь будет работать для preload-скриптов (в Chrome 76 и выше). Эта фича позволит сократить время инициализации страницы.
При компиляции JavaScript в байткод движок собирает специальные таблицы, которые матчат байткод на конкретные позиции в исходном коде. Эти таблицы потребляют память. С версии 7.8 они будут генерироваться, только во время создания стектрейсов. Разработчики пошли на компромисс, так как эта операция требует повторного парсинга и перекомпиляции. В результате потребление памяти было уменьшено на 1-2.5%.
Ускорили деструктуризацию объектов и работу регулярных выражений в случае, когда искомый паттерн не может быть найден в строке.
Поддержка Wasm С/C++ API перешла из экспериментального статуса в официальный. Это API позволяет использовать V8 как движок для исполнения WebAssembly в C/C++-приложениях. Был ускорен старт wasm-модулей.
#release #v8
https://v8.dev/blog/v8-release-78
v8.dev
V8 release v7.8 · V8
V8 v7.8 features streaming compilation on preload, WebAssembly C API, faster object destructuring and RegExp matching, and improved startup times.
Элад Шехтер в статье "Complete Guide to Responsive Images!" рассказал про все подходы, которые можно использовать при создании адаптивных изображений.
В статье разбирается использование тега
Мне статья показалась чересчур справочной — не хватило живых практических примеров. Тем не менее она может послужить отличной стартовой точкой для изучения темы адаптивных изображений.
На Девшахте есть хороший перевод статьи.
#web #image #responsive
https://medium.com/@elad/a-complete-guide-for-responsive-images-b13db359c6c7
В статье разбирается использование тега
<picture> и тега <img> c атрибутами srcset и sizes для разных изображений в зависимости от плотности пикселей и ширины вьюпорта. Разбирается использование CSS-свойства image-set и CSS-функции image(). С помощью функции image() (её поддержки пока нет в браузерах) можно будет обрезать изображение и использовать в background-image изображение того типа, которое может быть отображено браузером.Мне статья показалась чересчур справочной — не хватило живых практических примеров. Тем не менее она может послужить отличной стартовой точкой для изучения темы адаптивных изображений.
На Девшахте есть хороший перевод статьи.
#web #image #responsive
https://medium.com/@elad/a-complete-guide-for-responsive-images-b13db359c6c7
Medium
Complete Guide to Responsive Images!
Using responsive images this days, is a very complex mission. There are saw many ways to implement it.
Прошло уже больше полугода с момента создания Defront. Меня иногда спрашивают о том, как появился канал и как создаются посты. Хочу про это написать небольшой пост.
Если кто-нибудь мне сказал раньше, что я буду вести канал, я бы не поверил. Но сейчас в канале уже около 250 постов, и, определённо, будет ещё больше. Как так получилось? В 2017-2018 году я выпал из информационного поля и читал только то, что было нужно по работе. В начале этого года после прочтения небольшой статьи в голове что-то "щёлкнуло" — я решил поделиться прочитанным со своими коллегами в виде небольшого пересказа. Мне этот формат показался очень интересным. В итоге я поставил себе цель читать что-то новое и делиться прочитанным каждый день.
Обычно на подготовку одного поста уходит два часа, иногда больше, иногда меньше. Всё зависит от темы. Иногда тема понятна, и пост даётся легко. Иногда тема сложная, и для написания поста необходимо читать дополнительные статьи и код.
Один из основных источников информации — это twitter. Я там сижу под ником @myshov, кстати рекомендую зафолловить, так как ретвичу и твичу полезности, которые не попадают в канал. Все потенциально интересные ссылки сохраняю в заметках и потом просматриваю, удаляя не очень информативные. Потом выбираю наиболее интересную статью, читаю, погружаюсь в тему и публикую про неё пост.
Вот такой вот флоу.
Очень рад, что в итоге мой контент нашёл своего читателя. Спасибо за то, что читаете Defront.
P.S. Подключил к каналу чат для обсуждения материалов — @defrontchat. Welcome!
Если кто-нибудь мне сказал раньше, что я буду вести канал, я бы не поверил. Но сейчас в канале уже около 250 постов, и, определённо, будет ещё больше. Как так получилось? В 2017-2018 году я выпал из информационного поля и читал только то, что было нужно по работе. В начале этого года после прочтения небольшой статьи в голове что-то "щёлкнуло" — я решил поделиться прочитанным со своими коллегами в виде небольшого пересказа. Мне этот формат показался очень интересным. В итоге я поставил себе цель читать что-то новое и делиться прочитанным каждый день.
Обычно на подготовку одного поста уходит два часа, иногда больше, иногда меньше. Всё зависит от темы. Иногда тема понятна, и пост даётся легко. Иногда тема сложная, и для написания поста необходимо читать дополнительные статьи и код.
Один из основных источников информации — это twitter. Я там сижу под ником @myshov, кстати рекомендую зафолловить, так как ретвичу и твичу полезности, которые не попадают в канал. Все потенциально интересные ссылки сохраняю в заметках и потом просматриваю, удаляя не очень информативные. Потом выбираю наиболее интересную статью, читаю, погружаюсь в тему и публикую про неё пост.
Вот такой вот флоу.
Очень рад, что в итоге мой контент нашёл своего читателя. Спасибо за то, что читаете Defront.
P.S. Подключил к каналу чат для обсуждения материалов — @defrontchat. Welcome!
Twitter
Alexander Myshov (@myshov) | Twitter
The latest Tweets from Alexander Myshov (@myshov). Software engineer from Siberia (ex-Yandex) excited by music, science, yoga and other stuff. Author of project "History of JavaScript" (https://t.co/8jlI4GJao6). Russia
Посмотрел доклад 2018 года Расса Олсена про функциональное программирование — "Functional Programming in 40 Minutes".
В отличие от статей про ФП, в которых говорится забыть все концепции программирования, Расс говорит о том, что не надо их выкидывать — их надо взять и немного порефакторить. Он на примере показывает как существующие концепции, которые известны всем программистам живут в ФП. Рассказывает про "три столпа" функционального программирования — чистые функции, иммутабельность и работу с сайд эффектами. Работа с сайд эффектами разбирается на примере Clojure — Атомы/Агенты/Акторы.
Название доклада немного кликбейтное, но содержание хорошее. Доклад будет полезен тем, кто только начинает разбираться с ФП. Рекомендую посмотреть, если интересуетесь этой темой.
#talk #fp #clojure
https://www.youtube.com/watch?v=0if71HOyVjY
В отличие от статей про ФП, в которых говорится забыть все концепции программирования, Расс говорит о том, что не надо их выкидывать — их надо взять и немного порефакторить. Он на примере показывает как существующие концепции, которые известны всем программистам живут в ФП. Рассказывает про "три столпа" функционального программирования — чистые функции, иммутабельность и работу с сайд эффектами. Работа с сайд эффектами разбирается на примере Clojure — Атомы/Агенты/Акторы.
Название доклада немного кликбейтное, но содержание хорошее. Доклад будет полезен тем, кто только начинает разбираться с ФП. Рекомендую посмотреть, если интересуетесь этой темой.
#talk #fp #clojure
https://www.youtube.com/watch?v=0if71HOyVjY
YouTube
Functional Programming in 40 Minutes • Russ Olsen • GOTO 2018
This presentation was recorded at GOTO Berlin 2018. #gotocon #gotober
http://gotober.com
Russ Olsen - Author of Getting Clojure and Eloquent Ruby, VP at Cognitect @russolsen3122
ABSTRACT
Functional programming has finally escaped from academia. These days…
http://gotober.com
Russ Olsen - Author of Getting Clojure and Eloquent Ruby, VP at Cognitect @russolsen3122
ABSTRACT
Functional programming has finally escaped from academia. These days…
Джейсон Григсби — автор книги Progressive Web Apps (A List Apart) — попробовал заказать еду на сайте, но с первой попытки у него это не получилось. Он разобрался в причинах и написал про результаты своего небольшого исследования статью "An HTML attribute potentially worth $4.4M to Chipotle".
На сайте было сломано автодополнение данных кредитных карт. Данные карты были сохранены в браузер правильно, но при их вводе в форму с помощью автодополнения что-то шло не так. Причина оказалась в Angular-модуле ui-mask, он неправильно отсекал год истечения срока действия карты. Автор попробовал использовать вместо кастомной маски стандартные HTML5 средства валидации формы
Проводились исследования, которые показывают, что автодополнение ускоряет заполнение форм на 30%. Скорость заполнения форм в свою очередь влияет на конверсию в заказ. Джейсон провёл грубые расчёты, которые показали, что сайт Chipotle теряет более 4 миллионов долларов в год из-за проблем с автодополнением.
Рекомендации из статьи: если у вас e-commerce сайт, убедитесь, что автодополнение данных кредитных карт работает, добавьте кейс проверки автодополнения в тест-план, используйте корректные поля ввода в формах.
#ux #forms
https://cloudfour.com/thinks/an-html-attribute-potentially-worth-4-4m-to-chipotle/
На сайте было сломано автодополнение данных кредитных карт. Данные карты были сохранены в браузер правильно, но при их вводе в форму с помощью автодополнения что-то шло не так. Причина оказалась в Angular-модуле ui-mask, он неправильно отсекал год истечения срока действия карты. Автор попробовал использовать вместо кастомной маски стандартные HTML5 средства валидации формы
pattern="\d\d" и maxlength="2". Проблема с автодополнением года была решена.Проводились исследования, которые показывают, что автодополнение ускоряет заполнение форм на 30%. Скорость заполнения форм в свою очередь влияет на конверсию в заказ. Джейсон провёл грубые расчёты, которые показали, что сайт Chipotle теряет более 4 миллионов долларов в год из-за проблем с автодополнением.
Рекомендации из статьи: если у вас e-commerce сайт, убедитесь, что автодополнение данных кредитных карт работает, добавьте кейс проверки автодополнения в тест-план, используйте корректные поля ввода в формах.
#ux #forms
https://cloudfour.com/thinks/an-html-attribute-potentially-worth-4-4m-to-chipotle/
Cloud Four
An HTML attribute potentially worth $4.4M to Chipotle
I recently found myself racing to fill out Chipotle’s online order form before my mother could find her credit card. In the process, I discovered a bug that could cost Chipotle $4.4 million annually. My parents are retired. They continue to try to pay for…
Forwarded from Вебня (Ҫѐҏӗѫӑ Ҹҋ 🤖)
🎂 Сегодня исполняется 25 лет Консорциуму Всемирной Паутины (W3C)!
https://www.w3.org/blog/2019/10/happy-25th-anniversary-world-wide-web-consortium/
https://www.w3.org/blog/2019/10/happy-25th-anniversary-world-wide-web-consortium/
www.w3.org
Happy 25th anniversary, World Wide Web Consortium!
Today we celebrate the 25th anniversary of the World Wide Web Consortium. Sir Tim Berners-Lee, our Director and the inventor of the World Wide Web, founded the Web Consortium on this day, 1 October 1994 to ensure the long-term growth of the Web.
Несколько дней назад Cloudflare анонсировал экспериментальную поддержку HTTP/3 на своих серверах — "HTTP/3: the past, the present, and the future".
Чтобы ответить на вопрос, какую проблему решает новая версия протокола, надо для начала разобраться с HTTP/2. Основная польза от HTTP/2 — мультиплексирование запросов в рамках одного TCP-соединения. То есть если запрашивать классическую web-страницу по HTTP/2, то js/css-файлы, изображения и другие ресурсы будут передаваться параллельно друг другу, не создавая соединение на каждый запрос.
Загвоздка заключается в том, что HTTP/2 работает поверх TCP. Для TCP нет разницы, передаются ли по нему данные с помощью HTTP/1.1 или HTTP/2. Если во время параллельной передачи данных с помощью HTTP/2, какие-то байты, например из изображения, будут потеряны, возникнет пустой промежуток в потоке, который должен быть восстановлен. TCP работает так, что все успешно доставленные байты после обнаружения потери (даже если они не относились к изображению) не могут быть доставлены в приложение. То есть они будут ждать, пока данные будут восстановлены. Эта проблема известна под названием “head-of-line blocking”. HTTP/3 решает эту проблему, используя новый транспортный протокол QUIC. Также QUIC уменьшает количество запросов, необходимых для установки соединения.
На данный момент поддержка HTTP/3 есть в Google Chrome Canary за флагом и в экспериментальной версии curl. Разработчики Firefox обещают поддержку в ближайшем будущем. Есть реализация HTTP/3 клиента и сервера от cloudflare — quiche.
Теперь остаётся только ждать, когда стабилизируется стандарт, чтобы началось его массовое внедрение. Для меня самая крутая фича из нового протокола, которую планируют добавить в будущем, "connection migration" — бесшовная и прозрачная миграция между сетями. Благодаря ему можно будет забыть про паузы во время трансляции видео при переключении с Wi-Fi на LTE, а носимые девайсы станут по-настоящему always connected.
#http #performance #announcement
https://blog.cloudflare.com/http3-the-past-present-and-future/
Чтобы ответить на вопрос, какую проблему решает новая версия протокола, надо для начала разобраться с HTTP/2. Основная польза от HTTP/2 — мультиплексирование запросов в рамках одного TCP-соединения. То есть если запрашивать классическую web-страницу по HTTP/2, то js/css-файлы, изображения и другие ресурсы будут передаваться параллельно друг другу, не создавая соединение на каждый запрос.
Загвоздка заключается в том, что HTTP/2 работает поверх TCP. Для TCP нет разницы, передаются ли по нему данные с помощью HTTP/1.1 или HTTP/2. Если во время параллельной передачи данных с помощью HTTP/2, какие-то байты, например из изображения, будут потеряны, возникнет пустой промежуток в потоке, который должен быть восстановлен. TCP работает так, что все успешно доставленные байты после обнаружения потери (даже если они не относились к изображению) не могут быть доставлены в приложение. То есть они будут ждать, пока данные будут восстановлены. Эта проблема известна под названием “head-of-line blocking”. HTTP/3 решает эту проблему, используя новый транспортный протокол QUIC. Также QUIC уменьшает количество запросов, необходимых для установки соединения.
На данный момент поддержка HTTP/3 есть в Google Chrome Canary за флагом и в экспериментальной версии curl. Разработчики Firefox обещают поддержку в ближайшем будущем. Есть реализация HTTP/3 клиента и сервера от cloudflare — quiche.
Теперь остаётся только ждать, когда стабилизируется стандарт, чтобы началось его массовое внедрение. Для меня самая крутая фича из нового протокола, которую планируют добавить в будущем, "connection migration" — бесшовная и прозрачная миграция между сетями. Благодаря ему можно будет забыть про паузы во время трансляции видео при переключении с Wi-Fi на LTE, а носимые девайсы станут по-настоящему always connected.
#http #performance #announcement
https://blog.cloudflare.com/http3-the-past-present-and-future/
The Cloudflare Blog
HTTP/3: the past, the present, and the future
We are now happy to announce that QUIC and HTTP/3 support is available on the Cloudflare edge network. We’re excited to be joined in this announcement by Google Chrome and Mozilla Firefox, two of the leading browser vendors and partners in our effort to make…
Пару дней назад Рик Вискоми в блоге
С версии Chrome 77 появилась возможность измерять смещение отображаемого контента во время его загрузки с помощью нового Layout Instability API. Это не критичная, но важная для UX метрика, с помощью которой можно измерить "приятность" загрузки данных.
В статье на примере тестового сайта рассматривается, как собрать эту метрику с помощью WebPageTest, и что можно сделать, чтобы контент не прыгал. Например, при загрузке веб-шрифтов стоит использовать
В статье про это не написано, но хочу добавить, что для предварительной оценки масштаба проблемы со смещением контента необязательно собирать метрику. Достаточно загрузить страницу с троттлингом соединения.
#ux #performance
https://web.dev/fixing-layout-instability
web.dev написал пост про то, как измерять и исправлять нестабильность раскладки элементов на странице — "Fixing layout instability".С версии Chrome 77 появилась возможность измерять смещение отображаемого контента во время его загрузки с помощью нового Layout Instability API. Это не критичная, но важная для UX метрика, с помощью которой можно измерить "приятность" загрузки данных.
В статье на примере тестового сайта рассматривается, как собрать эту метрику с помощью WebPageTest, и что можно сделать, чтобы контент не прыгал. Например, при загрузке веб-шрифтов стоит использовать
font-display: swap, чтобы до загрузки кастомного шрифта отображался шрифт, использующийся в системе. Также можно использовать плейсхолдеры, если известно, какой тип контента будет загружен.В статье про это не написано, но хочу добавить, что для предварительной оценки масштаба проблемы со смещением контента необязательно собирать метрику. Достаточно загрузить страницу с троттлингом соединения.
#ux #performance
https://web.dev/fixing-layout-instability
web.dev
Fixing layout instability | Articles | web.dev
A walkthrough of using WebPageTest to identify and fix layout instability issues.
Прочитал статью про атаку, про которую как-то не приходилось слышать раньше — "Slow Loris attack using JavaScript on a PHP Server".
Атака названа в честь медленных (толстых) лори — зверьков, которые ведут неторопливый ночной образ жизни. Особенность атаки заключается в том, что инициатор может открыть очень большое количество tcp-соединений, отправляя запросы на сервер с промежутком в несколько секунд. Огромное количество соединений из-за программных ограничений приводит к крешу сервера.
Современные web-серверы из коробки идут с защитой от этой атаки, но она актуальна для кастомных серверов. Один из вариатов защиты от атаки, описанный в статье, использование reverse-proxy на nginx, с ограничением числа одновременных соединений от одного ip-адреса.
#security #http #tcp
https://www.freecodecamp.org/news/slow-loris-attack-using-javanoscript-on-php-server/
Атака названа в честь медленных (толстых) лори — зверьков, которые ведут неторопливый ночной образ жизни. Особенность атаки заключается в том, что инициатор может открыть очень большое количество tcp-соединений, отправляя запросы на сервер с промежутком в несколько секунд. Огромное количество соединений из-за программных ограничений приводит к крешу сервера.
Современные web-серверы из коробки идут с защитой от этой атаки, но она актуальна для кастомных серверов. Один из вариатов защиты от атаки, описанный в статье, использование reverse-proxy на nginx, с ограничением числа одновременных соединений от одного ip-адреса.
#security #http #tcp
https://www.freecodecamp.org/news/slow-loris-attack-using-javanoscript-on-php-server/
freeCodeCamp.org
Slow Loris attack using JavaScript on a PHP Server [and its prevention!]
Forget the post for a minute, let's begin with what this noscript is about! This is a web security-based article which will get into the basics about how HTTP works. We'll also look at a simple attack which exploits the way the HTTP protocol works. What is HTTP?…
Недавно в блоге Gitlab появилась небольшая статья о том, почему было принято решение о переходе на ECharts для построения графиков — "Why we chose ECharts for data visualizations".
В Gitlab есть раздел с мониторингами приложения. Ранее для построения графиков в этом разделе использовался D3. От него решили отказаться, так как D3 был сложен в изучении и в конечном счёте не использовался на полную. От него лишь требовалась возможность отображения данных в виде графиков, поэтому ребята решили перейти на более специализированное решение. Выбирали между многими библиотеками, включая ECharts, Britecharts и Plotly. В итоге остановились на ECharts, потому что библиотека оказалась гибкой и достаточно производительной.
ECharts стартовал как open source проект Baidu, поэтому документация в основном написана на китайском языке. Не смотря на эту особенность экосистема вокруг проекта развивается, и проект используют не только в Китае, но и в других странах.
#experience #charts
https://about.gitlab.com/2019/09/30/why-we-chose-echarts/
В Gitlab есть раздел с мониторингами приложения. Ранее для построения графиков в этом разделе использовался D3. От него решили отказаться, так как D3 был сложен в изучении и в конечном счёте не использовался на полную. От него лишь требовалась возможность отображения данных в виде графиков, поэтому ребята решили перейти на более специализированное решение. Выбирали между многими библиотеками, включая ECharts, Britecharts и Plotly. В итоге остановились на ECharts, потому что библиотека оказалась гибкой и достаточно производительной.
ECharts стартовал как open source проект Baidu, поэтому документация в основном написана на китайском языке. Не смотря на эту особенность экосистема вокруг проекта развивается, и проект используют не только в Китае, но и в других странах.
#experience #charts
https://about.gitlab.com/2019/09/30/why-we-chose-echarts/
GitLab
Why we chose ECharts for data visualizations
Learn why GitLab switched from D3.js to ECharts as our library of choice for rendering data visualizations.
Алексис Бинжесснер — инженер из команды Firefox — опубликовала пост про особенности рендеринга теста — "Text Rendering Hates You".
Процесс рендеринга текста непростая вещь: надо учитывать разные сценарии отрисовки шрифтов на разных системах, отключать стилизацию для эмоджи, правильно применять стили к лигатурам, делать фоллбек на системный шрифт, если запрашиваемых глифов нет в используемом шрифте и т.п. Чтобы текст выглядет хорошо (не на retina-дисплеях), надо использовать алгоритмы сглаживания (антиалиасинг), но не забывать его отключать в определённых ситуациях. Например, при субпиксельном сглаживании браузеры отслеживают анимацию текста и отключают антиалиасинг, иначе при движении глифы будут трястись.
Статья довольно интересная с кучей технических деталей. Её стоит почитать, чтобы по-настоящему оценить, какую большую работу надо проделать для хорошего рендеринга текста.
#internals #rendering
https://gankra.github.io/blah/text-hates-you/#emoji-broke-color-and-style
Процесс рендеринга текста непростая вещь: надо учитывать разные сценарии отрисовки шрифтов на разных системах, отключать стилизацию для эмоджи, правильно применять стили к лигатурам, делать фоллбек на системный шрифт, если запрашиваемых глифов нет в используемом шрифте и т.п. Чтобы текст выглядет хорошо (не на retina-дисплеях), надо использовать алгоритмы сглаживания (антиалиасинг), но не забывать его отключать в определённых ситуациях. Например, при субпиксельном сглаживании браузеры отслеживают анимацию текста и отключают антиалиасинг, иначе при движении глифы будут трястись.
Статья довольно интересная с кучей технических деталей. Её стоит почитать, чтобы по-настоящему оценить, какую большую работу надо проделать для хорошего рендеринга текста.
#internals #rendering
https://gankra.github.io/blah/text-hates-you/#emoji-broke-color-and-style
Начиная с версии 7.9 в V8 изменяется работа с регулярными выражениями. Патрик Тиер и Ана Пешко написали пост с объяснением всех деталей — "Improving V8 regular expressions".
По умолчанию V8 компилирует регулярные выражения в нативный код при их первом запуске. Это влечёт за собой нагрузку на память. Около полугода назад как часть работы над "JIT-less V8" был добавлен интерпретатор для регулярных выражений. С версии 7.9 по умолчанию регулярные выражения будут исполняться с его помощью. Компиляция будет происходить только после того как одно и то же регулярное выражение будет выполняться несколько раз (hot-path). Новая стратегия позволяет уменьшить потребление оперативной памяти на 4-7%. Интерпретатор регулярных выражений был оптимизирован, теперь он в 2 раза быстрее. Это позволило не сильно просадить метрики по скорости относительно скомпилированных регулярок.
В статье много технических деталей того, как это всё работает. Читать сложно, но интересно.
#v8 #regexp #performance
https://v8.dev/blog/regexp-tier-up
По умолчанию V8 компилирует регулярные выражения в нативный код при их первом запуске. Это влечёт за собой нагрузку на память. Около полугода назад как часть работы над "JIT-less V8" был добавлен интерпретатор для регулярных выражений. С версии 7.9 по умолчанию регулярные выражения будут исполняться с его помощью. Компиляция будет происходить только после того как одно и то же регулярное выражение будет выполняться несколько раз (hot-path). Новая стратегия позволяет уменьшить потребление оперативной памяти на 4-7%. Интерпретатор регулярных выражений был оптимизирован, теперь он в 2 раза быстрее. Это позволило не сильно просадить метрики по скорости относительно скомпилированных регулярок.
В статье много технических деталей того, как это всё работает. Читать сложно, но интересно.
#v8 #regexp #performance
https://v8.dev/blog/regexp-tier-up
v8.dev
Improving V8 regular expressions · V8
In this blog post we describe how we take advantage of the upsides of interpreting regular expressions and mitigate the downsides.
В блоге Акселя Раушмайера недавно была опубликована новая статья — "Evaluating JavaScript code via import()".
Код, который использует модульную систему JS, не может быть выполнен с помощью
Выглядит это так:
При желании можно получить доступ ко всем экспортируемым объектам. Также можно вставлять data URI прямо в статический импорт, и он будет работать.
Маловероятно, что вы будете использовать этот трюк. Тем не менее статья интересная, почитать стоит.
#esm #trick
https://2ality.com/2019/10/eval-via-import.html
Код, который использует модульную систему JS, не может быть выполнен с помощью
eval(). Для того чтобы обойти это ограничение, можно использовать динамический импорт import() с закодированным кодом модуля в виде data URI.Выглядит это так:
const js = `console.log('Hello everyone!');`;
const encodedJs = encodeURIComponent(js);
const dataUri = 'data:text/javanoscript;charset=utf-8,'
+ encodedJs;
import(dataUri);При желании можно получить доступ ко всем экспортируемым объектам. Также можно вставлять data URI прямо в статический импорт, и он будет работать.
Маловероятно, что вы будете использовать этот трюк. Тем не менее статья интересная, почитать стоит.
#esm #trick
https://2ality.com/2019/10/eval-via-import.html
CSS является блокирующим ресурсом. Это означает, что браузер должен скачать и распарсить CSS прежде чем показать страницу. Если размер CSS большой, то он может очень сильно влиять на воспринимаемую скорость загрузки сайта. В блоге webdev есть статья с объяснением того, как решить эту проблему — "Extract critical CSS".
Критический CSS — это тот CSS, который необходим для отображения части страницы, которая видна до прокрутки страницы (above-the-fold content). Для того чтобы страница отобразилась как можно раньше, критический CSS инлайнят в тег <head>. Есть несколько библиотек, которые можно для этого использовать — Critical, CriticalCSS и Penthouse. В конце статьи есть ссылка на туториал "Extract and inline critical CSS with Critical", где подробно разбирается работа с Critical.
Если у вас есть сайт, при загрузке которого некоторое время отображается простой белый экран, советую заглянуть в статью. Вполне возможно, что проблема кроется в большом объёме CSS.
#performance #css
https://web.dev/extract-critical-css
Критический CSS — это тот CSS, который необходим для отображения части страницы, которая видна до прокрутки страницы (above-the-fold content). Для того чтобы страница отобразилась как можно раньше, критический CSS инлайнят в тег <head>. Есть несколько библиотек, которые можно для этого использовать — Critical, CriticalCSS и Penthouse. В конце статьи есть ссылка на туториал "Extract and inline critical CSS with Critical", где подробно разбирается работа с Critical.
Если у вас есть сайт, при загрузке которого некоторое время отображается простой белый экран, советую заглянуть в статью. Вполне возможно, что проблема кроется в большом объёме CSS.
#performance #css
https://web.dev/extract-critical-css
web.dev
Extract critical CSS | Articles | web.dev
Learn how to improve render times with critical CSS technique and how to choose the best tool for your project.
Нравится нам это или нет, но порноиндустрия одна из причин, которая послужила развитию веба. Девид Волш расспросил разработчика из PornHub про особенности работы над самым большим сайтом для взрослых — "Interview with a Pornhub Web Developer".
Основной набор технологий на бэкенде — Nginx, PHP, MySQL, Memcached, Redis. Для более специфичных задач используются Varnish, ElasticSearch, NodeJS, Go, Vertica. На фронте используют Vanilla JS, потихоньку избавляясь от jQuery, начинают экспериментировать со Vue. Для измерения производительности клиентского кода используют внешнюю RUM-систему, локально развёрнутые инстансы WebpageTest и кастомную систему, встроенную в видеоплейер. Над видеоплейером работает выделенная команда разработчиков.
Каких-то инсайтов, связанных с производительностью, в статье нет, но её можно почитать просто ради интереса.
#performance #interview
https://davidwalsh.name/pornhub-interview
Основной набор технологий на бэкенде — Nginx, PHP, MySQL, Memcached, Redis. Для более специфичных задач используются Varnish, ElasticSearch, NodeJS, Go, Vertica. На фронте используют Vanilla JS, потихоньку избавляясь от jQuery, начинают экспериментировать со Vue. Для измерения производительности клиентского кода используют внешнюю RUM-систему, локально развёрнутые инстансы WebpageTest и кастомную систему, встроенную в видеоплейер. Над видеоплейером работает выделенная команда разработчиков.
Каких-то инсайтов, связанных с производительностью, в статье нет, но её можно почитать просто ради интереса.
#performance #interview
https://davidwalsh.name/pornhub-interview
DWB
Interview with a Pornhub Web Developer
A chat with the PornHub development team, about working in the adult website industry, technology, virtual reality, and more.
Полина Гуртовая и Рита Клубочкина опубликовали в блоге Злых Марсиан большую статью про использование изображений в вебе — "Images done right: Web graphics, good to the last byte".
В начале статьи рассказывается про то, как CSS-пиксели матчатся на экраны устройств, и почему физический размер пикселей отличается у мониторов и смартфонов. Есть разделы, посвящённые SVG и самым популярным форматам растровых изображений. Для меня самое полезное — сравнение результатов работы разных инструментов для разных форматов. Например, для сжатия PNG лучше всего подходит ImageOptim, а JPEG лучше всего жмут Squoosh и Imagemin. Есть бенчмарки с WebP, которые показывают его эффективность по сравнению с PNG и JPEG. Для анимациий не рекомендуют использовать GIF, вместо него рекомендуется использовать mp4 или webm. В самом начале статьи есть cheat-sheet, который может помочь с выбором наиболее подходящего формата.
Статья очень хорошая. Рекомендую почитать всем без исключения.
#graphic #optimization
https://evilmartians.com/chronicles/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques
В начале статьи рассказывается про то, как CSS-пиксели матчатся на экраны устройств, и почему физический размер пикселей отличается у мониторов и смартфонов. Есть разделы, посвящённые SVG и самым популярным форматам растровых изображений. Для меня самое полезное — сравнение результатов работы разных инструментов для разных форматов. Например, для сжатия PNG лучше всего подходит ImageOptim, а JPEG лучше всего жмут Squoosh и Imagemin. Есть бенчмарки с WebP, которые показывают его эффективность по сравнению с PNG и JPEG. Для анимациий не рекомендуют использовать GIF, вместо него рекомендуется использовать mp4 или webm. В самом начале статьи есть cheat-sheet, который может помочь с выбором наиболее подходящего формата.
Статья очень хорошая. Рекомендую почитать всем без исключения.
#graphic #optimization
https://evilmartians.com/chronicles/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques
evilmartians.com
Images done right: Web graphics, good to the last byte—Martian Chronicles, Evil Martians’ team blog
Start taking graphics on the web seriously and boost your applications' performance by learning the essentials about digital image formats.
Филлип Уолтон недавно опубликовал статью про проблему каскадной инвалидации кэша — «Cascading Cache Invalidation».
Нежелательная инвалидация может возникнуть тогда, когда сборщик генерирует имена файлов с хэшами, которые напрямую импортируются в других файлах. Предположим, что во время сборки из всех файлов, находящихся в node_modules, создаётся файл
Для решения этой проблемы Филлип предлагает использовать import maps (на данный момент поддержка есть только в Chrome за флагом), сервис воркеры или AMD-загрузчик (в статье разбирается пример SystemJS с Rollup.js).
Webpack не подвержен этой проблеме, но с ним есть другие особенности, которые могут приводить к неочевидным ошибкам.
В общем, статья полезная. Рекомендую почитать.
#performance #bundle
https://philipwalton.com/articles/cascading-cache-invalidation/
Нежелательная инвалидация может возникнуть тогда, когда сборщик генерирует имена файлов с хэшами, которые напрямую импортируются в других файлах. Предположим, что во время сборки из всех файлов, находящихся в node_modules, создаётся файл
vendor.<hash>.js. Если этот файл импортируется в других модулях, то из-за постоянно меняющегося хэша, будут изменяться хэши у всех зависимых модулей. Соответственно, браузер будет заново загружать тот код, который фактически не менялся. Для решения этой проблемы Филлип предлагает использовать import maps (на данный момент поддержка есть только в Chrome за флагом), сервис воркеры или AMD-загрузчик (в статье разбирается пример SystemJS с Rollup.js).
Webpack не подвержен этой проблеме, но с ним есть другие особенности, которые могут приводить к неочевидным ошибкам.
В общем, статья полезная. Рекомендую почитать.
#performance #bundle
https://philipwalton.com/articles/cascading-cache-invalidation/
Philipwalton
Cascading Cache Invalidation
Thoughts on web development, open source, software architecture, and the future.
Николас Гаутей опубликовал статью про использование WebPageTest с SPA-приложениями — "Recipes for Performance Testing Single Page Applications in WebPageTest".
При прогоне тестов на производительность у SPA-приложений недостаточно замерять обычную загрузку страницы, так как страница динамически меняет своё состояние в зависимости от пользовательского ввода. Ситуация усугубляется ещё тем, что при использовании React и Redux, нельзя просто менять элементы ввода с помощью
Николас в статье делится советами как обойти эти проблемы. Например, для того чтобы вводимый текст изменял стор приложения, можно программно создавать и отправлять событие ввода на произвольном элементе ввода. React будет воспринимать это событие точно так же, как если бы оно было инициировано действиями пользователя. В статье есть и другие рецепты — выбор элементов, переходы по элементам навигации, адаптация тестов производительности для IE11.
Статья будет полезна, если вы планируете отслеживать регресс клиентской производительности.
#performance #testing
https://css-tricks.com/recipes-for-performance-testing-single-page-applications-in-webpagetest/
При прогоне тестов на производительность у SPA-приложений недостаточно замерять обычную загрузку страницы, так как страница динамически меняет своё состояние в зависимости от пользовательского ввода. Ситуация усугубляется ещё тем, что при использовании React и Redux, нельзя просто менять элементы ввода с помощью
innerText на уровне DOM API, так как при таком изменении текста не будет меняться состояние стора.Николас в статье делится советами как обойти эти проблемы. Например, для того чтобы вводимый текст изменял стор приложения, можно программно создавать и отправлять событие ввода на произвольном элементе ввода. React будет воспринимать это событие точно так же, как если бы оно было инициировано действиями пользователя. В статье есть и другие рецепты — выбор элементов, переходы по элементам навигации, адаптация тестов производительности для IE11.
Статья будет полезна, если вы планируете отслеживать регресс клиентской производительности.
#performance #testing
https://css-tricks.com/recipes-for-performance-testing-single-page-applications-in-webpagetest/
CSS-Tricks
Recipes for Performance Testing Single Page Applications in WebPageTest | CSS-Tricks
WebPageTest is an online tool and an Open Source project to help developers audit the performance of their websites. As a Web Performance Evangelist at
Нашёл в твиттере ссылку на интересную статью Франсуа Шолле — "Notes to Myself on Software Engineering".
Статья представляет собой список "напоминалок" про процесс разработки софта, проектирование API и про карьеру. Хочу выделить из неё пять пунктов:
— Хороший софт делает трудные вещи простыми. Если на первый взгляд проблема кажется сложной, это не означает, что решение тоже должно быть сложным.
— При проектировании сценариев взаимодействия с API следует задать самому себе несколько вопросов. Какие это сценарии? Какая оптимальная последовательность действий для их достижения? Какой наиболее простой программный интерфейс может это реализовать?
— API создаётся для пользователей. Проявляйте эмпатию вне зависимости от того, пользуются ли им профессионалы или новички.
— Продуктивность сводится к высокой скорости принятия решений и к действию.
— Прогресс в карьерном росте выражается не количеством людей, которым вы управляете, а в том, какую ценность вы даёте миру.
В статье очень много хороших мыслей, рекомендую почитать.
#list #softwaredesign #career
https://medium.com/s/story/notes-to-myself-on-software-engineering-c890f16f4e4d
Статья представляет собой список "напоминалок" про процесс разработки софта, проектирование API и про карьеру. Хочу выделить из неё пять пунктов:
— Хороший софт делает трудные вещи простыми. Если на первый взгляд проблема кажется сложной, это не означает, что решение тоже должно быть сложным.
— При проектировании сценариев взаимодействия с API следует задать самому себе несколько вопросов. Какие это сценарии? Какая оптимальная последовательность действий для их достижения? Какой наиболее простой программный интерфейс может это реализовать?
— API создаётся для пользователей. Проявляйте эмпатию вне зависимости от того, пользуются ли им профессионалы или новички.
— Продуктивность сводится к высокой скорости принятия решений и к действию.
— Прогресс в карьерном росте выражается не количеством людей, которым вы управляете, а в том, какую ценность вы даёте миру.
В статье очень много хороших мыслей, рекомендую почитать.
#list #softwaredesign #career
https://medium.com/s/story/notes-to-myself-on-software-engineering-c890f16f4e4d
Medium
Notes to Myself on Software Engineering
A laundry list of personal reminders
Марк Ноттингэм — участвует в разработке протоколов HTTP и QUIC — написал пост про возможности, которые предоставляет HTTP/2 при проектировании классических HTTP API — "How Multiplexing Changes Your HTTP APIs".
HTTP API подвержен проблеме избыточной детализации. Например, при запросе большого количества однотипных сущностей каждый запрос будет отправляться независимо (
Марк пишет о том, что появление мультиплексирования в HTTP/2 (отправка множества параллельных запросов в рамках одного соединения), позволяет избавиться от необходимости создания специальных API для обработки батч-запросов. В статье, есть пример синтетического теста с 40 запросами. Для HTTP/1 накладные расходы на передачу данных составляют около 6Kb, для HTTP/2 — всего в 1440 байт. То есть благодаря HTTP/2 можно проектировать API любой степени детализации, не беспокоясь о проблемах неоптимальной передачи данных.
Мысли в статье интересные. Но мне не хватило сравнения описываемого подхода с GraphQL (плюсы, минусы, бенчмарки).
#http #performance #musings
https://www.mnot.net/blog/2019/10/13/h2_api_multiplexing
HTTP API подвержен проблеме избыточной детализации. Например, при запросе большого количества однотипных сущностей каждый запрос будет отправляться независимо (
/widgets/id1, /widgets/id2 ). Такой подход неоптимален. Для решения этой проблемы создают дополнительные эндпойнты, которые могу обрабатывать запросы "батчами" ( /widgets/id1,id2,id3 ). Ещё можно использовать GraphQL, описывая список необходимых сущностей с помощью специального синтаксиса.Марк пишет о том, что появление мультиплексирования в HTTP/2 (отправка множества параллельных запросов в рамках одного соединения), позволяет избавиться от необходимости создания специальных API для обработки батч-запросов. В статье, есть пример синтетического теста с 40 запросами. Для HTTP/1 накладные расходы на передачу данных составляют около 6Kb, для HTTP/2 — всего в 1440 байт. То есть благодаря HTTP/2 можно проектировать API любой степени детализации, не беспокоясь о проблемах неоптимальной передачи данных.
Мысли в статье интересные. Но мне не хватило сравнения описываемого подхода с GraphQL (плюсы, минусы, бенчмарки).
#http #performance #musings
https://www.mnot.net/blog/2019/10/13/h2_api_multiplexing
Mark Nottingham
How Multiplexing Changes Your HTTP APIs
When I first learned about SPDY, I was excited about it for a number of reasons, but near the top of the list was its potential impact on APIs that use HTTP.