uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

Frontend | Вопросы собесов

Frontend | Вопросы собесов

Відкрити в Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Показати більше

📈 Аналітичний огляд Telegram-каналу Frontend | Вопросы собесов

Канал Frontend | Вопросы собесов (@easy_javascript_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 17 337 підписників, посідаючи 7 467 місце в категорії Технології та додатки та 37 797 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 17 337 підписників.

За останніми даними від 05 листопада, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -286, а за останні 24 години на -4, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 6.64%. Протягом перших 24 годин після публікації контент зазвичай збирає 4.45% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 1 152 переглядів. Протягом першої доби публікація в середньому набирає 771 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, браузер, html, border, flex.

📝 Опис та контентна політика

Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Завдяки високій частоті оновлень (останні дані отримано 06 листопада, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

17 337
Підписники
-424 години
-967 днів
-28630 днів
Архів дописів
\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-12-29T09:10:13Z","dateModified":"2024-12-29T09:10:13Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3559},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":25}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru/posts/996","url":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru/posts/996","mainEntityOfPage":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru/posts/996","headline":"🤔 Зачем нам нужен менеджер состояния? Менеджер состояния используется для централизованного управления данным…","articleBody":"🤔 Зачем нам нужен менеджер состояния?\n\nМенеджер состояния используется для централизованного управления данными в приложении. Это упрощает обмен данными между компонентами, делает состояние приложения предсказуемым и упрощает отладку. Например, Vuex или Redux помогают управлять состоянием в сложных приложениях.\n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚 Базу знаний","datePublished":"2024-12-28T16:10:10Z","dateModified":"2024-12-28T16:10:10Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/uk/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3424},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":15},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}}]}
🤔 Из чего строится размер элемента? Размер элемента состоит из содержимого, внутренних отступов (padding), границ (border) и внешних отступов (margin). Суммарный размер зависит от используемой модели box-sizing. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как пользовался линтер js? Это инструменты, которые помогают разработчикам находить и устранять ошибки, улучшать стиль кода и обеспечивать соответствие кода определенным стандартам. Самый популярный линтер для JavaScript — это ESLint. 🚩Установка ESLint 1⃣Установка Node.js и npm Убедитесь, что у вас установлены Node.js и npm (Node Package Manager). Их можно скачать и установить с [официального сайта Node.js]. 2⃣Инициализация проекта Если у вас еще нет проекта, создайте новый с помощью команды:
npm init -y   
3⃣Установка ESLint Установите ESLint как dev-зависимость
npm install eslint --save-dev   
🚩Настройка ESLint 🟠Инициализация конфигурации ESLint Запустите команду для создания файла конфигурации .eslintrc:
npx eslint --init   
🚩Использование ESLint 🟠Линтинг кода Чтобы проверить ваш код с помощью ESLint, используйте команду
npx eslint имя_файла.js   
Например, если у вас есть файл app.js, выполните
npx eslint app.js   
🟠Автоматическое исправление ошибок ESLint может автоматически исправлять некоторые типы ошибок. Используйте флаг --fix, чтобы исправить ошибки, которые можно исправить автоматически:
npx eslint имя_файла.js --fix   
🟠Линтинг всего проекта Вы можете линтить все файлы в проекте, добавив скрипт в package.json. Откройте package.json и добавьте следующий скрипт в раздел "scripts":
"scripts": {
    "lint": "eslint ."
}  
Теперь вы можете запускать линтер для всего проекта с помощью команды
npm run lint
🚩Пример конфигурации .eslintrc.json Приведем пример базовой конфигурации для проекта, не использующего фреймворки
{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "rules": {
        "indent": ["error", 4],
        "linebreak-style": ["error", "unix"],
        "quotes": ["error", "single"],
        "semi": ["error", "always"]
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего служат vh и vw при указании размеров? vh и vw задают размеры элементов в процентах от высоты и ширины окна браузера соответственно. Они позволяют адаптировать элементы к размеру экрана. Используются для создания масштабируемого дизайна. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как обратиться к дом-дереву в реакте? В React обращаться к DOM-дереву можно несколькими способами, в зависимости от задач. Основные подходы включают использование рефов (refs) и манипуляции с элементами через стандартные методы JavaScript. 🟠Использование рефов (Refs) Рефы позволяют получить доступ к DOM-элементам напрямую. Это особенно полезно для управления фокусом, проигрывания медиа или интеграции с библиотеками сторонних разработчиков.
import React, { Component } from 'react';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }

  componentDidMount() {
    // Получаем доступ к DOM-элементу через реф
    this.myRef.current.focus();
  }

  render() {
    return <input type="text" ref={this.myRef} />;
  }
}

