Будни разработчика – Telegram
Будни разработчика
14.6K subscribers
1.24K photos
366 videos
7 files
2.12K links
Блог Lead JS-разработчика из Хельсинки
Автор: @bekharsky

По рекламе: https://telega.in/channels/htmlshit/card?r=GLOiHluU или https://news.1rj.ru/str/it_adv

Чат: https://news.1rj.ru/str/htmlshitchat

№5001017849, https://www.gosuslugi.ru/snet/679b74f8dad2d930d2eaa978
Download Telegram
#стрим дня

…который будет 6 сентября.

В общем, есть тип такой, Джейсон Ленсторф, он ведёт обучающие стримы по веб-технологиям.

И у него на стриме 6 сентябра будет создатель курсов по TypeScript, Мэтт Покок: https://www.learnwithjason.dev/advanced-typenoscript-let-s-learn-generics

Тема стрима — дженерики в TS. Без вопроса по дженерикам не обходится ни одно интервью.

Залетаем, смотрим, учимся.

#ts #generics
2👍1
#фишка дня

Многие (к сожалению, не все) кто хоть раз разрабатывал формы, сталкивались с элементом label (лейбл, ярлык, как вам угодно). И знают, что при правильном его использовании пользователю не приходится целиться мышью в галочку или радиокнопку.

Кто-то добавит при этом, что скринридеры могут ассоциировать лейбл с элементом ввода и пользователи с нарушением зрения могут легко сориентироваться в вашей форме.

Но не все знают, что лейбл можно повесить и на элемент button: https://codepen.io/alinaki/pen/XWjLedQ

Да, возможно, кнопке свой ярлык не нужен и даже MDN сообщает нам об этом, но!

Но в лейбл можно добавить дополнительную информацию, которая будет однозначно и семантично связана с кнопкой и поможет, например, скринридерам или при создании тултипа.

Лейблом можно продублировать кнопку без внесения лишней когнитивной нагрузки (но не стоит, фокус он не примет). Пожалуй, для каких-нибудь игровых интерфейсов вполне может быть приемлемо.

А вот если вы не используете кнопки и балуетесь role=“button” на div-ах (в лучшем случае) — этой возможности вы лишены в принципе.

#html #button #label
👍14
#обман дня

Не так давно мы с вами радостно приветствовали введение штатной «ленивой» загрузки для тегов img и iframe. Был добавлен атрибут loading, который может принимать значение lazy и eager. Перевод, думаю, не требуется.

И блоги разработчиков и соиздателей браузеров радостно кричали: «Теперь ленивая загрузка картинок возможна даже при отключённом в браузере JS». Пруф (04.09.2022): https://web.dev/browser-level-image-lazy-loading/#:~:text=still%20works%20even%20if%20javanoscript%20is%20disabled

Хрена с два. Мы тут с пользователем Твиттера Стефаном Юдисом выяснили, что ленивая загрузка в Chrome таки отключается. Как и обещал нам MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-loading

Статья в блоге Chrome на днях будет исправлена. А вы пока попробуйте предположить, почему так. Это очень забавно.

#js #lazy #img
😱7👍4
This media is not supported in your browser
VIEW IN TELEGRAM
#codepen дня

Вам никогда не казалось, что подвалы сайтов незаслуженно обижены?

Скроллишь, скроллишь себе бесконечную загрузку твитов или постов в ленте, футер появляется на секунду — и тут же снова улетает с экрана, не успев сообщить что-то важное…

Стив Гарднер попытался визуализировать происходящее, вышло офигенно, целая история: https://codepen.io/ste-vg/pen/PoQgvBK

#scroll
👍28😢3😁21
#такое дня

По всей видимости, последняя ревизия клавиатурного механизма «бабочка» от Apple была достаточно надёжной 🤣

Но не судьба.
😱10👍5
#инструмент дня

Кто соскучился по новым фреймворкам? Поднимите руки!

🙋🙋‍♂️🙋‍♀️🙋🙋‍♂️🙋‍♀️

Вижу лес рук. Прекрасно.

Итак, вашему вниманию предлагается Enhance.

Что он такое? Это основанный на веб-компонентах (web-components) фреймворк, использующий файловый роутинг и свой собственный менеджер состояний.

Похоже на React и Lit одновременно? Ну кто бы мог подумать.

Цель проекта — нести веб-компоненты в массы, сделать их переиспользование и структуру проекта вообще максимально простой (привет, классовый Lit). Кроме менеджера состояний поставляется ещё и атомарный CSS-фреймворк (зачем? брали бы уж Tailwind, хайповать так хайповать).

