Chulakov Dev – Telegram
Chulakov Dev
1.16K subscribers
139 photos
5 videos
204 links
Канал команды разработки Студии Олега Чулакова.

Советы по Frontend- и Backend-разработке web-сервисов, мобильных приложений, статьи и презентации от наших разработчиков, анонсы проектов и многое другое.

Обсудить проект @YuraAndreev
Download Telegram
Всем привет!

CSS стремительно развивается, появляются новые возможности визуального оформления страниц.

Сегодня давайте обсудим плюсы и минусы разных инструментов для работы со стилями и выберем самый удобный.

Читать о стилях

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥621🤔1
Привет, друзья!

Что такое временная мертвая зона, и какое отношение она имеет к разработке? ☠️ Давайте разбираться!

Временная мертвая зона, или Temporal Dead Zone (TDZ), — это временной промежуток, в течение которого let- и const-переменные не могут быть использованы. Это происходит, когда переменная была инициализирована после попытки обращения к ней.

Как и hoisting, такого понятия, как TDZ, в спецификации ECMAScript не существует. Все это является теоретической базой для понимания того, как работает доступ к определенным сущностям и что тем более ничего не «поднимается наверх», как многие любят об этом рассказывать, упоминая hoisting.

Итак, var-переменные, а также Function Declaration и Generator Declaration доступны из любой точки кода, вне зависимости от их объявления. В отличие от них, let- и const-переменные ведут себя иначе. При попытке обратиться к ним до их инициализации рантайм выбросит ошибку, так как эти переменные находятся во временной мертвой зоне. То же самое касается Function Expression и Generator Expression.

При разработке очень важно понимать теорию о TDZ, так как она позволяет определять, в каких случаях можно или нельзя обращаться к переменным. Более того, выброс ошибки в случае обращения к переменным, когда они находятся в TDZ, может предостеречь нас от ошибок проектирования и нестабильности скрипта/модуля. Напомним, что var-переменная доступна сразу со значением undefined, пока ей не будет присвоено какое-либо значение.

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍82
Всем привет!

Подготовили для вас очередную задачку ⚙️ Есть тут те, кто разбирается в Event Loop?

console.log('start');

const promise1 = Promise.resolve().then(() => {
console.log('promise1');
const timer2 = setTimeout(() => {
console.log('timer2');
}, 0);
});

const timer1 = setTimeout(() => {
console.log('timer1');
const promise2 = Promise.resolve().then(() => {
console.log('promise2');
});
}, 0);

console.log('end');

Ниже вопрос и варианты ответа👇🏻
Завтра пошагово разберем правильный!
🔥11👍71
Привет, друзья!

Итак, правильный ответ на вчерашнюю задачу — вариант №1: start -> end -> promise1 -> timer1 -> promise2 -> timer2

Объясняем, почему.

1. Выполняем синхронную задачу console.log("start").

2. Далее идет промис. Это асинхронная операция, и поэтому она помещается в стек микротасок. Она исполнится, как только вернется со статусом fulfilled/rejected.

3. Далее — setTimeout. Он выходит из Main Thread, поэтому также не выполняется.

4. Выполняем синхронную задачу console.log("end"), т.к. в предыдущем тике микротаска еще не была исполнена.

5. В этом же тике у нас готова микротаска. Выводим promise1 и выпускаем setTimeout из основного потока.

6. У нас вернулся timer1. В нем выводится такая же строка и запускается выполнение промиса. Тут очень важный момент — в текущем тике у нас нет синхронных задач (timer2 еще гуляет вне потока), а значит, можно сразу выполнить микротаску с выводом promise2.

7. Возвращается timer2 и выводится в консоль.

🤔 Если у вас остались вопросы — задавайте, будем разбираться вместе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥42👌2
Наши эксперты всегда с радостью делятся знаниями и опытом — не только в профессиональной сфере, но и в построении внутренних процессов Студии.

Не так давно Team Lead отдела разработки Студии Альберт Рыбалко рассказал участникам People&&Culture Meetup о преимуществах нашего подхода к аттестации сотрудников.

На митапе обсудили с аудиторией:
⚫️зачем нужна аттестация, что она дает сотрудникам и бизнесу;
⚫️как мы усовершенствовали процесс аттестации, какие изменения внедрили;
⚫️какие результаты в итоге получили (спойлер: меньше стресса — больше пользы)

➡️ Смотреть запись

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍73😍2
Привет, друзья!

В этом посте мы хотим развеять несколько мифов относительно Event Loop и рассказать про некоторые его особенности.

Event Loop — обычный агент, который не является частью ядра V8. Тот цикл событий, который вы привыкли видеть, — Event Loop спецификации HTML5, который, помимо JS, работает также и с DOM, и с Web API. В конце концов, у Node.js реализован свой Event Loop, который отличается от клиентского.

Циклов событий может быть несколько. Когда мы создаем Web Worker, внутри него находится такой же агент, который тоже выполняет код. Не путайте воркеры с многопоточностью.

Код может выходить из Main Thread, даже если вы не создавали воркер. Например, функции setTimeout или setInterval. Но стоит помнить, что любая функция, которая осуществляет подобное, является частью Web API, включая воркеры, так как ни одна сущность, реализуемая ядром V8, не дает сделать ничего подобного.

А какие особенности Event Loop знаете вы?

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍52
Всем привет!

В новой статье на Хабре мы углубились в тему Kotlin Coroutines — разобрали их основные концепции, способы работы с асинхронными операциями, управление потоком выполнения, обработку ошибок и исключений, а также многое другое. Получился очень полезный лонгрид.

Приятного чтения.
🔥15👍3😱2
Всем привет!