export default MyComponent;
Пример с использованием функционального компонента и хуков
import React, { useRef, useEffect } from 'react';

const MyComponent = () => {
  const myRef = useRef(null);

  useEffect(() => {
    // Получаем доступ к DOM-элементу через реф
    myRef.current.focus();
  }, []);

  return <input type="text" ref={myRef} />;
};

export default MyComponent;
🟠Манипуляции через стандартные методы JavaScript Иногда нужно обращаться к DOM-элементам, используя стандартные методы, такие как document.getElementById или document.querySelector. Это не рекомендуется, так как это противоречит философии React по работе с виртуальным DOM, но может быть полезно в некоторых случаях.
import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    const element = document.getElementById('my-element');
    element.style.color = 'red';
  }, []);

  return <div id="my-element">Hello, world!</div>;
};

export default MyComponent;
🟠Манипуляции через хуки React предлагает несколько хуков, которые могут быть использованы для управления жизненным циклом компонентов и обращения к DOM-элементам. useEffect: Хук для выполнения побочных эффектов. useLayoutEffect: Похож на useEffect, но выполняется синхронно после всех изменений DOM.
import React, { useRef, useLayoutEffect } from 'react';

const MyComponent = () => {
  const myRef = useRef(null);

  useLayoutEffect(() => {
    // Получаем доступ к DOM-элементу через реф
    myRef.current.style.color = 'blue';
  }, []);

  return <div ref={myRef}>Hello, world!</div>;
};

export default MyComponent;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое адаптивная верстка? Адаптивная верстка обеспечивает корректное отображение веб-страниц на экранах разных размеров, включая мобильные устройства и компьютеры. Используются медиа-запросы и гибкие единицы измерения для настройки элементов в зависимости от ширины экрана. Цель — создать удобный и функциональный интерфейс на всех устройствах. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что если микрозадача создаст еще микрозадачу? Когда микрозадача (microtask) создаёт другую микрозадачу, обе задачи будут выполнены в том же цикле событий (event loop), прежде чем будет обработано следующее макрозадача (macrotask). 🚩Как работает цикл событий 🟠Макрозадачи (macrotasks) Например, обработчики событий, setTimeout, setInterval. 🟠Микрозадачи (microtasks) Например, Promises, MutationObserver, process.nextTick (в Node.js). 🚩Последовательность выполнения 1⃣Выполняется макрозадача. 2⃣Обрабатываются все микрозадачи, пока очередь микрозадач не станет пустой. 3⃣Переход к следующей макрозадаче.
console.log('Start');

setTimeout(() => {
  console.log('Macrotask: setTimeout');
}, 0);

Promise.resolve()
  .then(() => {
    console.log('Microtask 1');
    Promise.resolve().then(() => {
      console.log('Microtask 2');
    });
  })
  .then(() => {
    console.log('Microtask 3');
  });