В общем, как всегда, внимания стоит. Как минимум, простые наброски делать должно быть одно удовольствие.

Тут SSR из коробки, кстати. Может стать неплохой альтернативой 11ty.

#js #components
5👍5
#статья дня

Disclaimer: мне не нравится решение, представленное в статье, которую я сейчас опишу. Почему же я её упоминаю? Потому что идея-то классная, но недожали.

Я писал о масштабировании интерфейса пару раз. Всё сводилось к следующему: берём ширину дизайн-макета за 100% и считаем единицы размеров относительно размера видимой ширины экрана:

Раз: https://news.1rj.ru/str/htmlshit/1182
Два: https://news.1rj.ru/str/htmlshit/1183
Три: https://news.1rj.ru/str/htmlshit/1229

Но с момента первой публикации этих постов (начало 2021 года) прошло достаточно много времени, инструменты вроде clamp и адаптивной типографики начали захватывать мир: https://news.1rj.ru/str/htmlshit/902

Так вот, ребята из статьи на CSS Tricks примерно в то же время решили применить оба подхода, заодно показав нативное CSS-решение прямого масштабирования: https://css-tricks.com/how-to-get-a-pixel-perfect-linearly-scaled-ui/

Так что же с ней не так?

Они наступили на те же грабли, что я когда-то с vw/vh: потеряли возможность масштабирования в браузере. А это жирный минус на десктопах (на мобилах такой проблемы нет).

Тем не менее, направление-то классное, надо подумать на досуге, как это сделать умнее.

Но не забывайте, что CSS-то развивается, появились запросы от контейнера и родительский селектор. Pixel-perfect вёрстке давно пора умереть в глобальном смысле.

#css #layout #design
🤔21
#фишка дня

Заканчивайте использовать JSON.parse(JSON.stringify(obj)) для дублирования (aka глубокого копирования aka deep copy) объектов в JavaScript.

Такой метод игнорирует даты, неопределённые значения и не работает с циклическими зависимостями.

Уже достаточно давно имеется structuredClone.

Наличествует во всех современных браузерах, есть полифилл.

P. S. вот тока не надо мне про лодаш тут плиз) все же использовали JSON-решение из-за скорости ⚡️

#js #clone
👍23🔥3🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
#инструмент дня

Я решил, что плагины для Figma тоже будут сюда залетать. Особенно, если эти плагины реализованы на базе хороших статей по вёрстке.

Например, от Джоша Камю про красивые тени в CSS: https://www.joshwcomeau.com/css/designing-shadows/

Потому что все мы в душе немного художники.

Встречайте: https://www.figma.com/community/plugin/1068595505353552645/Beautiful-Shadows

В треде автора плагина есть пара трюков по использованию, ну и вообще, можно оставить своё спасибо.

#figma #css #shadow
🔥16👍2
This media is not supported in your browser
VIEW IN TELEGRAM
#фишка дня

Вам уже должен быть хорошо знаком input type=“number”. Кто-то наверняка даже пытался стилизовать раздражающие стрелочки.

Но мало кто знает, что это (и ещё одно, угадайте, какое) поле ввода предоставляет свои псевдоклассы: :in-range и :out-of-range. Уже понятно, что они делают: если вы установили атрибуты min и max, вышеуказанные псевдоклассы позволят воспользоваться этим знанием в CSS.

input:out-of-range ~ span {
color: red;
}

И естественно, подъехал (вот буквально) шикарный CodePen на эту тему:
http://codepen.io/jh3y/pen/MWWowEb

👉 @htmlshit

#css #input #number #range
🔥21👍1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
#фишка дня

А давайте ещё больше безумных идей богу безумных идей.

Как вам фильтрация списка на CSS? Уж точно покруче FizzBuzz задачи на собеседовании.

А достигается волшебство путём использования селекторов пот атрибутам:


[term] { display: none; }
[term*="a" i] { display: list-item; }


i — означает case-insensitive, регистронезависимый ввод.

Пример на CodePen: https://codepen.io/jh3y/pen/NWyaomN

Пример, конечно, выглядит малость упорото — он на JS генерирует вышеописанный код на CSS, но даже при всём этом — выход весьма декларативен и позволяет поиграть эффектами скрытия-отображения элементов на ура.

Просто считайте это вашим маленьким DSL (domain-specific language, язык под задачу).

Основная идея: не забывайте, что у вас и такое есть под рукой.