Как правильно ответить на вопрос «Что такое чистая функция?», если различные источники дают разные трактовки? Кажется, мы нашли лучшее определение этому понятию. Следите за ходом мысли.

Функция должна иметь только одну точку входа и только одну точку выхода из нее. Давайте назовем их ординарными, так как эти точки работают максимально ожидаемо. Следовательно, максимальная ожидаемая точка входа — это аргументы функции, а точка выхода — оператор return.

Почему только по одной точке на вход и выход?

Абсолютно любой другой вход в функцию — это использование внешних переменных, функций и т.д. — побочное действие.
Абсолютно любой другой выход из функции — присвоение значений внешним переменным, операции ввода/вывода, HTTP-запросы — побочное действие.

В итоге мы имеем следующее определение:

Чистая функция — это функция, которая имеет только одну ординарную точку входа (ее аргументы) и одну ординарную точку выхода (оператор return).

+1 понятие в вашу копилку.

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍21
Привет, друзья!

На прошлой неделе многие из вас справились с задачей по Event Loop 💪🏼 Сможете ли вы правильно ответить на сегодняшний вопрос?

Он ниже вместе с вариантами ответа👇🏻 Выбирайте.
👍102🤔1
Всем привет!

Давайте разберем вчерашний вопрос «Какой функциональный объект в JS можно назвать функтором?».

Правильный ответ — вариант № 2: объект, реализующий метод map.

Объясняем, почему.

Функтор в JS — это объект, который получает некие значения, преобразует их с помощью внутренней чистой функции и возвращает результат с аналогичной структурой данных. Среди наших вариантов ответа такой метод только один, и это — map.

Теперь давайте рассмотрим другие варианты.

Sort — изменяет входной массив, т.е. он не является чистой функцией.

Reduce — также может вернуть аналогичную структуру, но это не гарантированно, т.к. он более универсален.

Next — метод для передачи данных следующей итерации, и он не используется для преобразования.

Если остались еще вопросы, задавайте.

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥41🤔1
Привет, друзья!

🤔 Интересно, вы когда-нибудь слышали о методе requestIdleCallback?

Сегодня поговорим о нем.

⚫️Метод requestIdleCallback очень редко используется, но в некоторых моментах он может значительно оптимизировать ваш код. Его суть заключается в следующем: метод принимает в качестве первого аргумента колбэк, который ставит в очередь Task Queue, и этот колбэк выполняется, когда браузер находится в режиме простоя.

Другими словами, когда браузеру «нечего делать», он может взять функцию, переданную через requestIdleCallback, и выполнить ее, тем самым не мешая выполнению других задач, когда это необходимо.

⚫️Вторым аргументом он принимает дополнительные параметры, но пока реализован только один — timeout. В нем вы можете указать максимальное время (в миллисекундах), которое потребуется колбэку на выполнение. Если он не уложится в отведенное вами время, выполнение колбэка прервется.

Этот метод пока не поддерживается в Safari, но мы надеемся, что специалисты из Apple вскоре реализуют такую классную возможность.

@chulakov_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍204🔥4
Всем привет!

На рынке веб-разработки существует множество CMS с готовой административной панелью и набором базовых функций, таких как WordPress, 1C-Bitrix, Joomla и другие.

Но иногда требуется реализовать проект с индивидуальным дизайном и функционалом. В таком случае на помощь приходят Headless CMS. Они содержат серверную часть, API и базу данных, которая используется для хранения контента.

Одной из популярных Headless CMS с открытым исходным кодом является Strapi. Сегодня мы соберем свой образ для использования в проектах.

👉🏻 Читать пошаговую инструкцию

@chulakov_dev
🔥22👍43
Всем привет!

При разработке frontend-приложений важно учитывать ситуации, когда данные от backend еще не доступны. React Query и его хук useQuery предлагают инструменты для управления этим процессом.

Один из ключевых параметров, на который следует обратить внимание, — isLoading. Он показывает, выполняется ли запрос данных. Если обратиться к data без проверки isLoading, это может вызвать ошибку, так как данные могут быть еще недоступны.

const { isLoading, error, data } = useQuery('myData', fetchData);

Правильное использование isLoading включает проверку его значения перед применением данных, как показано в примере:

function MyComponent() {
const { isLoading, error, data } = useQuery('myData', fetchData);

if (isLoading) return 'Загрузка...';
if (error) return `Произошла ошибка: ${error.message}`;

return (
<div>
<h1>{data.noscript}</h1>
<p>{data.denoscription}</p>
</div>
);
}

Здесь, если isLoading = true, компонент просто отображает сообщение «Загрузка...», а использование данных начинается только после их успешной загрузки.

Вы можете думать, что проверка isLoading не всегда необходима и в некоторых случаях можно использовать опциональную цепочку (optional chaining). Однако это может быть опасно. Если данные еще не получены, а мы пытаемся передать их в компонент, ожидающий конкретные данные, это может привести к ошибке. Вот пример:

function MyOtherComponent({ noscript, denoscription }) {
return (
<div>
<h1>{noscript}</h1>
<p>{denoscription}</p>
</div>
);
}

function MyComponent() {
const { data } = useQuery('myData', fetchData);

return (
<MyOtherComponent noscript={data?.noscript} denoscription={data?.denoscription} />
);
}

В этом случае, если данные еще не получены, опциональная цепочка вернет undefined для data?.noscript и data?.denoscription, что может вызвать ошибку в MyOtherComponent.

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

@chulakov_dev
🔥17👍53🤔2
Привет!

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

Итак, внимание, вопрос! 👇🏻
👍10🔥4🤔3