В общих словах о Serverless Environment
Serverless Environment (он же Serverless Architecture) — это подход, в котором разработка программного обеспечения концентрируется вокруг бизнес-логики приложения. Разработчикам больше не нужно заниматься логикой менеджмента инфраструктуры, а можно сконцентрироваться на написании функциональности, максимально прямо направленной на пользователя и бизнес. Управление же инфраструктурой возьмёт на себя облачный провайдер.
В этом контексте, облачный провайдер, — это компания посредник, которая возьмёт на себя ответственность по управлению и масштабированию используемых серверов. Разработчики же платят только за использование ресурсов, что делает эту модель экономически более выгодной. Вместо того чтобы думать о серверах, разработчик может сосредоточиться на разработке приложения и его функциональности.
Подобные услуги предлагает множество облачных провайдеров, но самые популярные из них — AWS Lambda, Azure Functions и Google Cloud Functions. В СНГ регионе же, самыми крупными провайдерами будут Yandex Cloud и Selectel.
Никто за упоминания не заплатил, а жаль..)
#web #useful #theory #principles
Serverless Environment (он же Serverless Architecture) — это подход, в котором разработка программного обеспечения концентрируется вокруг бизнес-логики приложения. Разработчикам больше не нужно заниматься логикой менеджмента инфраструктуры, а можно сконцентрироваться на написании функциональности, максимально прямо направленной на пользователя и бизнес. Управление же инфраструктурой возьмёт на себя облачный провайдер.
В этом контексте, облачный провайдер, — это компания посредник, которая возьмёт на себя ответственность по управлению и масштабированию используемых серверов. Разработчики же платят только за использование ресурсов, что делает эту модель экономически более выгодной. Вместо того чтобы думать о серверах, разработчик может сосредоточиться на разработке приложения и его функциональности.
Подобные услуги предлагает множество облачных провайдеров, но самые популярные из них — AWS Lambda, Azure Functions и Google Cloud Functions. В СНГ регионе же, самыми крупными провайдерами будут Yandex Cloud и Selectel.
Никто за упоминания не заплатил, а жаль..)
#web #useful #theory #principles
🆒9❤3👍3🐳2👾1
Адаптивная и отзывчивая вёрстка
Вёрстку под разные устройства можно грубо разделить на два вида. Вёрстка бывает либо адаптивная, либо отзывчивая.
Оба подхода решают одну и ту же задачу — качественного и удобного отображения контента страницы на разных экранах одинаково хорошо. Контент сайта должен быть доступен пользователю вне зависимости от того, пользуется он ноутбуком, планшетом или смартфоном.
Адаптивная вёрстка — та вёрстка, где для каждого из типов устройств существует собственный макет. В основном, используются фиксированные размеры элементов, а переходы между «устройствами» при изменении размеров окна браузер выглядят рвано, поскольку происходят скачками от запроса к запросу.
Создаются опорные точки при помощи запросов в CSS, выглядит это примерно так:
При отзывчивой вёрстке существует лишь один макет, например, только для мобильных устройств или только для компьютеров, а всё остальное строится отзывчиво относительно изначального макета. Есть даже специальные названия для подходов к разработке, например, Mobile First Design или же Desktop First Design. Особенность такой вёрстки заключается в полной адаптивности под любые устройства и плавность переходов между ними, хотя целевой платформой является что-то одно — либо смартфон, либо компьютер.
Что лучше? Точно ответить нельзя. Субъективно, отзывчивая вёрстка выглядит куда более приятно, но она дороже и дольше в разработке. Всё зависит от конкретных требований проекта и задачи, которую вы собираетесь решать. Иногда поставленные задачи лучше выполнит отдельная мобильная версия. Или вообще приложение вместо сайта.
Спасибо за прочтение, это важно для меня ❤️
#web #theory #mobile #design #useful
Вёрстку под разные устройства можно грубо разделить на два вида. Вёрстка бывает либо адаптивная, либо отзывчивая.
Оба подхода решают одну и ту же задачу — качественного и удобного отображения контента страницы на разных экранах одинаково хорошо. Контент сайта должен быть доступен пользователю вне зависимости от того, пользуется он ноутбуком, планшетом или смартфоном.
Адаптивная вёрстка — та вёрстка, где для каждого из типов устройств существует собственный макет. В основном, используются фиксированные размеры элементов, а переходы между «устройствами» при изменении размеров окна браузер выглядят рвано, поскольку происходят скачками от запроса к запросу.
Создаются опорные точки при помощи запросов в CSS, выглядит это примерно так:
.block {
display: grid;
}
@media (max-width: 768px) {
/* стили для экранов шириной до 768px */
.block {
grid-template-columns: 1fr;
}
}
@media (min-width: 768px) and (max-width: 1024px) {
/* для ширины экрана от 768px до 1024px */
.block {
grid-template-columns: repeat(1, 3fr);
}
}
@media (min-width: 1024px) {
/* для ширины экрана более 1024px */
.block {
grid-template-columns: repeat(1, 6fr);
}
}
При отзывчивой вёрстке существует лишь один макет, например, только для мобильных устройств или только для компьютеров, а всё остальное строится отзывчиво относительно изначального макета. Есть даже специальные названия для подходов к разработке, например, Mobile First Design или же Desktop First Design. Особенность такой вёрстки заключается в полной адаптивности под любые устройства и плавность переходов между ними, хотя целевой платформой является что-то одно — либо смартфон, либо компьютер.
Что лучше? Точно ответить нельзя. Субъективно, отзывчивая вёрстка выглядит куда более приятно, но она дороже и дольше в разработке. Всё зависит от конкретных требований проекта и задачи, которую вы собираетесь решать. Иногда поставленные задачи лучше выполнит отдельная мобильная версия. Или вообще приложение вместо сайта.
Спасибо за прочтение, это важно для меня ❤️
#web #theory #mobile #design #useful
❤29👍16🤔2🐳2🖕1
Модель OSI без задротства
Без задротства, потому что углубленно информация о модели OSI вряд ли понадобится вообще хоть кому-то в Front-End’e, тем более джунам. Но всё же, как и со всем остальным — знать точно полезно.
Модель OSI — Open Systems Interconnection — модель, которая создана для всеобщего упрощения и стандартизации обмена данными между различными компьютерами и системами.
Появилась она из-за того, что в момент активного развития сети, каждый производитель использовал собственные протоколы и собственную архитектуру сети в целом, что в конечном итоге приводило к огромной неразберихе.
Модель OSI помогает решить эту проблему, обеспечивая совместимость всех компьютеров, независимо от их комплектующих и программной части.
Сама модель разделяет процесс передачи данных на семь отдельных уровней, каждый из которых выполняет конкретные функции. То есть достаточно сложный процесс передачи данных разделяется на семь уровней поменьше.
Что действительно интересно, так это невероятный уровень абстракции и представление модели в целом. Уровни разделены таким образом, что каждый из них можно протестировать независимо от других, а каждый слой соединён с последующим через свой конкретный интерфейс, что даёт возможность применить любую реализацию в рамках одного слоя.
Ещё интересно знать, что большинство разработчиков работают с моделью OSI на прикладном уровне, например, работая с HTTP, который как раз на этом уровне и расположен.
И это в целом всё, что начинающему разработчику необходимо знать про OSI. Есть куда более важные темы на современном рынке, на изучение которых стоит тратить время.
Модель OSI — это супер интересно и полезно, но для большинства собеседований углубленные знания темы не актуальны, а жаль. Хотя, если вам интересно погрузиться в тему и на это есть время, то крайне рекомендую, отличное чтиво)
#web #data #theory
Без задротства, потому что углубленно информация о модели OSI вряд ли понадобится вообще хоть кому-то в Front-End’e, тем более джунам. Но всё же, как и со всем остальным — знать точно полезно.
Модель OSI — Open Systems Interconnection — модель, которая создана для всеобщего упрощения и стандартизации обмена данными между различными компьютерами и системами.
Появилась она из-за того, что в момент активного развития сети, каждый производитель использовал собственные протоколы и собственную архитектуру сети в целом, что в конечном итоге приводило к огромной неразберихе.
Модель OSI помогает решить эту проблему, обеспечивая совместимость всех компьютеров, независимо от их комплектующих и программной части.
Сама модель разделяет процесс передачи данных на семь отдельных уровней, каждый из которых выполняет конкретные функции. То есть достаточно сложный процесс передачи данных разделяется на семь уровней поменьше.
Что действительно интересно, так это невероятный уровень абстракции и представление модели в целом. Уровни разделены таким образом, что каждый из них можно протестировать независимо от других, а каждый слой соединён с последующим через свой конкретный интерфейс, что даёт возможность применить любую реализацию в рамках одного слоя.
Ещё интересно знать, что большинство разработчиков работают с моделью OSI на прикладном уровне, например, работая с HTTP, который как раз на этом уровне и расположен.
И это в целом всё, что начинающему разработчику необходимо знать про OSI. Есть куда более важные темы на современном рынке, на изучение которых стоит тратить время.
Модель OSI — это супер интересно и полезно, но для большинства собеседований углубленные знания темы не актуальны, а жаль. Хотя, если вам интересно погрузиться в тему и на это есть время, то крайне рекомендую, отличное чтиво)
#web #data #theory
👍18🔥8❤5🐳5
Коротко о том что такое SEO
SEO — Search Engine Optimization — свойство web-ресурса, которое описывает его оптимизацию для выдачи в поиске при запросе поисковыми роботами поисковых систем, типа Google или Yandex. Слишком много слова поиск.
Чем лучше SEO, тем чаще сайт будет появляться в выдаче. Чем чаще он будет появляться, тем больше посетителей. Посетители = деньги. Поэтому это важно.
Но так это задумывалось изначально. Сейчас это понятие имеет гораздо более широкий смысл. Например, пререндеринг контента для ссылок в социальных сетях, когда появляется красивый предварительный просмотр с заголовком страницы, описанием и изображением — это тоже SEO. Это лишь один из примеров.
И из этого стоит сделать вывод, что SEO сейчас — это свойство web-ресурса, которое определяет его доступность извне.
Описываются такие параметры ресурса в основном в мета-тегах, но стоит помнить, что семантическая верстка — тоже часть SEO, так как используемые теги напрямую влияют на выдачу.
Вот основные примеры как это может выглядеть:
А ещё говорить «SEO оптимизация» — это масло масленное, признак непрофессионализма. Слово «Optimization» уже включено в аббревиатуру, не говорите так. Таких душнил, как я, это триггерит 🙂
Спасибо за прочтение, это важно для меня ❤️
#web #useful #theory
SEO — Search Engine Optimization — свойство web-ресурса, которое описывает его оптимизацию для выдачи в поиске при запросе поисковыми роботами поисковых систем, типа Google или Yandex. Слишком много слова поиск.
Чем лучше SEO, тем чаще сайт будет появляться в выдаче. Чем чаще он будет появляться, тем больше посетителей. Посетители = деньги. Поэтому это важно.
Но так это задумывалось изначально. Сейчас это понятие имеет гораздо более широкий смысл. Например, пререндеринг контента для ссылок в социальных сетях, когда появляется красивый предварительный просмотр с заголовком страницы, описанием и изображением — это тоже SEO. Это лишь один из примеров.
И из этого стоит сделать вывод, что SEO сейчас — это свойство web-ресурса, которое определяет его доступность извне.
Описываются такие параметры ресурса в основном в мета-тегах, но стоит помнить, что семантическая верстка — тоже часть SEO, так как используемые теги напрямую влияют на выдачу.
Вот основные примеры как это может выглядеть:
<meta name="description" content="описание вашей страницы">
<meta name="keywords" content="ключевые слова">
<meta name="author" content="имя автора">
А ещё говорить «SEO оптимизация» — это масло масленное, признак непрофессионализма. Слово «Optimization» уже включено в аббревиатуру, не говорите так. Таких душнил, как я, это триггерит 🙂
Спасибо за прочтение, это важно для меня ❤️
#web #useful #theory
👍31❤11🐳4😁1🫡1
Что такое SSL и TLS
Не так давно я разбирал разницу между HTTP и HTTPS и в этом посте были затронуты SSL и TLS, но я так и не раскрыл до конца что это такое. Исправляюсь.
SSL и TLS — это протоколы шифрования данных транспортного уровня по модели OSI. Оба этих протокола выполняют одну и ту же функцию — обеспечение безопасности передачи данных между клиентом и сервером в сети.
Безопасность обеспечивается путём обмена ключами шифрования между клиентом и сервером. Клиент всегда первым инициализирует процесс обмена ключами, запрашивая сертификат сервера.
Сертификат — это набор информации о сервере, а именно:
— домен
— публичный ключ сервера
— серийный номер сертификата
— название организации, которая выдала сертификат
— цифровая подпись
Клиент получает сертификат сервера и генерирует свой случайный ключ шифрования и отправляет его обратно также в зашифрованном виде.
Таким образом, клиент и сервер обмениваются ключами и и устанавливают защищённое соединение между друг другом.
Весь этот процесс имеет специальное название — «рукопожатие», или же «handshake».
SSL и TLS используются до сих пор. По сути, SSL — это более простая и старая технология, которую рекомендуется заменять на TLS во всех возможных случаях. Но, не смотря на все рекомендации, все ещё достаточно много проектов используют SSL.
Спасибо за прочтение, это правда очень важно для меня ❤️
#web #theory
Не так давно я разбирал разницу между HTTP и HTTPS и в этом посте были затронуты SSL и TLS, но я так и не раскрыл до конца что это такое. Исправляюсь.
SSL и TLS — это протоколы шифрования данных транспортного уровня по модели OSI. Оба этих протокола выполняют одну и ту же функцию — обеспечение безопасности передачи данных между клиентом и сервером в сети.
Безопасность обеспечивается путём обмена ключами шифрования между клиентом и сервером. Клиент всегда первым инициализирует процесс обмена ключами, запрашивая сертификат сервера.
Сертификат — это набор информации о сервере, а именно:
— домен
— публичный ключ сервера
— серийный номер сертификата
— название организации, которая выдала сертификат
— цифровая подпись
Клиент получает сертификат сервера и генерирует свой случайный ключ шифрования и отправляет его обратно также в зашифрованном виде.
публичный ключ сервера + сегенерированный ключ = ключ, отправляемый обратно
Таким образом, клиент и сервер обмениваются ключами и и устанавливают защищённое соединение между друг другом.
Весь этот процесс имеет специальное название — «рукопожатие», или же «handshake».
SSL и TLS используются до сих пор. По сути, SSL — это более простая и старая технология, которую рекомендуется заменять на TLS во всех возможных случаях. Но, не смотря на все рекомендации, все ещё достаточно много проектов используют SSL.
Спасибо за прочтение, это правда очень важно для меня ❤️
#web #theory
👍25❤8🔥3🆒3🐳2✍1🥰1
TypeScript или JavaScript: что приоритетнее?
Есть много адептов и хейтеров TypeScript, в этом вопросе всё не так однозначно, просто выскажу своё мнение.
Я тащу TypeScript в любой проект, где у меня есть такая возможность, и категорически против использования чистого JavaScript без типов. Однако, есть случаи, где это просто необходимо, и использование TS только усложняет вашу жизнь.
Для меня TypeScript решает множество проблем, я его невероятно люблю и стараюсь погружаться в него всё глубже, а всё потому что разработка с ним для меня становится в разы более приятным занятием, чем без него. Код на TypeScript более читаемый, в него можно быстрее погрузиться и внести изменения, а приложения, написанные на нём, потенциально ловят гораздо меньше багов.
Также очень нравятся дополнительные типизируемые сущности в языке в лице типов и интерфейсов. Они позволяют понять что делает тот или иной код, порой, даже без чтения самого кода. Мы можем взглянуть на интерфейсы ввода/вывода данных и примерно понять что происходит в конкретной функции, что упростит её чтение и понимание в дальнейшем, если остается такая необходимость. То есть типы, помимо очевидной пользы в плане стабильности кода, несут и дополнительную функцию — документация кода.
Но у TypeScript есть и недостатки. Для меня главным недостатком является то, что компилятор TypeScript может быть неоптимален. Команда разработчиков старается быстро править все нюансы, но пару раз точно я ловил кейсы, где проблема производительности решалась изменением расширения файла на
Мой вывод заключается в том, что если TypeScript и ужасен, как об этом некоторые говорят, то чистый JavaScript для меня ещё страшнее. Я себя, по крайней мере на данный момент, больше отношу к адептам TS, нежели к его противникам.
Если говорить с точки зрения рынка, то современную фронтенд разработку без TypeScript мне представить не получается. За последние годы, навык разработчиков «Знание TypeScript» перешёл из категории «Желательно» в категорию «Обязательно» и очень плотно там закрепился. Прогнозов на обратный процесс пока точно не будет. Есть ощущение, что TypeScript с нами на очень долго.
Поэтому если вы хотите быть максимально конкурентноспособным на рынке, то стоит признать, что TypeScript — стандарт. Если вы начинающий разработчик, то придётся смириться с тем, что TypeScript придётся выучить.
Ну а вообще, учить нужно не языки, а программирование. Всех благ.
#web #typescript #javascript
Есть много адептов и хейтеров TypeScript, в этом вопросе всё не так однозначно, просто выскажу своё мнение.
Я тащу TypeScript в любой проект, где у меня есть такая возможность, и категорически против использования чистого JavaScript без типов. Однако, есть случаи, где это просто необходимо, и использование TS только усложняет вашу жизнь.
Для меня TypeScript решает множество проблем, я его невероятно люблю и стараюсь погружаться в него всё глубже, а всё потому что разработка с ним для меня становится в разы более приятным занятием, чем без него. Код на TypeScript более читаемый, в него можно быстрее погрузиться и внести изменения, а приложения, написанные на нём, потенциально ловят гораздо меньше багов.
Также очень нравятся дополнительные типизируемые сущности в языке в лице типов и интерфейсов. Они позволяют понять что делает тот или иной код, порой, даже без чтения самого кода. Мы можем взглянуть на интерфейсы ввода/вывода данных и примерно понять что происходит в конкретной функции, что упростит её чтение и понимание в дальнейшем, если остается такая необходимость. То есть типы, помимо очевидной пользы в плане стабильности кода, несут и дополнительную функцию — документация кода.
Но у TypeScript есть и недостатки. Для меня главным недостатком является то, что компилятор TypeScript может быть неоптимален. Команда разработчиков старается быстро править все нюансы, но пару раз точно я ловил кейсы, где проблема производительности решалась изменением расширения файла на
.js
, а значит, что никто не защищен от подобных казусов.Мой вывод заключается в том, что если TypeScript и ужасен, как об этом некоторые говорят, то чистый JavaScript для меня ещё страшнее. Я себя, по крайней мере на данный момент, больше отношу к адептам TS, нежели к его противникам.
Если говорить с точки зрения рынка, то современную фронтенд разработку без TypeScript мне представить не получается. За последние годы, навык разработчиков «Знание TypeScript» перешёл из категории «Желательно» в категорию «Обязательно» и очень плотно там закрепился. Прогнозов на обратный процесс пока точно не будет. Есть ощущение, что TypeScript с нами на очень долго.
Поэтому если вы хотите быть максимально конкурентноспособным на рынке, то стоит признать, что TypeScript — стандарт. Если вы начинающий разработчик, то придётся смириться с тем, что TypeScript придётся выучить.
Ну а вообще, учить нужно не языки, а программирование. Всех благ.
#web #typescript #javascript
🔥19👍10❤7✍4🐳2🌚1
Именованный и неименованный экспорт
Начнем с того, что экспорт бывает разный — именованный и неименованный.
Именованный экспорт — это использование ключевого слова
Стандартный же экспорт — это экспорт с использованием конструкции
Помимо разницы оформления каждого из способов экспорта в коде, также отличается и их импорт. В случае с именованным экспортом у нас есть возможность импортировать каждую сущность из файла по его названию:
Стандартный импорт:
А также их комбинация:
Но что насчет проблематики? Почему разработчики каждый раз сталкиваются с вопросом какой лучше экспорт выбрать?
Чтобы понять это, рассмотрим следующий пример:
В двух импортах выше видна основная проблема — неявные переименования. Такие переименования сущностей могут путать разработчиков, никак не защищают от опечаток, что в совокупности приводит к неоднозначности именований. Из-за всех этих проблем
Также к минусам
Всех этих проблем лишен именованный экспорт. Его обработка сравнительно быстрее, а имя сущности сохраняется на протяжении всего пути от экспорта до импорта, что устраняет возможные неоднозначности.
Мой вывод: я стараюсь сократить использование
Спасибо за прочтение, это важно для меня ❤️
#web #javascript #react #patterns
Начнем с того, что экспорт бывает разный — именованный и неименованный.
Именованный экспорт — это использование ключевого слова
export
перед каждой сущностью или при использовании «паттерна» export list
, когда все экспортируемые сущности перечисляются в одном месте файла:// именованный экспорт
export const a = 1
// export list
const c = 3
const d = 4
const f = 5
export {
c,
d,
f
}
Стандартный же экспорт — это экспорт с использованием конструкции
export default
:// стандартный экспорт
const b = 2
export default b
Помимо разницы оформления каждого из способов экспорта в коде, также отличается и их импорт. В случае с именованным экспортом у нас есть возможность импортировать каждую сущность из файла по его названию:
import {
Status,
getUser,
render as renderFunction
} from './file'
Стандартный импорт:
import React from 'react'
А также их комбинация:
import React, { useState, useMemo } from 'react'
Но что насчет проблематики? Почему разработчики каждый раз сталкиваются с вопросом какой лучше экспорт выбрать?
Чтобы понять это, рассмотрим следующий пример:
import Angular from 'react' // абсолютно валидно
import { Status as UserStatus } from './file'
В двух импортах выше видна основная проблема — неявные переименования. Такие переименования сущностей могут путать разработчиков, никак не защищают от опечаток, что в совокупности приводит к неоднозначности именований. Из-за всех этих проблем
export default
является инструментом, использование которого только усложнит поиск чего-либо по коду и его отладку.Также к минусам
export default
можно отнести то, что такие сущности индексируются статическими анализаторами медленнее и сложнее, что в больших проектах может повлечь за собой проблемы с линтингом.Всех этих проблем лишен именованный экспорт. Его обработка сравнительно быстрее, а имя сущности сохраняется на протяжении всего пути от экспорта до импорта, что устраняет возможные неоднозначности.
Мой вывод: я стараюсь сократить использование
export default
до минимума, предпочитая именованный экспорт и импорт. Использовать export default
валидно только для интеграции вашего кода с уже готовыми решениями, например, это может быть React.lazy
и React.memo
, которые работают только с export default
по умолчанию. У меня есть удобный хак как это обойти, но это тема для отдельного поста.Спасибо за прочтение, это важно для меня ❤️
#web #javascript #react #patterns
👍29❤11🐳3🔥2✍1🤔1
Обратная связь
Друзья, я ещё раз хочу напомнить, что вы можете поделиться своими идеями для постов. Моя личка открыта и я рад пообщаться с каждым.
Если вам кажется, что я сделал ошибку или в канале чего-то не хватает — обязательно пишите. Да и вообще, это может быть что угодно:
— идеи для постов
— опыт и вопросы с собеседований
— критика
— ваше виденье канала
— вопросы и консультации
У меня нет цели что-либо навязать или продать, я готов рассмотреть любое ваше обращение полностью бесплатно. Не стоит думать, что это какая-то гениальная замануха на деньги — это не так)
Спасибо за ваш интерес к проекту. Будем на связи!
Личка — @denisputnov
Друзья, я ещё раз хочу напомнить, что вы можете поделиться своими идеями для постов. Моя личка открыта и я рад пообщаться с каждым.
Если вам кажется, что я сделал ошибку или в канале чего-то не хватает — обязательно пишите. Да и вообще, это может быть что угодно:
— идеи для постов
— опыт и вопросы с собеседований
— критика
— ваше виденье канала
— вопросы и консультации
У меня нет цели что-либо навязать или продать, я готов рассмотреть любое ваше обращение полностью бесплатно. Не стоит думать, что это какая-то гениальная замануха на деньги — это не так)
Спасибо за ваш интерес к проекту. Будем на связи!
Личка — @denisputnov
❤20👍9🔥3🥰2🤩2🙏2🐳2
JSON Web Token
Методов авторизации и аутентификации есть много, но в последнее время большинство из них основывается на JWT.
JSON Web Token — это созданная в определенном формате base64 строка. JWT считается одним из самых безопасных и удобных форматов для передачи токенов и небольшого набора пользовательских данных с запросом.
Особенность такого формата токена в первую очередь заключается в удобстве. JWT — полностью самодостаточная единица информации. Все необходимые для идентификации данные можно хранить в самом токене, в блоке с полезной нагрузкой.
Каждый токен доступа состоит из трёх основных частей:
— Заголовок, в котором определяется информация о самом токене
— Полезная нагрузка — JSON объект, куда записываются все данные, необходимые для авторизации
— Подпись — ключ, который, пусть и не позволит зашифровать сам токен, зато дает возможность валидировать токен на изменения.
Части токена разделяются точками.
Вот так это может выглядеть.
В этом токене в качестве полезной нагрузки использовался такой объект:
Причём, обратите внимание на то, что чувствительную информацию в токене хранить всё равно нельзя. Не забывайте, что JWT — это всего лишь
Да и вообще, чем меньше данных о пользователе, тем лучше.
И на этом, в целом, всё. Спасибо за прочтение, это важно для меня ❤️
#data #theory #useful
Методов авторизации и аутентификации есть много, но в последнее время большинство из них основывается на JWT.
JSON Web Token — это созданная в определенном формате base64 строка. JWT считается одним из самых безопасных и удобных форматов для передачи токенов и небольшого набора пользовательских данных с запросом.
Особенность такого формата токена в первую очередь заключается в удобстве. JWT — полностью самодостаточная единица информации. Все необходимые для идентификации данные можно хранить в самом токене, в блоке с полезной нагрузкой.
Каждый токен доступа состоит из трёх основных частей:
— Заголовок, в котором определяется информация о самом токене
— Полезная нагрузка — JSON объект, куда записываются все данные, необходимые для авторизации
— Подпись — ключ, который, пусть и не позволит зашифровать сам токен, зато дает возможность валидировать токен на изменения.
Части токена разделяются точками.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcm9nd2F5IiwiaWF0IjoxNjg4MDMzMzI1LCJleHAiOjE3MTk1NjkzMjUsImF1ZCI6Ind3dy5wcm9nd2F5LmNvbSIsInN1YiI6InByb2d3YXkiLCJuYW1lIjoiRGVuaXMiLCJzdXJuYW1lIjoiUHV0bm92IiwiZW1haWwiOiJwcm9nd2F5QGVtYWlsLmNvbSIsInJvbGUiOiJBRE1JTiJ9.BTdcnNwZBfAHEmZEwf2P7s724Q1sZ60N2dHVRXhGtHI
Вот так это может выглядеть.
В этом токене в качестве полезной нагрузки использовался такой объект:
{
"name": "Denis",
"surname": "Putnov",
"email": "progway@email.com",
"role": "ADMIN"
}
Причём, обратите внимание на то, что чувствительную информацию в токене хранить всё равно нельзя. Не забывайте, что JWT — это всего лишь
base64
, поэтому декодировать его сможет любой желающий. Да и вообще, чем меньше данных о пользователе, тем лучше.
И на этом, в целом, всё. Спасибо за прочтение, это важно для меня ❤️
#data #theory #useful
👍28❤9🔥3🐳2🍌2☃1🥰1
Делегирование событий
Делегирование событий — это один из базовых способов оптимизации работы с событиями. Суть заключается в том, что используя особенности событийной модели
Все прекрасно представляют что такое туду лист и как он выглядит. Представим, что каждый элемент списка должен реагировать на нажатие по себе — помечать задачу выполненной или, наоборот, помечать актуальной.
При использовании делегирования мы сможем использовать лишь один статичный слушатель:
И вот же пример кода с обработкой таких событий:
Этот код добавляет слушатель событий к родительскому элементу списка
Конечно же, этот паттерн доступен не только в разработке на нативном JavaScript, но и поддержан во всех современных UI фреймворках. По крайней мере, среди тех, что знаю я.
Делегирование спасёт вас от большого веса приложения в оперативке, т.к. каждый слушатель занимает какое-то пространство в WebAPI, ускорит процесс отрисовки и позволит гораздо быстрее и проще вносить изменения в код вашего приложения.
Спасибо за прочтение, это важно для меня ❤️
#javascript #web #useful
Делегирование событий — это один из базовых способов оптимизации работы с событиями. Суть заключается в том, что используя особенности событийной модели
DOM
, а именно, — всплытие, у нас появляется возможно зарегистрировать всего один обработчик вместо нескольких. Хороший пример — обычный туду лист.Все прекрасно представляют что такое туду лист и как он выглядит. Представим, что каждый элемент списка должен реагировать на нажатие по себе — помечать задачу выполненной или, наоборот, помечать актуальной.
При использовании делегирования мы сможем использовать лишь один статичный слушатель:
<ul>
<li>Купить молоко</li>
<li>Сходить в спортзал</li>
<li>Закончить отчет</li>
<li>Починить кран</li>
<li>Позвонить другу</li>
</ul>
И вот же пример кода с обработкой таких событий:
const todoList = document.querySelector('ul');
function handleTodoClick(event) {
const target = event.target;
if (target.tagName === 'li') {
target.classList.toggle('done');
}
}
todoList.addEventListener('click', handleTodoClick);
Этот код добавляет слушатель событий к родительскому элементу списка
ul
вместо каждого отдельного элемента списка li
. Когда пользователь кликает на элемент списка, событие всплывает от li
до ul
. Без использования делегирования, нам пришлось бы вешать всё новые и новые обработчики событий для каждого элемента списка.Конечно же, этот паттерн доступен не только в разработке на нативном JavaScript, но и поддержан во всех современных UI фреймворках. По крайней мере, среди тех, что знаю я.
Делегирование спасёт вас от большого веса приложения в оперативке, т.к. каждый слушатель занимает какое-то пространство в WebAPI, ускорит процесс отрисовки и позволит гораздо быстрее и проще вносить изменения в код вашего приложения.
Спасибо за прочтение, это важно для меня ❤️
#javascript #web #useful
❤43👍16🔥8🐳3🤩1💯1
Как остановить выполнение интервала
Я думаю, что большинство уже знают что такое
Выглядит это следующим образом:
Этот
Вызов функции
Ну и на этом всё 🙂
Спасибо за прочтение, это важно для меня ❤️
#javascript #theory #web
Я думаю, что большинство уже знают что такое
setInterval
. Если же вдруг нет, то:setInterval
— глобальная функция JavaScript, которая позволяет запускать какой-либо код раз в некоторое время. Например, каждые 300 миллисекунд.Выглядит это следующим образом:
setInterval(() => {
console.log('Привет, мир!')
}, 300)
Этот
console.log
будет выполняться бесконечно каждые 300 миллисекунд. Но что же делать в том случае, когда подобное цикличное выполнение нужно остановить? Этот вопрос может поставить кандидата в неудобную ситуацию, хотя, на самом деле — всё просто. Вызов функции
setInterval
возвращает идентификатор интервала, через который можно его остановить при помощи функции clearInterval
. Выглядит это так:const interval = setInterval(() => {
console.log('Привет, мир!')
}, 300)
clearInterval(interval)
Ну и на этом всё 🙂
Спасибо за прочтение, это важно для меня ❤️
#javascript #theory #web
❤37👍17🐳4🔥3🗿2💯1
Синтаксис async/await
В продолжение к посту о
Ничего страшного и сложного, это такой же способ обработки асинхронных операций, только синтаксически он выглядит иначе.
По сути,
Для того, чтобы разобраться, предлагаю пример запроса на сервер:
Перепишем то же самое с использованием нового синтаксиса. Причём, обратите внимание, что ключевое слово
Есть определённое ощущение, что код менее перегружен и выглядит проще, не так ли?
Причём важно помнить, что можно использовать обычные методы
Крайне советую использовать обновлённый синтаксис, поскольку такой код проще рефакторить и читать, но и не забывайте о обычных промисах. Ну пожалуйста 🥲
Спасибо за прочтение, это важно для меня ❤️
#web #theory #javascript
В продолжение к посту о
Promise
, крайне актуально разобрать ещё один метод работы с асинхронным кодом, а именно — синтаксис async/await
.Ничего страшного и сложного, это такой же способ обработки асинхронных операций, только синтаксически он выглядит иначе.
По сути,
async/await
— это синтаксический сахар над промисами, который позволяет делать код более читаемым. Этот синтаксис не приносит ничего нового, а лишь упрощает работу с промисами.Для того, чтобы разобраться, предлагаю пример запроса на сервер:
const data = fetch(`https:/some.api.com/users`)
.then(response => {
return response.json()
})
.then(users => {
return users.map(...)
})
Перепишем то же самое с использованием нового синтаксиса. Причём, обратите внимание, что ключевое слово
await
работает только в функциях, объявленных с помощью ключевого слова async
, поэтому обернём запрос данных в функцию:const getData = async () => {
const response = await fetch('...')
const users = await response.json()
return users.map(...)
}
const data = getData()
Есть определённое ощущение, что код менее перегружен и выглядит проще, не так ли?
Причём важно помнить, что можно использовать обычные методы
then
, catch
и другие даже в синтаксисе async/await
, то есть следующий код абсолютно валидный:const getData = async () => {
// можем вызвать then у fetch, т.к.
// fetch - это тоже промис
const users = await fetch('...').then(res => res.json())
return users.map(...)
}
const data = getData()
Крайне советую использовать обновлённый синтаксис, поскольку такой код проще рефакторить и читать, но и не забывайте о обычных промисах. Ну пожалуйста 🥲
Спасибо за прочтение, это важно для меня ❤️
#web #theory #javascript
❤41👍15🔥7🐳3💯2🗿1
Что такое Promise?
Также отдельно стоит отметить, что промис является микрозадачей.
У
О какой цепочке речь? У
Типичный вид промиса следующий:
Обратите внимание на то, что эти методы вызываются цепочкой. Но никто и не запрещает сохранять промежуточный результат в переменную, если это необходимо:
Также обратите внимание на то, что
Они нужны для того, чтобы перевести
На самом деле, рассказать в рамках поста эту тему подробно просто невозможно. Я бы не сказал, что эта тема сложная, она просто достаточно объёмная. Вдумчивое изучение позволит вам понять что такое
Очень советую статью о промисах на Доке для самостоятельного изучения.
Спасибо за прочтение, это важно для меня
#javascript #web #theory
Promise
— это способ обработки асинхронного кода в JavaScript. Это нативный объект языка, у которого есть своё состояние и несколько методов для удобства работы с ним. Всё это нужно для того, чтобы удобно отслеживать статус выполнения асинхронной операции и, в конечном итоге, получить её результат.Также отдельно стоит отметить, что промис является микрозадачей.
У
Promise
есть несколько состояний:— pending
— ожидание — такое состояние будет у промиса в момент его создания и до того момента, как асинхронная операции не будет выполнена. После выполнения асинхронной операции, Promise
переходит следующие два состояния — fulfilled
или rejected
— fulfilled
— успех — операция выполнена успешно— rejected
— ошибка — если вдруг в цепочке промисов возникла ошибкаО какой цепочке речь? У
Promise
есть три метода, которые позволяют создавать из обычного промиса целую цепочку и обрабатывать данные последовательно.— then
— метод, который принимает результат предыдущего промиса и возвращает новый результат— catch
— метод, который позволяет обработать ошибку операции — finally
— то, что будет выполнено всегда после цепочки промисов, вне зависимости от того завершился он с успехом или нетТипичный вид промиса следующий:
new Promise((resolve, reject) => ...)
.then(...)
.then(...)
.catch(...)
.finally(...)
Обратите внимание на то, что эти методы вызываются цепочкой. Но никто и не запрещает сохранять промежуточный результат в переменную, если это необходимо:
const promise1 = new Promise((resolve, reject) => ...).then(...)
const promise2 = promise1.then(...)
promise2.catch(...).finally(...)
Также обратите внимание на то, что
callback
промиса принимает два аргумента — функции resolve
и reject
.Они нужны для того, чтобы перевести
Promise
из состояния pending
в два других, причем reject
приведёт промис к состоянию rejected
и вызовет методы catch
, если они есть в цепочке, а resolve
либо переведёт нас к следующему в цепочки then
с текущим статусом, либо переведёт Promise
в состояние fulfilled
.На самом деле, рассказать в рамках поста эту тему подробно просто невозможно. Я бы не сказал, что эта тема сложная, она просто достаточно объёмная. Вдумчивое изучение позволит вам понять что такое
Promise
за пару часов.Очень советую статью о промисах на Доке для самостоятельного изучения.
Спасибо за прочтение, это важно для меня
#javascript #web #theory
❤26👍16🔥13🐳3💯2✍1🍌1
Что такое CORS
CORS — Cross-Origin Resource Sharing — стандартный механизм регулирования доступов веб-страниц к ресурсам других доменов. Это политика доступа.
Браузер блокирует доступ к доменам, чтобы исключить некоторые уязвимости (например, чтобы ваши cookies не улетели к третьим лицам).
По умолчанию, с домена, скажем,
Также можно сказать, что CORS — это некоторая система заголовков запроса. Подробно об этой политике можно прочитать в отличной статье MDN, а если вам интересно конкретно моё изложение, то его можно найти на сайте доки в одной из статей, что я писал 🙂
#web #theory
CORS — Cross-Origin Resource Sharing — стандартный механизм регулирования доступов веб-страниц к ресурсам других доменов. Это политика доступа.
Браузер блокирует доступ к доменам, чтобы исключить некоторые уязвимости (например, чтобы ваши cookies не улетели к третьим лицам).
По умолчанию, с домена, скажем,
first.com
, мы не можем отправить запрос к домену second.com
. Именно поэтому многие разработчики часто ловят ошибку типа XMLHttpRequest cannot load...
, когда вы делаете запрос к стороннему API с приложения, развернутого на localhost
.Также можно сказать, что CORS — это некоторая система заголовков запроса. Подробно об этой политике можно прочитать в отличной статье MDN, а если вам интересно конкретно моё изложение, то его можно найти на сайте доки в одной из статей, что я писал 🙂
#web #theory
👍31❤10🔥7🐳4💯1
Всплытие и погружение событий — Событийная модель
Всплытие и погружение событий являются механизмами обработки событий в DOM API.
Суть всплытия заключается в том, что когда на элементе происходит событие, обработчики сначала срабатывают на нём, потом на его родителе, затем выше и так далее, вверх по цепочке предков. Самым высоким предком в цепочке, корнем DOM дерева является тег
Погружение событий, наоборот, означает, что событие сначала обрабатывается на самом верхнем элементе в документе, затем на его дочерних элементах и так далее, до самого вложенного элемента, который в событийной модели называется
Событийная модель включает в себя следующие этапы:
1. Погружение — Capture — событие перехватывается на верхнем элементе и передается по цепочке родительских элементов вниз к самому вложенному элементу.
2. Цель — Target — событие достигает целевого элемента, на котором оно произошло.
3. Всплытие — Bubbling — событие всплывает от целевого элемента обратно по цепочке родительских элементов до самого верхнего элемента.
Механизм всплытия и погружения событий позволяет обрабатывать события на разных уровнях и в разной последовательности.
Благодаря этому механизму мы можем создавать более гибкие, масштабируемые приложения и писать более читаемый код. Достигается это при помощи механизма делегирования, о котором я расскажу в одном из следующих постов.
Об этих процессах прилагаю два отличных материала на русском языке:
1. Событийная модель — doka.guide
2. Всплытие и погружение — learn.javascript.ru
Оба материала более чем достойны вашего внимания. Пересказывать и без того отличные тексты в рамках телеграмм поста я просто не вижу смысла.
#web #javascript #theory
Всплытие и погружение событий являются механизмами обработки событий в DOM API.
Суть всплытия заключается в том, что когда на элементе происходит событие, обработчики сначала срабатывают на нём, потом на его родителе, затем выше и так далее, вверх по цепочке предков. Самым высоким предком в цепочке, корнем DOM дерева является тег
<html>
.Погружение событий, наоборот, означает, что событие сначала обрабатывается на самом верхнем элементе в документе, затем на его дочерних элементах и так далее, до самого вложенного элемента, который в событийной модели называется
event.target
. Событийная модель включает в себя следующие этапы:
1. Погружение — Capture — событие перехватывается на верхнем элементе и передается по цепочке родительских элементов вниз к самому вложенному элементу.
2. Цель — Target — событие достигает целевого элемента, на котором оно произошло.
3. Всплытие — Bubbling — событие всплывает от целевого элемента обратно по цепочке родительских элементов до самого верхнего элемента.
Механизм всплытия и погружения событий позволяет обрабатывать события на разных уровнях и в разной последовательности.
Благодаря этому механизму мы можем создавать более гибкие, масштабируемые приложения и писать более читаемый код. Достигается это при помощи механизма делегирования, о котором я расскажу в одном из следующих постов.
Об этих процессах прилагаю два отличных материала на русском языке:
1. Событийная модель — doka.guide
2. Всплытие и погружение — learn.javascript.ru
Оба материала более чем достойны вашего внимания. Пересказывать и без того отличные тексты в рамках телеграмм поста я просто не вижу смысла.
#web #javascript #theory
👍18❤10🔥7🐳3💯2✍1🤓1🤝1
Книги — это не всегда круто
Напоминаю, что в этом канале могут быть не только задротские разборы теории, а в том числе какие-то мысли из моей головы. Тут из разряда “накипело”
Книга, как и любой инструмент обучения, является лишь одной из форм представления информации. В моём понимании, прочтения достойны лишь те книги по программированию, которые дают:
1. Углубленное понимание
2. Понимание тенденций, истории развития, практик с опорой на исторические факты
3. Фундаментальные неустаревающие знания
В большинстве случаев, книга — скорее враг в обучении, чем друг, из-за своей неактуальности и возможной скорости усвоения информации, которая ниже, по сравнению с конкурентами в виде других текстовых источников, видео и полноценными курсами.
В особенности, неправильно выбранная книга — враг для любого джуна, потому что, изучая
Стоит понимать, что прежде, чем попасть к вам в руки, книга проходит несколько этапов: написание, редактура, согласования на разных уровнях, регистрация, печать и распространение. А если вы читаете переведённую англоязычную литературу, то сюда же добавляется почти та же цепочка с дополнительным действием, имя которому — “перевод”.
Книга в обучении должна появляться только тогда, когда беглый просмотр статей в интернете не приносит новых знаний. Когда, достигая определенного уровня экспертизы, у вас появляется настоящая потребность изучить фундаментальные вещи на более глубоком уровне. И на мой взгляд такого это может быть лишь от части, но уже необходимо, только в тех случаях, когда вы хотите иметь грейд уровня
Во всех остальных случаях, книги, на мой субъективный взгляд, противопоказаны. Гораздо выгоднее потратить время на получение информации из других источников. Вероятно, она будет более поверхностна, но зачастую этого уровня будет достаточно. А если речь идёт о динамично изменяющемся инструменте — это сюр и бесполезная трата денег. Чаще всего вашей лучшей книгой будет официальная документация инструмента на его же сайте.
Относитесь к своему обучению с умом. Если вам кажется, что книга — единственно верный и правильный источник информации, то дело, на самом деле, ваше. В моем понимании такое обучение не является неверным. Оно, скорее, не самое эффективное, что подтверждает опыт моего обучения, моих друзей и коллег, и мой опыт менторинга. Все, что я могу — этим опытом лишь поделиться. Выбор всё равно за вами.
Лично мне, как разработчику, было невероятно интересно читать лишь те книги, что к IT относятся лишь от части, например:
Scrum. Революционный метод управления проектами
Rework — о корпоративном развитии от создателей Ruby on Rails
Мифический человеко-месяц — о ведении проектов
Может я просто больше менеджер, чем разработчик? 🤔
#blog
Напоминаю, что в этом канале могут быть не только задротские разборы теории, а в том числе какие-то мысли из моей головы. Тут из разряда “накипело”
Книга, как и любой инструмент обучения, является лишь одной из форм представления информации. В моём понимании, прочтения достойны лишь те книги по программированию, которые дают:
1. Углубленное понимание
2. Понимание тенденций, истории развития, практик с опорой на исторические факты
3. Фундаментальные неустаревающие знания
В большинстве случаев, книга — скорее враг в обучении, чем друг, из-за своей неактуальности и возможной скорости усвоения информации, которая ниже, по сравнению с конкурентами в виде других текстовых источников, видео и полноценными курсами.
В особенности, неправильно выбранная книга — враг для любого джуна, потому что, изучая
React
по книжке, работу получится найти примерно никогда просто потому что рядовая книга не позволит вам ответить на большинство актуальных вопросов с собеседования. Стоит понимать, что прежде, чем попасть к вам в руки, книга проходит несколько этапов: написание, редактура, согласования на разных уровнях, регистрация, печать и распространение. А если вы читаете переведённую англоязычную литературу, то сюда же добавляется почти та же цепочка с дополнительным действием, имя которому — “перевод”.
Книга в обучении должна появляться только тогда, когда беглый просмотр статей в интернете не приносит новых знаний. Когда, достигая определенного уровня экспертизы, у вас появляется настоящая потребность изучить фундаментальные вещи на более глубоком уровне. И на мой взгляд такого это может быть лишь от части, но уже необходимо, только в тех случаях, когда вы хотите иметь грейд уровня
Senior
даже в рамках текущего рынка. Более того, львиная доля Senior
разработчиков не имеют привычки регулярного чтения в целом, а даже если и читают, то только художественную литературу, а не техническую.Во всех остальных случаях, книги, на мой субъективный взгляд, противопоказаны. Гораздо выгоднее потратить время на получение информации из других источников. Вероятно, она будет более поверхностна, но зачастую этого уровня будет достаточно. А если речь идёт о динамично изменяющемся инструменте — это сюр и бесполезная трата денег. Чаще всего вашей лучшей книгой будет официальная документация инструмента на его же сайте.
Относитесь к своему обучению с умом. Если вам кажется, что книга — единственно верный и правильный источник информации, то дело, на самом деле, ваше. В моем понимании такое обучение не является неверным. Оно, скорее, не самое эффективное, что подтверждает опыт моего обучения, моих друзей и коллег, и мой опыт менторинга. Все, что я могу — этим опытом лишь поделиться. Выбор всё равно за вами.
Лично мне, как разработчику, было невероятно интересно читать лишь те книги, что к IT относятся лишь от части, например:
Scrum. Революционный метод управления проектами
Rework — о корпоративном развитии от создателей Ruby on Rails
Мифический человеко-месяц — о ведении проектов
Может я просто больше менеджер, чем разработчик? 🤔
#blog
👍21❤9🐳5🔥4💯2🤔1🤪1
Что такое MVP
Я тут заметил, что позволяю себе использовать этот термин достаточно часто, но поста о том что это на самом деле такое у меня не было. Нужно исправлять.
MVP — Minimum Viable Product — минимально жизнеспособный продукт — это минимальный набор возможностей продукта, позволяющей ему выполнять свою изначальную задачу — так или иначе функционировать или же приносить хоть какие-то деньги.
MVP помогает команде разработчиков быстро и дешево проверить гипотезы о продукте, собрать обратную связь от пользователей и определить, какие функции и изменения нужно внести для улучшения продукта.
MVP калькулятора — сложение, вычитание, умножение и деление двух целых чисел. Возведение в степень, факториал, логарифмирование, построение графиков — дополнительный функционал, который, скорее всего, в MVP не входит.
MVP Telegram — список чатов. Стикеры, каналы, папки, архив чатов, менеджмент уведомлений, возможность установки своей темы — всё это дополнительный функционал, который в MVP не входит.
Важно чувствовать границу между «необходимым» и «возможным». Это важно.
Спасибо за прочтение, это важно для меня ❤️
#theory
Я тут заметил, что позволяю себе использовать этот термин достаточно часто, но поста о том что это на самом деле такое у меня не было. Нужно исправлять.
MVP — Minimum Viable Product — минимально жизнеспособный продукт — это минимальный набор возможностей продукта, позволяющей ему выполнять свою изначальную задачу — так или иначе функционировать или же приносить хоть какие-то деньги.
MVP помогает команде разработчиков быстро и дешево проверить гипотезы о продукте, собрать обратную связь от пользователей и определить, какие функции и изменения нужно внести для улучшения продукта.
MVP калькулятора — сложение, вычитание, умножение и деление двух целых чисел. Возведение в степень, факториал, логарифмирование, построение графиков — дополнительный функционал, который, скорее всего, в MVP не входит.
MVP Telegram — список чатов. Стикеры, каналы, папки, архив чатов, менеджмент уведомлений, возможность установки своей темы — всё это дополнительный функционал, который в MVP не входит.
Важно чувствовать границу между «необходимым» и «возможным». Это важно.
Спасибо за прочтение, это важно для меня ❤️
#theory
❤34👍14🐳5🔥2👏1🤓1
Data-атрибуты
На самом деле, вёрстка может хранить крайне много информации. Помимо предопределённых атрибутов для каждого из тегов, у разработчиков есть возможность передавать свои кастомные атрибуты к любому тегу. Такие атрибуты называются data-атрибутами и выглядят, например, так:
В этом случае мы создаём кнопку, которая имеет какой-то приоритет, например, приоритет отображения. То есть при помощи кастомного свойства мы можем определить, что такая кнопка будет отображаться первее всех. Конечно же, чтобы это действительно так работало, нам необходимо задать либо кастомные стили, например:
Либо как-то обработать data-атрибут в JavaScript:
Стоит ли использовать data-атрибуты сегодня? Абсолютно точно да, но только в паре случаев: для более удобного тестирования и для чего-то, связанного с динамическим отображением. Для тестирования data-атрибуты могут быть использованы для однозначного поиска какого-либо элемента в вёрстке, например:
Ни в коем случае не записывайте в такие атрибуты никакие важные бизнес-данные. Помните, что вёрстку может отредактировать любой через код элемента, ваше приложение становится слишком уязвимым.
Да и в контексте современных web-фреймворков, использование data-атрибутов всё больше теряет смысл из-за того, что фреймворки предоставляют куда более удобные и безопасные способы хранения данных
#web #theory #javascript #useful
На самом деле, вёрстка может хранить крайне много информации. Помимо предопределённых атрибутов для каждого из тегов, у разработчиков есть возможность передавать свои кастомные атрибуты к любому тегу. Такие атрибуты называются data-атрибутами и выглядят, например, так:
<button data-order="1">Кнопка</button>
В этом случае мы создаём кнопку, которая имеет какой-то приоритет, например, приоритет отображения. То есть при помощи кастомного свойства мы можем определить, что такая кнопка будет отображаться первее всех. Конечно же, чтобы это действительно так работало, нам необходимо задать либо кастомные стили, например:
button[data-order] {
order: attr(data-order)
}
Либо как-то обработать data-атрибут в JavaScript:
const element = document.querySelector(button[data-order])
const order = element.dataset.order
Стоит ли использовать data-атрибуты сегодня? Абсолютно точно да, но только в паре случаев: для более удобного тестирования и для чего-то, связанного с динамическим отображением. Для тестирования data-атрибуты могут быть использованы для однозначного поиска какого-либо элемента в вёрстке, например:
<button data-testid="1">Кнопка</button>
Ни в коем случае не записывайте в такие атрибуты никакие важные бизнес-данные. Помните, что вёрстку может отредактировать любой через код элемента, ваше приложение становится слишком уязвимым.
Да и в контексте современных web-фреймворков, использование data-атрибутов всё больше теряет смысл из-за того, что фреймворки предоставляют куда более удобные и безопасные способы хранения данных
#web #theory #javascript #useful
👍24❤8🐳5🔥3
Различные способы загрузки скриптов
Уже не просто классический, а, скорее, стереотипный вопрос с фронтенд собеседования — это разные способы подключения скриптов к странице.
Начать стоит с того, что каждый скрипт на странице подключается при помощи тега
Также стоит учитывать, что HTML разметка парсится сверху-вниз, а загрузка скрипта через тег
Чтобы решить эту проблему, есть ещё два варианта асинхронной загрузки скриптов.
Оба варианта загрузки являются асинхронными и не блокируют отрисовку и парсинг HTML. Но в чём же тогда разница? В порядке выполнения.
Если на странице будет несколько
Скрипты
И это, в целом, все отличия, которые стоит знать для ответа на этот вопрос.
#javascript #web #useful #theory
Уже не просто классический, а, скорее, стереотипный вопрос с фронтенд собеседования — это разные способы подключения скриптов к странице.
Начать стоит с того, что каждый скрипт на странице подключается при помощи тега
script
:<script src="index.js"></script>
Также стоит учитывать, что HTML разметка парсится сверху-вниз, а загрузка скрипта через тег
script
является блокирующей операцией при загрузке вёрстки. Это значит, что браузер, доходя до тега script
, полностью прекращает дальнейший парсинг и отрисовку HTML до того момента, пока скрипт не будет загружен и выполнен.Чтобы решить эту проблему, есть ещё два варианта асинхронной загрузки скриптов.
<script async src="index.js"></script>
<script defer src="index.js"></script>
Оба варианта загрузки являются асинхронными и не блокируют отрисовку и парсинг HTML. Но в чём же тогда разница? В порядке выполнения.
Если на странице будет несколько
async
скриптов, то выполнятся они будут в порядке загрузки. То есть каждый скрипт будет выполнен ровно тогда, когда скачается, вне зависимости от того порядка, в котором скрипты подключаются в файле. Также async
скрипты не подходят для загрузки скриптов, активно взаимодействующих с HTML разметкой, поскольку такой скрипт может быть загружен и выполнен ещё до того, как успеет построиться DOM дерево.Скрипты
defer
также загружаются асинхронно, но, в отличии от async
, сохраняют порядок выполнения. Более того, все defer
скрипты дожидаются построения DOM дерева, даже если были загружены ранее, из-за чего взаимодействие с разметкой из таких скриптов немного удобнее и безопаснее.И это, в целом, все отличия, которые стоит знать для ответа на этот вопрос.
#javascript #web #useful #theory
👍35🔥10🐳6🤓2❤1
CSS можно в JS и это не всегда хорошо
Фронтендеры как будто не могут договориться как им хочется писать стили 🙂. Вариантов очень много, разнообразных препроцессоров и инструментов в виде библиотек стилей, CSS фреймворков…
Вообще, CSS-in-JS — это некоторый подход, в котором мы отказываемся от массового использования стандартных CSS файлов и пишем стили внутри JS. Для реализации этого концепта есть несчётное количество библиотек, но для React основной я бы назвал
Причина проста: это очень удобно, по нескольким причинам.
1. CSS-in-JS позволяет генерировать стили динамически для одного класса. Стандартный CSS так не может, мы должны изменять стили только добавлением дополнительного класса, модификатора и т.д.
2. Дополнительная мета-информация при разработке переезжает из
3. Упрощённая файловая структура. Формочки можно клепать ещё проще и быстрее, не переключаясь между файлами.
Возможно и звучит круто, но за всё это приходится платить достаточно высокую цену:
1. Стили создаются в рантайме и блокируют выполнение остального JavaScript на странице. Это приводит к проблемам с производительность, особенно для перегруженных систем. Всё это удобство в разработке приведет к тому, что пользователь будет плеваться от того, какое медленное приложение вы сделали.
Использование нативного CSS для браузера куда понятнее и быстрее, JS бандл становится меньше и грузится также быстрее, а стили подгружаются параллельно вашему коду.
В результате-то что? На мой вкус, CSS-in-JS — это и правда очень удобно. Но я полностью отказался от этого подхода в своих проектах, потому что не готов платить производительностью за все плюсы, что описал выше.
Если вы хотите писать стили быстро и качественно, то я действительно рекомендую обратить большее внимание на обычные модульные стили на каком-то препроцессоре или же вообще на Tailwind CSS. От последнего я, кстати, невероятно долго плевался, ну а потом как обычно: отрицание, гнев, торг, депрессия, влюбился… Точно рекомендую посмотреть, если ещё не пробовали)
Спасибо за прочтение, это важно для меня ❤️
#javascript #web #react #theory
Фронтендеры как будто не могут договориться как им хочется писать стили 🙂. Вариантов очень много, разнообразных препроцессоров и инструментов в виде библиотек стилей, CSS фреймворков…
Вообще, CSS-in-JS — это некоторый подход, в котором мы отказываемся от массового использования стандартных CSS файлов и пишем стили внутри JS. Для реализации этого концепта есть несчётное количество библиотек, но для React основной я бы назвал
styled-components
. Лично я вижу повальное число проектов, в которых используется эта библиотека, да и сам использовал её в достаточно часто.Причина проста: это очень удобно, по нескольким причинам.
1. CSS-in-JS позволяет генерировать стили динамически для одного класса. Стандартный CSS так не может, мы должны изменять стили только добавлением дополнительного класса, модификатора и т.д.
2. Дополнительная мета-информация при разработке переезжает из
className
в название самого тега. Если мы хотим как-то влиять на внешний вид нашего приложения, то классы мы будем записывать в переменные, соответственно прочитать их быстро не получится. В общем, сложно. Стилизованные компоненты же несут информацию о том, зачем они нужны, сразу из названия, и этой информации куда больше, чем просто div
, aside
, ul
...3. Упрощённая файловая структура. Формочки можно клепать ещё проще и быстрее, не переключаясь между файлами.
Возможно и звучит круто, но за всё это приходится платить достаточно высокую цену:
1. Стили создаются в рантайме и блокируют выполнение остального JavaScript на странице. Это приводит к проблемам с производительность, особенно для перегруженных систем. Всё это удобство в разработке приведет к тому, что пользователь будет плеваться от того, какое медленное приложение вы сделали.
Использование нативного CSS для браузера куда понятнее и быстрее, JS бандл становится меньше и грузится также быстрее, а стили подгружаются параллельно вашему коду.
В результате-то что? На мой вкус, CSS-in-JS — это и правда очень удобно. Но я полностью отказался от этого подхода в своих проектах, потому что не готов платить производительностью за все плюсы, что описал выше.
Если вы хотите писать стили быстро и качественно, то я действительно рекомендую обратить большее внимание на обычные модульные стили на каком-то препроцессоре или же вообще на Tailwind CSS. От последнего я, кстати, невероятно долго плевался, ну а потом как обычно: отрицание, гнев, торг, депрессия, влюбился… Точно рекомендую посмотреть, если ещё не пробовали)
Спасибо за прочтение, это важно для меня ❤️
#javascript #web #react #theory
👍38❤13🔥3🐳3
progway — программирование, IT
CSS можно в JS и это не всегда хорошо Фронтендеры как будто не могут договориться как им хочется писать стили 🙂. Вариантов очень много, разнообразных препроцессоров и инструментов в виде библиотек стилей, CSS фреймворков… Вообще, CSS-in-JS — это некоторый…
К слову, о разности в производительности: вот наглядный пример разницы времени скриптинга.
Тут видно, что нативный подход примерно на 20 миллисекунд быстрее, чем
Из практики, на одном из больших проектов, где за стандарт был взят🤷♂️
В примере выше значение в 20мс не является погрешностью измерения. Я специально покрутил страницу подольше и взял усредненные значения. Если экстраполировать эти значения, то, в среднем, если 5
Даже если сделать скидку на погрешность измерения и сократить ожидаемую деградацию в два раза до 200-400мс, то даже это не спасёт ситуацию. Это всё равно очень большое время🤷♂️ 🤷♂️ 🤷♂️
Тут видно, что нативный подход примерно на 20 миллисекунд быстрее, чем
styled-components
, и, возможно, вы можете подумать, что эта разница слишком мала. Только вот эта разница достигается уже тогда, когда я рендерю просто 5 div
со стилями на странице, а стилизованных компонентов даже в маленьких проектах значительно больше пяти.Из практики, на одном из больших проектов, где за стандарт был взят
styled-components
, время скриптинга одного из модулей доходило до 3.5 секунд. После переписывания стилей на CSS-модули, время скриптинга уменьшилось до 650-700мс, то есть, по факту, в 5 раз, просто из-за стилей в коде В примере выше значение в 20мс не является погрешностью измерения. Я специально покрутил страницу подольше и взял усредненные значения. Если экстраполировать эти значения, то, в среднем, если 5
styled-components
компонентов замедлят вашу страницу на 20мс, то в более реальной ситуации с 100-200 компонентами, ваша страница из-за стилей будет грузиться на 400-800мс дольше. Даже если сделать скидку на погрешность измерения и сократить ожидаемую деградацию в два раза до 200-400мс, то даже это не спасёт ситуацию. Это всё равно очень большое время
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🤯5✍2🐳2🤪1🗿1