#css #js #attributes
👍13🔥3👎1
#такое дня

Посмотрел презентацию Apple. Мой новый ноутбук, конечно, не показали.

Но назрел вопрос: а кто-то вообще для часов верстал? Есть ли такой запрос на рынке вообще?

Поделитесь опытом.
👍3
#фишка дня

Я очень люблю, когда люди открывают для себя геометрию пятого класса. Особенно дизайнеры.

Посмотрите на картинку: наружный радиус двух вложенных блоков это радиус скругления внутреннего блока плюс поля.

Казалось бы, всё так очевидно. Но, похоже, не всем…

В комментариях прекрасное будет :)

#design #border
🤯27👍18😁5🥴1
#дата дня

А вы чего мне не напомнили, что формату SVG четвёртого сентября исполнился 21 год?

Глядите, скрин спеки версии 1.0 в музее: https://www.webdesignmuseum.org/web-design-history/noscript-1-0-2001

Забавный проект, кстати, этот музей. В разделе истории веб-дизайна имеется таймлайн выпусков первых версий плотно связанных с вебом технологий, сервисов и программ.
🎉61
#заметка дня

Для меня было небольшой загадкой, почему Vim, а по большей части, Neovim, так завирусился в последнее время.

Я использовал Vim активно лет 12 назад, имел огромный конфиг, но в итоге сполз с него на Sublime, Atom, а потом и VS Code. Причиной стала лучшая поддержка нужных мне инструментов. Vim остался горячо любимым редактором на удалённых серверах. И от конфига я отказался в пользу сырых режимов, это положительно сказалось на работе в разных средах.

К слову, Vim может искать по многогигабайтным логам легко и просто, а эти ваши VS Code и даже Sublime — нет.

Но суть не в этом. Суть в том, что Vim и другие независимые редакторы спасла… Microsoft. Как?

Раньше каждая IDE реализовывала свой механизм работы с конкретным языком. И как правило, это было некое проприетарное (в смысле непереносимое) решение. Но всё изменил приход LSP: Language Server Protocol.

Такого раньше не было: открытый стандарт взаимодействия редактора и языка. Автодополнение, ссылки, определения, документация… А главное, протокол-то открытый.

Поддерживается уже огромное количество языков и редакторов. И тут мы подходим к главному.

О преимуществах Vim есть огромный свежий тред Кирилла Мокевнина, CEO Hexlet: https://twitter.com/mokevnin/status/1567594899859546115

Оригинальный Vim не поддерживает LSP, зато его поддерживает Neovim. И тут все любители модальных редакторов получили второе дыхание.

Но вот я правда был очень удивлён, как Microsoft снова перевернула мир свободного ПО. Это, конечно, поразительно.
🔥8👍3🤔3
This media is not supported in your browser
VIEW IN TELEGRAM
#фишка дня

Если вы не знали, или забыли, спешу вам напомнить, что псевдоэлементы флейсбокс-контейнера тоже подвержены влиянию флекса.

Что это значит на практике?

Это значит, что если вы сделали space-between или space-around чтобы выровнять элементы по двум сторонам, вам не нужно точное их количество чтобы забить всю сетку для последней строки.

Ну то есть, последняя строка из двух элементов не должна «расползаться», элементам просто нужно встать в начало.

Достаточно поставить «распорку» в виде псевдоэлемента: https://codepen.io/alinaki/pen/KKRzMdz

Не делайте, как фейсбук, пожалуйста: https://news.1rj.ru/str/htmlshit/387

Ну и очевидно, это можно использовать для различных вариантов оформления тех же заголовков, например.

#css #flex
🔥173👍1
#библиотека дня

Если есть понятие семантики, где элементы HTML представляют собой то, чем являются, то может, классы в CSS не так уж и нужны?

И таки да!

Парни из https://simplecss.org/ и https://native-elements.dev/ так и считают. Можно построить вполне себе полноценный сайт, не написав ни единого класса.

Как тебе такое, тейлвинд?)

Конечно, получается не то чтобы сверхсложное что-то. Но для среднего блога вполне можно. Сайт этого канала был на нейтивах, но я забыл оплатить домен и godaddy меня поимел.

Впрочем, к теме. Это, конечно, не единственные варианты. Вот целый список: https://github.com/dbohdan/classless-css

Мыслите шире, котаны!

#css #framework
🌚5👍4
#инструмент дня

Иногда случается ситуация, когда никак иначе, кроме как парсингом страниц, данные не собрать.

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