console.log('End');
🚩Ожидаемый результат console.log('Start') Выполняется сразу. console.log('End') Выполняется сразу после первого console.log. Очередь макрозадач ставит функцию из setTimeout. Очередь микрозадач добавляет первую микрозадачу из Promise.resolve().then(...). Вывод в консоли
Start
End
Microtask 1
Microtask 2
Microtask 3
Macrotask: setTimeout
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие проблемы решает React? React упрощает создание динамических интерфейсов, управляя состоянием и обновлением DOM через Virtual DOM. Он решает проблему сложного взаимодействия между компонентами, предоставляя декларативный подход. React также улучшает производительность благодаря оптимизированным обновлениям и повторному использованию компонентов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чего стоит и не стоит избегать в оптимизации сайта? 🟠Оптимизация изображений Сжатие без потери качества: Используйте инструменты, такие как TinyPNG или ImageOptim. Использование современных форматов: WebP и AVIF обеспечивают лучшее сжатие и качество. Lazy Loading: Загружайте изображения по мере их появления в области видимости пользователя. 🟠Минификация и объединение файлов Минификация: Уменьшайте размеры CSS, JavaScript и HTML-файлов с помощью инструментов, таких как UglifyJS и CSSNano. Объединение: Сокращайте количество HTTP-запросов, объединяя несколько файлов в один. 🟠Использование CDN (Content Delivery Network) Размещайте копии вашего сайта на серверах по всему миру, чтобы уменьшить задержки для пользователей из разных регионов. 🟠Кэширование На стороне клиента: Настройте заголовки кэширования HTTP. На стороне сервера: Используйте технологии, такие как Varnish или Nginx. 🟠Асинхронная загрузка и критический CSS Асинхронная загрузка: Используйте атрибуты async и defer для JavaScript. Критический CSS: Встраивайте важные стили прямо в HTML, чтобы ускорить начальную отрисовку страницы. 🟠Улучшение производительности сервера Сжатие данных: Включите gzip или Brotli. HTTP/2: Переходите на HTTP/2 для мультиплексирования запросов. 🟠Использование современных технологий Service Workers: Для офлайн-работы и улучшенного кэширования. Prefetching и Preloading: Предзагрузка и предзапросы ресурсов. 🟠Мониторинг и анализ Google Lighthouse, PageSpeed Insights: Используйте для анализа производительности. Реальное время: Применяйте Google Analytics, New Relic. 🚩Чего стоит избегать при оптимизации сайта 🟠Избегайте чрезмерной минимизации Читаемость кода: Минимизация без генерации карт кода (source maps) может усложнить отладку. 🟠Не используйте большие, несжатые изображения Размер файлов: Это замедляет загрузку и увеличивает потребление трафика пользователем. 🟠Не загружайте все ресурсы сразу Асинхронная загрузка: Используйте техники lazy loading и асинхронной загрузки. 🟠Не пренебрегайте кэшированием Отсутствие кэширования: Увеличивает время загрузки для повторных посещений. 🟠Избегайте блокирующих ресурсов JavaScript и CSS: Не блокируйте рендеринг страницы тяжелыми файлами. 🟠Не злоупотребляйте анимациями и большими скриптами Производительность: Сложные анимации и большие скрипты могут замедлить сайт, особенно на мобильных устройствах. 🟠Избегайте чрезмерного использования плагинов Нагрузки: Избыток плагинов может значительно замедлить сайт и создать проблемы с безопасностью. 🟠Не забывайте про оптимизацию для мобильных устройств Мобильная версия: Сайт должен быть оптимизирован для мобильных пользователей, так как большинство пользователей используют мобильные устройства. Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем используют Vuex? Используется для управления состоянием в приложениях на Vue.js. Он обеспечивает централизованное хранилище, позволяя всем компонентам обращаться к единому источнику данных. Это упрощает работу с состоянием, делает логику приложения предсказуемой и улучшает структуру кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Сколько есть способов что-то сделать асинхронно? В JavaScript существует несколько способов выполнения асинхронных операций. Основные из них включают коллбеки (callbacks), промисы (promises) и async/await. 🟠Коллбеки (Callbacks) Коллбеки были первым способом выполнения асинхронных операций в JavaScript. Это функции, которые передаются другим функциям в качестве аргументов и вызываются после завершения асинхронной операции.
function fetchData(callback) {
  setTimeout(() => {
    const data = "some data";
    callback(data);
  }, 1000);
}

fetchData((result) => {
  console.log(result);
});
Почему это нужно: Коллбеки позволяют выполнять код после завершения асинхронной задачи, например, загрузки данных с сервера. Как используется: Передаем функцию в качестве аргумента и вызываем её, когда данные готовы. Почему так: Это простой способ передать управление после завершения асинхронной операции, но может привести к "аду коллбеков" (callback hell) при множественных вложенных вызовах. 🟠Промисы (Promises) Промисы были введены для упрощения работы с асинхронным кодом и для решения проблемы вложенности, характерной для коллбеков. Промис представляет собой объект, который может находиться в одном из трёх состояний: ожидание (pending), выполнено (fulfilled) или отклонено (rejected).
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = "some data";
      resolve(data);
    }, 1000);
  });
}

