#frontend #template #javascript
📈 Шаблоны для эффективной работы с DOM с помощью <template>
В современных веб-приложениях важны производительность и удобство работы с DOM. Элемент <template> позволяет создавать невидимые шаблоны, которые можно многократно использовать для динамической генерации интерфейса.
📌 Что это такое?
Элемент <template> — это контейнер для HTML-разметки, которая не отображается на странице сразу, а существует как часть DOM. Она активируется только при явном вызове через JavaScript. Это полезно для создания однотипных элементов, таких как карточки, списки, модальные окна.
📌 Как с этим работать?
📖 Определение шаблона: внутри <template> можно хранить HTML-код, включая стили и скрипты.
📖 Клонирование: с помощью метода .content.cloneNode() шаблон копируется и добавляется в DOM.
📖 Инкапсуляция логики: шаблоны можно использовать с Web Components, что делает код более модульным и переиспользуемым.
📌 Где применяется?
📖 Компоненты пользовательского интерфейса: карточки товаров, списки задач.
📖 Повышение производительности: шаблоны рендерятся быстрее, так как не требуют повторной работы браузера с DOM.
📖 Работа с Web Components: для создания модульных элементов интерфейса.
Пример:
👍 Платформа
В современных веб-приложениях важны производительность и удобство работы с DOM. Элемент <template> позволяет создавать невидимые шаблоны, которые можно многократно использовать для динамической генерации интерфейса.
Элемент <template> — это контейнер для HTML-разметки, которая не отображается на странице сразу, а существует как часть DOM. Она активируется только при явном вызове через JavaScript. Это полезно для создания однотипных элементов, таких как карточки, списки, модальные окна.
Пример:
<template id="card-template">
<div class="card">
<h3></h3>
</div>
</template>
<script>
const template = document.querySelector('#card-template').content;
const clone = template.cloneNode(true);
clone.querySelector('h3').textContent = "Заголовок";
document.body.appendChild(clone);
</script>
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🔥1
#javascript #arraymethods
❓ Находитесь на этапе изучения JavaScript?
Cоветую к прочтению данную статью. Она освещает 10 ключевых методов работы с массивами в JavaScript, таких как
Эти функции помогают эффективно обрабатывать данные, сокращают объем кода и улучшают производительность. Также рассматриваются продвинутые приемы, включая цепочку методов и функциональное программирование.
В ней вы сможете найти советы по повышению производительности и правильной обработке ошибок для создания более гибкого и эффективного кода.
✔️ Читать
👍 Платформа
Cоветую к прочтению данную статью. Она освещает 10 ключевых методов работы с массивами в JavaScript, таких как
forEach(), map(), filter(), reduce(), и других. Эти функции помогают эффективно обрабатывать данные, сокращают объем кода и улучшают производительность. Также рассматриваются продвинутые приемы, включая цепочку методов и функциональное программирование.
В ней вы сможете найти советы по повышению производительности и правильной обработке ошибок для создания более гибкого и эффективного кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
NOP::Nuances of programming
10 ключевых функций массивов JavaScript
Умение эффективно работать массивами в JavaScript - одно из отличий профессионала от новичка. Изучите 10 основных методов массивов, чтобы подняться на новый уровень веб-разработки: создавать более понятный, эффективный и гибкий код, который позволит работать…
#javascript #book
📘 Паттерны проектирования jаvascript
Практическое руководство по применению популярных паттернов проектирования в JavaScript, таких как:
Модуль, Наблюдатель, Стратегия, Фабрика и Декоратор.
Автор объясняет, как эти паттерны помогают улучшить структуру кода, масштабируемость приложений и решение сложных задач.
✏️ Книга помогает:
🔸 Изучить популярные паттерны проектирования и их применение в JavaScript.
▫️ Улучшить структуру и читаемость кода.
🔸 Решать типичные задачи разработки с помощью проверенных решений.
▫️ Повышает эффективность работы с кодом, облегчая его поддержку и расширение.
🔸 Помогает улучшить навыки рефакторинга и оптимизации.
Книга в комментариях⬇️
👍 Платформа
Практическое руководство по применению популярных паттернов проектирования в JavaScript, таких как:
Модуль, Наблюдатель, Стратегия, Фабрика и Декоратор.
Автор объясняет, как эти паттерны помогают улучшить структуру кода, масштабируемость приложений и решение сложных задач.
Книга в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#JavaScript #WebSocket #HTTP2
Как работает WebSocket и HTTP/2 + SSE. Что выбрать?
Современные веб-приложения требуют эффективной и безопасной коммуникации между клиентом и сервером. Среди популярных технологий выделяются WebSocket, HTTP/2 и SSE. Разберем их особенности и поможем определиться с выбором.
✔️ WebSocket: быстрые двусторонние соединения
WebSocket обеспечивает двустороннюю связь между браузером и сервером через постоянное соединение.
- Протокол основан на фреймах, что снижает нагрузку на систему.
- Включает механизмы указания размера полезной нагрузки и структуры данных.
- Подходит для приложений, где важна мгновенная передача данных, например, чаты или онлайн-игры.
✔️ HTTP/2 + SSE: асинхронные данные и оптимизация
HTTP/2 предоставляет технологию Server Push, позволяющую серверу отправлять данные в клиентский кэш без запроса. SSE (Server-Sent Events) работает через асинхронные однонаправленные соединения:
- Подходит для потоков данных, например, ленты новостей или обновлений биржевых котировок.
- Простота реализации, но есть ограничение на одно соединение на вкладку браузера.
❓ Как выбрать?
Выбор протокола зависит от задач проекта:
- Если нужна двусторонняя связь в реальном времени — используйте WebSocket.
- Для передачи потоковых данных или серверных обновлений с меньшей сложностью — HTTP/2 + SSE.
Также учитывайте поддержку технологий браузерами и серверными компонентами. Правильный выбор протокола улучшит производительность, безопасность и удобство использования приложения.
🔗 Источник
👍 Платформа
Как работает WebSocket и HTTP/2 + SSE. Что выбрать?
Современные веб-приложения требуют эффективной и безопасной коммуникации между клиентом и сервером. Среди популярных технологий выделяются WebSocket, HTTP/2 и SSE. Разберем их особенности и поможем определиться с выбором.
WebSocket обеспечивает двустороннюю связь между браузером и сервером через постоянное соединение.
- Протокол основан на фреймах, что снижает нагрузку на систему.
- Включает механизмы указания размера полезной нагрузки и структуры данных.
- Подходит для приложений, где важна мгновенная передача данных, например, чаты или онлайн-игры.
HTTP/2 предоставляет технологию Server Push, позволяющую серверу отправлять данные в клиентский кэш без запроса. SSE (Server-Sent Events) работает через асинхронные однонаправленные соединения:
- Подходит для потоков данных, например, ленты новостей или обновлений биржевых котировок.
- Простота реализации, но есть ограничение на одно соединение на вкладку браузера.
Выбор протокола зависит от задач проекта:
- Если нужна двусторонняя связь в реальном времени — используйте WebSocket.
- Для передачи потоковых данных или серверных обновлений с меньшей сложностью — HTTP/2 + SSE.
Также учитывайте поддержку технологий браузерами и серверными компонентами. Правильный выбор протокола улучшит производительность, безопасность и удобство использования приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#JavaScript
Сравнение методов require() и import() в JavaScript
1️⃣ require()
Метод require() представляет собой встроенную функцию среды исполнения Node.js, предназначенную для подключения внешних модулей. Данный метод функционирует в синхронном режиме и обеспечивает возможность вызова из любой точки программного кода. Следует отметить поддержку условных вызовов.
Пример использования:
2️⃣ import()
Метод import() является компонентом стандарта ECMAScript модулей, функционирующим в асинхронном режиме. При статическом использовании размещение данного метода ограничено начальной частью файла. Необходимо учитывать возможность динамической загрузки с применением оператора await.
Пример использования:
3️⃣ Различия методов
Позиционирование в коде
- require(): допустимо размещение в любой части кода
- import(): при статическом вызове допустимо размещение исключительно в начале файла
Характеристики производительности
- require(): характеризуется блокировкой процесса выполнения
- import(): реализует асинхронное выполнение, что обуславливает повышенную эффективность в крупномасштабных проектах
Условное применение
- require(): полностью поддерживает условные конструкции
- import(): условное применение возможно исключительно в динамическом варианте с оператором await
4️⃣ Рекомендации
Применение метода require() целесообразно в:
- проектах Node.js малого и среднего масштаба
- обособленных серверных скриптах
- модулях, требующих условного подключения
Применение метода import() рекомендуется для:
- современных веб-приложений
- проектов, ориентированных на стандарты ECMAScript
- систем, требующих оптимизации производительности
🎙 Новости
📝 База вопросов
Сравнение методов require() и import() в JavaScript
Метод require() представляет собой встроенную функцию среды исполнения Node.js, предназначенную для подключения внешних модулей. Данный метод функционирует в синхронном режиме и обеспечивает возможность вызова из любой точки программного кода. Следует отметить поддержку условных вызовов.
Пример использования:
var module = require('module-name');
if(условие) {
const специфическийМодуль = require('./специфическийМодуль.js');
}
Метод import() является компонентом стандарта ECMAScript модулей, функционирующим в асинхронном режиме. При статическом использовании размещение данного метода ограничено начальной частью файла. Необходимо учитывать возможность динамической загрузки с применением оператора await.
Пример использования:
import модуль from 'имя-модуля';
// Динамическая загрузка
let компонент = await import('./компонент.js');
Позиционирование в коде
- require(): допустимо размещение в любой части кода
- import(): при статическом вызове допустимо размещение исключительно в начале файла
Характеристики производительности
- require(): характеризуется блокировкой процесса выполнения
- import(): реализует асинхронное выполнение, что обуславливает повышенную эффективность в крупномасштабных проектах
Условное применение
- require(): полностью поддерживает условные конструкции
- import(): условное применение возможно исключительно в динамическом варианте с оператором await
Применение метода require() целесообразно в:
- проектах Node.js малого и среднего масштаба
- обособленных серверных скриптах
- модулях, требующих условного подключения
Применение метода import() рекомендуется для:
- современных веб-приложений
- проектов, ориентированных на стандарты ECMAScript
- систем, требующих оптимизации производительности
Please open Telegram to view this post
VIEW IN TELEGRAM
#JavaScript
🔖 JavaScript массивы медленные? Хэш-таблицы решают проблему производительности за O(1)
Пока разработчики перебирают массивы циклами, умные используют хэш-таблицы для мгновенного доступа к данным. Google Maps, Netflix, Instagram строят поиск на хэшировании, а не на линейном переборе.
Время сложности O(n) убивает UX в реальном времени.
📎 Что происходит прямо сейчас:
Google Maps — поиск адресов среди миллиардов записей за миллисекунды. Хэш-таблицы индексируют координаты по ключам локаций.
Netflix — рекомендации для 260M+ пользователей в реальном времени. Хэширование по user_id + content_id дает O(1) доступ к предпочтениям.
Instagram — поиск по хэштегам среди триллионов постов. Hash-функции превращают #travel в точный адрес в памяти.
📎 Проблемы массивов в production:
Linear Search Horror
Insertion Performance
Вставка в массив требует сдвига всех элементов. В хэш-таблице — просто хэширование ключа и запись по адресу.
Memory Overhead
Динамические массивы удваиваются при переполнении. Хэш-таблицы выделяют память точечно по мере необходимости.
📎 Архитектура хэш-таблиц:
Hash Function
Преобразует ключ в индекс массива за константное время.
Collision Resolution
Когда два ключа дают одинаковый хэш — используется chaining (цепочки) или open addressing.
Key-Value Storage
📎 Реальные кейсы оптимизации:
• Database Indexing — хэш-индексы для мгновенного поиска записей
• Caching Systems — Redis использует хэш-структуры для кэширования
• Browser Engines — DOM элементы индексируются по ID через хэширование
• SessionStack — анализ пользовательских сессий с O(1) доступом к данным
Выбор структуры данных определяет масштабируемость продукта. O(n) поиск убивает производительность при росте пользователей.
📎 Статья
🎙 Новости
📝 База вопросов
Пока разработчики перебирают массивы циклами, умные используют хэш-таблицы для мгновенного доступа к данным. Google Maps, Netflix, Instagram строят поиск на хэшировании, а не на линейном переборе.
Время сложности O(n) убивает UX в реальном времени.
Google Maps — поиск адресов среди миллиардов записей за миллисекунды. Хэш-таблицы индексируют координаты по ключам локаций.
Netflix — рекомендации для 260M+ пользователей в реальном времени. Хэширование по user_id + content_id дает O(1) доступ к предпочтениям.
Instagram — поиск по хэштегам среди триллионов постов. Hash-функции превращают #travel в точный адрес в памяти.
Linear Search Horror
// O(n) - перебор всех элементов
users.find(user => user.id === targetId)
// O(1) - прямой доступ по ключу
usersMap[targetId]
Insertion Performance
Вставка в массив требует сдвига всех элементов. В хэш-таблице — просто хэширование ключа и запись по адресу.
Memory Overhead
Динамические массивы удваиваются при переполнении. Хэш-таблицы выделяют память точечно по мере необходимости.
Hash Function
hash = (key.charCodeAt(i) * i) % tableSize
Преобразует ключ в индекс массива за константное время.
Collision Resolution
Когда два ключа дают одинаковый хэш — используется chaining (цепочки) или open addressing.
Key-Value Storage
hashTable["user_123"] = userData // O(1)
const user = hashTable["user_123"] // O(1)
• Database Indexing — хэш-индексы для мгновенного поиска записей
• Caching Systems — Redis использует хэш-структуры для кэширования
• Browser Engines — DOM элементы индексируются по ID через хэширование
• SessionStack — анализ пользовательских сессий с O(1) доступом к данным
Выбор структуры данных определяет масштабируемость продукта. O(n) поиск убивает производительность при росте пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#JavaScript
🔖 Почему ваш JavaScript-бандлер весит как три полнометражных фильма?
Вы загрузили приложение, добавили ещё библиотек, и вот уже бандлер весит 500KB вместо 100KB. Пользователи ждут загрузки 5 секунд вместо 1 секунды. Приложение работает, но медленно. Каждый килобайт JS — это время парсинга, выполнения, разборки браузером. На мобильнике это значит батарея сливается, страница зависает, пользователи уходят к конкурентам.
Основные проблемы раздутого бандлера:
🔸 Дольше загружается на мобильных сетях (LTE, 3G)
🔸 Браузер парсит и выполняет больше кода — замораживает UI
🔸 На слабых устройствах всё работает медленнее, батарея быстрее сливается
🔸 Поисковики штрафуют за низкую производительность, рейтинг падает
Раздутый бандлер — это не просто цифра на диске. Это деньги компании (CDN трафик), разочарование пользователя (медленная загрузка), потерянные конверсии (люди ушли, не дождались).
✅ Как уменьшить бандлер:
1. Аудит зависимостей — используйте webpack-bundle-analyzer, посмотрите что там. Может быть, импортируете тяжелую библиотеку для одной функции?
2. Code splitting — разделите на чанки, загружайте по требованию. React.lazy(), динамический импорт для маршрутов.
3. Tree-shaking — удаляйте неиспользуемый код. ES модули помогают бандлеру определить, что не нужно.
4. Минификация — Terser, Gzip/Brotli. Просто сжимайте код, функциональность не меняется.
5. Server-side rendering — переложите вычисления на сервер вместо клиента. Меньше JS в браузере = быстрее загружается.
❌ Избегайте:
- Импорта целых библиотек для одной функции
- Неиспользуемого кода (закомментированные куски месячной давности)
- Отключенного tree-shaking в production сборке
- Только клиентского рендеринга для статического контента
Каждый килобайт имеет значение. Производительность = пользовательский опыт = конверсии.
📎 Статья
🎙 Новости
📝 База вопросов
Вы загрузили приложение, добавили ещё библиотек, и вот уже бандлер весит 500KB вместо 100KB. Пользователи ждут загрузки 5 секунд вместо 1 секунды. Приложение работает, но медленно. Каждый килобайт JS — это время парсинга, выполнения, разборки браузером. На мобильнике это значит батарея сливается, страница зависает, пользователи уходят к конкурентам.
// Плохо - импортируете всё, используете мало
import _ from 'lodash'; // 70KB, нужна одна функция
import * as echarts from 'echarts'; // 1MB для одного графика
import UILibrary from 'heavy-ui-kit'; // 200KB со всеми компонентами
// Хорошо - импортируйте только нужное
import { debounce } from 'lodash-es'; // Tree-shaking, 2KB
import { BarChart } from 'lightweight-charts'; // 50KB, минимум
import { Button, Input } from '@headlessui/react'; // Tree-shaking, 10KB
Основные проблемы раздутого бандлера:
Раздутый бандлер — это не просто цифра на диске. Это деньги компании (CDN трафик), разочарование пользователя (медленная загрузка), потерянные конверсии (люди ушли, не дождались).
1. Аудит зависимостей — используйте webpack-bundle-analyzer, посмотрите что там. Может быть, импортируете тяжелую библиотеку для одной функции?
2. Code splitting — разделите на чанки, загружайте по требованию. React.lazy(), динамический импорт для маршрутов.
3. Tree-shaking — удаляйте неиспользуемый код. ES модули помогают бандлеру определить, что не нужно.
4. Минификация — Terser, Gzip/Brotli. Просто сжимайте код, функциональность не меняется.
5. Server-side rendering — переложите вычисления на сервер вместо клиента. Меньше JS в браузере = быстрее загружается.
- Импорта целых библиотек для одной функции
- Неиспользуемого кода (закомментированные куски месячной давности)
- Отключенного tree-shaking в production сборке
- Только клиентского рендеринга для статического контента
Каждый килобайт имеет значение. Производительность = пользовательский опыт = конверсии.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#Собес #javascript #dom #events
🤔 Как подписаться на событие клика кнопки в DOM?
💬 Кратко:
Используйте метод
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Все для прокачки навыков:
✅ Анонсы → канал
✅ Комьюнити → чат
✅ База задач и вопросов → платформа
🤔 Как подписаться на событие клика кнопки в DOM?
💬 Кратко:
Используйте метод
addEventListener для подписки на событие click:document.querySelector('button').addEventListener('click', () => {
console.log('Кнопка нажата!');
});📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Все для прокачки навыков:
✅ Анонсы → канал
✅ Комьюнити → чат
✅ База задач и вопросов → платформа
👍1
🧑💻 Вопросы с собесов для Node.js Разработчика
1. Как работает Jest под капотом (разница между jsdom и браузером)?
Jest использует
2. Почему MutationObserver использует микротаски в Event Loop?
3. Как избежать переполнения кэша?
Можно ограничивать размер кэша и удалять старые записи по принципу LRU (Least Recently Used) или по времени жизни (TTL). Также важно периодически очищать кэш.
4. Как реализовать кэширование данных без библиотек?
Кэширование можно реализовать с помощью объекта или
5. Какие хранилища подходят для больших данных (LocalStorage, IndexedDB)?
Для больших объемов данных лучше использовать
#jest #jsdom #testing #javascript #mutationobserver #event_loop #cache #lru #ttl #map #localstorage #indexeddb
1. Как работает Jest под капотом (разница между jsdom и браузером)?
Jest использует
jsdom для эмуляции браузерного окружения в Node.js. Это значит, что тесты могут работать с DOM-методами без запуска реального браузера, но не все браузерные API полностью поддерживаются, и поведение может немного отличаться.2. Почему MutationObserver использует микротаски в Event Loop?
MutationObserver выполняет свои колбэки в микротасках, чтобы изменения DOM обрабатывались сразу после текущей задачи, но до рендеринга и макротасков. Это позволяет быстро реагировать на изменения, сохраняя высокую производительность.3. Как избежать переполнения кэша?
Можно ограничивать размер кэша и удалять старые записи по принципу LRU (Least Recently Used) или по времени жизни (TTL). Также важно периодически очищать кэш.
4. Как реализовать кэширование данных без библиотек?
Кэширование можно реализовать с помощью объекта или
Map, сохраняя данные по ключу и возвращая их при повторных запросах. Это снижает количество повторных вычислений или запросов к серверу.5. Какие хранилища подходят для больших данных (LocalStorage, IndexedDB)?
Для больших объемов данных лучше использовать
IndexedDB, так как оно поддерживает асинхронную работу и хранение структурированных объектов. LocalStorage подходит для небольших объемов (до ~5 МБ) и синхронных операций.#jest #jsdom #testing #javascript #mutationobserver #event_loop #cache #lru #ttl #map #localstorage #indexeddb
#Собес #javascript #dom #events
🤔 Как подписаться на событие клика кнопки в DOM?
💬 Кратко:
Используйте метод
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Все для прокачки навыков:
✅ Анонсы → канал
✅ Комьюнити → чат
✅ База задач и вопросов → платформа
🤔 Как подписаться на событие клика кнопки в DOM?
💬 Кратко:
Используйте метод
addEventListener для подписки на событие click:document.querySelector('button').addEventListener('click', () => {
console.log('Кнопка нажата!');
});📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Все для прокачки навыков:
✅ Анонсы → канал
✅ Комьюнити → чат
✅ База задач и вопросов → платформа
👍1