Тогда я воспользовался https://github.com/cheeriojs/cheerio, написав простой скрипт на node.js. Это как jQuery, но для Node.js. Разобрал данные и сохранил в JSON.

Оказывается, есть и более кондовые утилиты.

Например, https://github.com/mgdm/htmlq и https://stedolan.github.io/jq

Первый, как нетрудно догадаться, может обработать HTML, а второй — JSON. И всё из командной строки :)

Например, найти все ссылки на странице:

curl --silent https://www.rust-lang.org/ | htmlq --attribute href a


Можно и просто целые куски HTML выдирать, и селекторы использовать. А дальше — все возможности командной строки и скриптов для обработки.

Ну а jq может стать частью вашей CI/CD системы, разгребсти ответы от API GitHub, например, и выдать их в читаемом виде.

#tools #html #json #cli
👍13🔥4
#ловушка дня

Короче, народ. Если вы, как и я, начали испытывать проблемы сборки node-sass на разных платформах и перешли на sass (aka dart-sass), у меня новость:

Нас поимели.

Суть проблемы: dart-sass заменяет номера мнемоник HTML в контенте псевдоэлементов (entity, сущности, ascii-представление Unicode-символов) на, собственно, Unicode-символы. Но есть нюанс.

Нюанс в том, что он это делает насильно и возможности отключить нет: https://github.com/sass/dart-sass/issues/1219

Начиная с версии 1.54 они вынесли добавление @charset “UTF-8” или BOM-символа в собранные файлы в отдельный пункт конфигурации (charset, включено по умолчанию), но…

Опять нюанс.

И здесь уже нам поднасрал Webpack и его css-loader. Они убирают и charset и BOM-символ при очередной сборке файлов, чтобы правильно склеить результирующий CSS.

А обратно не ставят 🤬

Решений проблемы несколько: или использовать css-unicode-loader чтобы конвертировать Unicode снова в ASCII, или webpack-utf8-bom чтобы насильно добавить BOM-символ в начало, или PostCSS чтобы вернуть charset, или менять сборщик.

Почему это проблема?

1. Иконочные шрифты теперь отданы на откуп автодетектору UTF-8 в браузере. И поверьте, оно не всегда верно работает.
2. Всякие zero-width пробелы и прочие непечатные и неразрывные символы теперь неотличимы друг от друга в коде (ну сравните \200B и “”).

Котаны, я негодую. Люто негодую. Ментейнеры кивают друг на друга, а проблему-то решать самому.

#css #scss #sass
👍11🤔3🤬2😱1
#заметка дня

Тоже считаете, что поведение dart-sass и их мэнтейнеров не является логичным?

Можно пойти и поставить «большие пальцы» в этот issue на GitHub: https://github.com/sass/dart-sass/issues/568, в котором люди просят добавить флаг для вывода результирующего CSS в ASCII, без конвертации в Unicode.

Ну нельзя же жить в отрыве от реальности, да и неудобно это для многих применений.

Тем временем, отвлечёмся. То тут то там спрашивают о конфиге Webpack. Мол, поделиться.

Ребят, я когда-то давно до последнего игнорировал вебпак и тоже думал, что вот где-то там есть идеальный конфиг. Так вот, его нет. Каждый пишет свой.

Для начала надо понять, что вебпак собирает всё, что ты ему скормишь, в один большой JS-файл. Это была изначальная идея. Даже точка входа не index.html, а index.js.

Отсюда пошла концепция «загрузчиков»: css-loader, font-loader, noscript-loader… чтобы можно было просто импортировать разные виды файлов прямо в JS.

Когда файлы импортированы и внедрены в JS — настаёт время их оттуда извлекать. И тут начинается время т. н. экстракторов: css-extract-plugin, text-extract-plugin, assets-extract-plugin…

Вот вокруг этой логики и крутятся все конфиги. Это и дикая мощь, и не менее дикие проблемы.

Да, в Webpack 5 концепция чуток поменялась, но лишь чуток.

Мы живём в 2022 году, есть шикарные инструменты сборки вроде Vite, Parcel. Gulp тоже никуда не исчезал. Генераторы статичных сайтов типа 11ty и Enhance тоже прекрасно справляются с работой.

Например, точкой входа в Vite является index.html, сразу становится логичным, в случае мультистраничного сайта, просто добавить несколько файлов HTML в конфиг, а Vite сделает остальное. А уж генераторы сайтов и подавно под это заточены.

Так что не надо нервничать, что не получается единственно верный конфиг вебпака.

Ни у кого не получается. И у всех получается.

#webpack
👍13