fetchData().then((result) => {
  console.log(result);
}).catch((error) => {
  console.error(error);
});
Почему это нужно: Промисы делают код более читаемым и управляемым, особенно при наличии цепочек асинхронных операций. Как используется: Создаем новый промис и возвращаем его из функции. Затем используем методы then и catch для обработки результата или ошибки. Почему так: Промисы позволяют избежать вложенности и обеспечивают более линейный и понятный поток выполнения. 🟠async/await Это синтаксический сахар поверх промисов, который делает код ещё более читаемым и похожим на синхронный.
async function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      const data = "some data";
      resolve(data);
    }, 1000);
  });
}

async function main() {
  try {
    const result = await fetchData();
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

main();
Почему это нужно: async/await упрощает написание и чтение асинхронного кода, устраняя необходимость использования методов then и catch. Как используется: Объявляем функцию с ключевым словом async и используем await для ожидания завершения промиса. Почему так: async/await делает асинхронный код более похожим на синхронный, улучшая его читаемость и поддержку. Ставь 👍 и забирай 📚 Базу знаний

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

🤔 Что такое async/await? Это синтаксис для работы с асинхронными операциями в JavaScript, который упрощает управление промисами. Ключевое слово async делает функцию асинхронной, а await приостанавливает её выполнение до завершения промиса. Это позволяет писать асинхронный код, похожий на синхронный. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как значения box-size влияют на размер элемента? Значения свойства box-sizing в CSS определяют, как учитываются отступы (padding) и рамки (border) при расчете размера элемента (width и height). Это влияет на окончательные размеры и внешний вид элемента на странице. 🚩Значение content-box Это значение по умолчанию для всех элементов. Когда вы устанавливаете размеры элемента с box-sizing: content-box, ширина и высота элемента включают только содержимое (content), но не включают отступы и рамки.
.element {
    box-sizing: content-box; /* значение по умолчанию */
    width: 200px;
    padding: 20px;
    border: 10px solid black;
}
🚩Расчет размера 🟠Ширина 200px (содержимое) + 20px (отступ слева) + 20px (отступ справа) + 10px (рамка слева) + 10px (рамка справа) = 260px. 🟠Высота аналогично рассчитывается с учетом отступов и рамок сверху и снизу. 🚩Значение border-box При использовании значения border-box, размеры элемента (width и height) включают содержимое, отступы и рамки. Это делает расчет размеров более простым и предсказуемым.
.element {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 10px solid black;
}
🚩Расчет размера 🟠Ширина 200px уже включает отступы и рамки, то есть фактическая ширина содержимого будет 140px (200px - 20px (отступ слева) - 20px (отступ справа) - 10px (рамка слева) - 10px (рамка справа)). 🟠Высота аналогично, высота включает отступы и рамки. 🚩Пример для сравнения HTML
<div class="content-box">Content-box</div>
<div class="border-box">Border-box</div>
CSS
div {
    margin: 10px;
    padding: 20px;
    border: 10px solid black;
}

.content-box {
    box-sizing: content-box;
    width: 200px;
    height: 100px;
}

.border-box {
    box-sizing: border-box;
    width: 200px;
    height: 100px;
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужно замыкание? Это функция, которая "захватывает" переменные из своей внешней области видимости. Это позволяет сохранять данные между вызовами функции и реализовывать приватные переменные. Например, замыкания полезны для создания функций-генераторов или скрытия внутренних данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как оптимизировать сайт? Оптимизация сайта включает в себя несколько стратегий и техник, направленных на улучшение производительности, скорости загрузки и пользовательского опыта. 🟠Оптимизация изображений Используйте инструменты для сжатия изображений (например, TinyPNG, ImageOptim) без значительной потери качества. Используйте современные форматы изображений, такие как WebP, которые обеспечивают лучшее сжатие по сравнению с JPEG и PNG. Загружайте изображения по мере их появления в области видимости пользователя (атрибут loading="lazy" в HTML). 🟠Минификация и объединение файлов Уменьшите размер CSS, JavaScript и HTML-файлов с помощью инструментов, таких как UglifyJS, CSSNano, HTMLMinifier. Сократите количество HTTP-запросов, объединив несколько CSS или JavaScript файлов в один. 🟠Использование CDN (Content Delivery Network) Храните копии вашего сайта на серверах по всему миру, чтобы уменьшить время загрузки для пользователей из разных регионов. 🟠Кэширование Настройте заголовки кэширования HTTP, чтобы браузеры могли хранить копии статических ресурсов (CSS, JavaScript, изображения). Используйте технологии, такие как Varnish или Nginx, для кэширования страниц на сервере. 🟠Оптимизация CSS и JavaScript Используйте атрибуты async и defer для асинхронной загрузки JavaScript, чтобы не блокировать рендеринг страницы. Встраивайте критические стили прямо в HTML, чтобы ускорить начальную отрисовку страницы. 🟠Улучшение производительности сервера Включите сжатие gzip или Brotli на сервере для уменьшения размера передаваемых данных. Переход на HTTP/2, который поддерживает мультиплексирование запросов, позволяет загружать несколько ресурсов одновременно через одно соединение. 🟠Использование современных технологий Используйте Service Workers для создания прогрессивных веб-приложений (PWA), обеспечивающих офлайн-работу и улучшенное кэширование. Используйте техники предзагрузки (preload) и предзапросов (prefetch) для ресурсов, которые понадобятся в ближайшее время. 🟠Мониторинг и анализ Используйте Google Lighthouse, PageSpeed Insights и WebPageTest для анализа производительности и поиска узких мест. Применяйте сервисы, такие как Google Analytics, New Relic, для отслеживания реальной производительности и пользовательского опыта.
<img src="example.jpg" loading="lazy" alt="Пример изображения">
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое контекст? Это значение ключевого слова this, которое зависит от способа вызова функции. Он определяет, к какому объекту или окружению функция относится в момент выполнения. Контекст можно изменить с помощью методов call, apply и bind. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как отследить изменение поле объекта? Чтобы отслеживать изменения свойств объекта в JavaScript, можно использовать несколько методов, каждый из которых подходит для различных случаев. 🟠Использование Proxy Proxy является мощным и гибким способом перехвата и настройки операций с объектами, включая чтение и запись свойств.
const handler = {
    get(target, property) {
        console.log(`Getting value of ${property}`);
        return target[property];
    },
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        return true;
    }
};
const person = {
    name: 'Alice',
    age: 25
};
const proxyPerson = new Proxy(person, handler);
proxyPerson.name = 'Bob'; // Setting value of name to Bob
console.log(proxyPerson.name); // Getting value of name // Bob
🟠Использование Object.defineProperty Object.defineProperty позволяет определить новое или изменить существующее свойство непосредственно на объекте, позволяя добавить геттеры и сеттеры для отслеживания изменений.
const person = {
    _name: 'Alice',
    _age: 25
};
Object.defineProperty(person, 'name', {
    get() {
        console.log('Getting name');
        return this._name;
    },
    set(value) {
        console.log(`Setting name to ${value}`);
        this._name = value;
    }
});
Object.defineProperty(person, 'age', {
    get() {
        console.log('Getting age');
        return this._age;
    },
    set(value) {
        console.log(`Setting age to ${value}`);
        this._age = value;
    }
});
person.name = 'Bob'; // Setting name to Bob
console.log(person.name); // Getting name // Bob
person.age = 30; // Setting age to 30
console.log(person.age); // Getting age // 30
🟠Использование библиотеки MobX MobX — это библиотека для управления состоянием, которая делает состояния наблюдаемыми и автоматически синхронизирует их с пользовательским интерфейсом.
import { observable, autorun } from 'mobx';
const person = observable({
    name: 'Alice',
    age: 25,
    setName(name) {
        this.name = name;
    },
    setAge(age) {
        this.age = age;
    }
});
// Автоматически вызываемая функция при изменении наблюдаемого состояния
autorun(() => {
    console.log(`Name: ${person.name}, Age: ${person.age}`);
});
person.setName('Bob'); // Name: Bob, Age: 25
person.setAge(30); // Name: Bob, Age: 30
🟠Наблюдатель на изменение (MutationObserver) Для отслеживания изменений в DOM можно использовать MutationObserver. Это не напрямую связано с объектами, но полезно для отслеживания изменений в элементах DOM.
const targetNode = document.getElementById('target');
const config = { attributes: true, childList: true, subtree: true };
const callback = function(mutationsList, observer) {
    for(let mutation of mutationsList) {
        if (mutation.type === 'childList') {
            console.log('A child node has been added or removed.');
        }
        else if (mutation.type === 'attributes') {
            console.log('The ' + mutation.attributeName + ' attribute was modified.');
        }
    }
};
const observer = new MutationObserver(callback);
observer.observe(targetNode, config);
targetNode.setAttribute('data-test', 'value');
Ставь 👍 и забирай 📚 Базу знаний

🤔 Расскажи про гибридные приложения? Гибридные приложения сочетают элементы веб-приложений (HTML, CSS, JavaScript) и платформенно-зависимые компоненты. Они развёртываются как нативные приложения, но используют встроенные браузеры для отображения веб-контента. Такие приложения легче разрабатывать, но их производительность может быть ниже, чем у нативных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Отслеживаемые свойства, что такое, как использовать? В контексте разработки приложений, отслеживаемые свойства (observable properties) относятся к свойствам объектов, изменения которых можно отслеживать. Это полезно для автоматического обновления пользовательского интерфейса или выполнения других действий при изменении данных. В JavaScript для реализации отслеживаемых свойств часто используются библиотеки, такие как MobX, или встроенные механизмы, такие как Proxy. 🚩Использование Proxy для отслеживания свойств Встроенный объект Proxy в JavaScript позволяет перехватывать и настраивать операции, выполняемые с объектом, такие как чтение и запись свойств.
const handler = {
    get(target, property) {
        console.log(`Getting value of ${property}`);
        return target[property];
    },
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        return true;
    }
};
const person = {
    name: 'Alice',
    age: 25
};
const proxyPerson = new Proxy(person, handler);
proxyPerson.name = 'Bob'; // Setting value of name to Bob
console.log(proxyPerson.name); // Getting value of name // Bob
🚩Использование MobX для отслеживания свойств Это библиотека для управления состоянием, которая делает состояния наблюдаемыми и автоматически синхронизирует их с пользовательским интерфейсом. 1⃣Установка MobX
npm install mobx mobx-react
2⃣Пример использования MobX
import { observable, autorun } from 'mobx';
import { observer } from 'mobx-react';
import React from 'react';
import ReactDOM from 'react-dom';
const appState = observable({
    count: 0,
    increment() {
        this.count++;
    }
});
autorun(() => {
    console.log(`Count: ${appState.count}`);
});
appState.increment(); // Count: 1
appState.increment(); // Count: 2
const Counter = observer(() => (
    <div>
        <p>Count: {appState.count}</p>
        <button onClick={() => appState.increment()}>Increment</button>
    </div>
));
ReactDOM.render(<Counter />, document.getElementById('root'));
🚩Плюсы отслеживаемых свойств ➕Автоматическое обновление UI Изменения данных автоматически отражаются в пользовательском интерфейсе. ➕Централизованное управление состоянием Легче управлять состоянием и следить за его изменениями. ➕Повышенная производительность При правильной настройке обновляются только те части интерфейса, которые зависят от измененных данных. 🚩Примеры реального использования Простой счетчик с использованием Proxy
const handler = {
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        document.getElementById(property).innerText = value;
        return true;
    }
};
const state = {
    count: 0
};
const proxyState = new Proxy(state, handler);

document.getElementById('increment').addEventListener('click', () => {
    proxyState.count++;
});
<div>
    <p id="count">0</p>
    <button id="increment">Increment</button>
</div>
<script src="path/to/your/script.js"></script>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нам нужен менеджер состояния? Менеджер состояния используется для централизованного управления данными в приложении. Это упрощает обмен данными между компонентами, делает состояние приложения предсказуемым и упрощает отладку. Например, Vuex или Redux помогают управлять состоянием в сложных приложениях. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний