Telegram Web
🥾 Первый шаг в Angular - создаем приложение с нуля

Вводное знакомство с Angular - современным фреймворком для разработки веб-приложений. Мы расскажем о его основных концепциях, структуре и возможностях.

👉 Какие ключевые темы и вопросы будут рассмотрены на вебинаре?
- Что такое Angular и зачем он нужен
- Основные компоненты Angular:Модули, компоненты, директивы, пайпы, сервисы
- Работа с данными: привязка данных (data binding)
- Основы маршрутизации (routing)
- Простая форма и валидация
- Как запустить и протестировать приложение
- Какие результаты и навыки получат участники после вебинара?
Бесплатный вебинар проходит в рамках курса “Angular Developer“

Регистрация и подробнее о курсе Angular Developer - https://vk.cc/cNmlMM

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌Подборка полезных функций, которые пригодятся продвинутым frontend-разработчикам при работе с UI, производительностью и архитектурой


1. Throttle

Контролирует частоту вызова функции, полезно для scroll/resize-событий.


function throttle(fn: Function, delay: number) {
let last = 0;
return (...args: any[]) => {
const now = Date.now();
if (now - last >= delay) {
last = now;
fn(...args);
}
};
}



2. Debounce

Откладывает выполнение функции до окончания серии вызовов.


function debounce(fn: Function, delay: number) {
let timeout: ReturnType<typeof setTimeout>;
return (...args: any[]) => {
clearTimeout(timeout);
timeout = setTimeout(() => fn(...args), delay);
};
}



3. Deep Clone (без structuredClone)


function deepClone<T>(obj: T): T {
return JSON.parse(JSON.stringify(obj));
}


Подходит для простых объектов, не содержащих функций, дат и т.п.



4. Safe Access (Optional Chaining + Fallback)


function get<T>(obj: any, path: string, fallback?: T): T {
return path.split('.').reduce((acc, key) => acc?.[key], obj) ?? fallback;
}



5. Wait (async delay)


function wait(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}



6. Generate UUID v4


function uuidv4() {
return crypto.randomUUID(); // нативно в современных браузерах
}



7. Copy to Clipboard


async function copyToClipboard(text: string) {
try {
await navigator.clipboard.writeText(text);
} catch {
const textarea = document.createElement('textarea');
textarea.value = text;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
}



8. Detect Outside Click (для dropdown/modals)


function onClickOutside(element: HTMLElement, callback: () => void) {
function handler(event: MouseEvent) {
if (!element.contains(event.target as Node)) {
callback();
}
}
document.addEventListener('click', handler);
return () => document.removeEventListener('click', handler); // для очистки
}



9. Download File from Blob


function downloadBlob(blob: Blob, filename: string) {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
}



10. Dynamic Script Loader (например, для внешних SDK)


function loadScript(src: string): Promise<void> {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.async = true;
script.onload = () => resolve();
script.onerror = () => reject(new Error(`Failed to load ${src}`));
document.head.appendChild(script);
});
}


👉 @frontend_1
👍102
Как выжить в мире сложных интерфейсов в 2025-м: 7 работающих рецептов от React и CSS до дизайн-систем

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

Для МойОфис как мультипродуктовой экосистемы со сквозными сценариями — все эти вопросы очень актуальны! Поэтому на прошлой неделе JS-еры, дизайнеры и UX-исследователи нашей и других компаний собрались на митапе под названием Frontend&UX Talks, чтобы обсудить вопросы современного веба. Получилось интересно, драйвово и даже сказочно! (И я в прямом смысле этого слова :-))

В статье расскажем в 7 тезисах, к каким выводам пришли и как именно: поехали!

https://habr.com/ru/companies/ncloudtech/articles/924704/

👉 @frontend_1
👍51
🚀 Упростите разработку с Vue: создаём игру за 1 вебинар

🔥Присоединяйтесь к открытому вебинару 16 июля в 20:00 мск., где мы покажем, как Vue упрощает разработку и делает её быстрее, чем привычный React.

На открытом уроке разберём:
🔹 как устроена реактивность во Vue через ref и в чём её отличие от useState в React;
🔹 управление логикой интерфейса с помощью v-if, v-model и событий;
🔹 как работать с таймерами, анимациями и рендерингом без сторонних библиотек;
🔹 пошаговое создание игры: от таймера и счёта до анимаций и рестарта;
🔹 почему Vue — это не только для новичков, а для тех, кто ценит чистоту, контроль и скорость разработки.

Не упустите шанс взглянуть на Vue в бою!

👉Регистрируйтесь: https://vk.cc/cNx7D9

Бесплатное занятие приурочено к старту курса “Vue.js разработчик”, на котором можно глубже погрузиться в особенности фреймворка, научиться работать с его инструментами и создавать реальные проекты.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
2
This media is not supported in your browser
VIEW IN TELEGRAM
Совет по CSS 💡

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

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

Вот как это исправить

👉 @frontend_1
👍6
Forwarded from React
🔥9 полезных функций и хуков, которые пригодятся продвинутому React-разработчику для управления состоянием, оптимизацией и архитектурой компонентов


1. useDebounce

Позволяет "отложить" значение — полезно для ввода/поиска.


import { useEffect, useState } from 'react';

export function useDebounce<T>(value: T, delay = 300): T {
const [debounced, setDebounced] = useState(value);

useEffect(() => {
const timer = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);

return debounced;
}



2. usePrevious

Возвращает предыдущее значение пропа или стейта.


import { useRef, useEffect } from 'react';

export function usePrevious<T>(value: T): T | undefined {
const ref = useRef<T>();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
}



3. useOnClickOutside

Закрытие модалок, дропдаунов при клике вне.


import { useEffect } from 'react';

export function useOnClickOutside(ref: React.RefObject<HTMLElement>, handler: () => void) {
useEffect(() => {
const listener = (e: MouseEvent) => {
if (!ref.current || ref.current.contains(e.target as Node)) return;
handler();
};
document.addEventListener('mousedown', listener);
return () => document.removeEventListener('mousedown', listener);
}, [ref, handler]);
}



4. useIsMounted

Помогает избежать обновления состояния после размонтирования.


import { useEffect, useRef } from 'react';

export function useIsMounted() {
const ref = useRef(false);
useEffect(() => {
ref.current = true;
return () => { ref.current = false; };
}, []);
return ref;
}



5. useEventCallback

Запоминает последнюю версию колбэка без повторного рендера.


import { useRef, useCallback } from 'react';

export function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {
const ref = useRef(fn);
ref.current = fn;
return useCallback((...args: any[]) => ref.current(...args), []) as T;
}



6. useAsync

Асинхронный вызов с контролем загрузки, ошибок и результата.


import { useState, useCallback } from 'react';

export function useAsync<T>(asyncFn: () => Promise<T>) {
const [loading, setClick Me Load More] = useState(false);
const [data, setData] = useState<T | null>(null);
const [error, setError] = useState<unknown>(null);

const run = useCallback(async () => {
setClick Me Load More(true);
setError(null);
try {
const result = await asyncFn();
setData(result);
} catch (e) {
setError(e);
} finally {
setClick Me Load More(false);
}
}, [asyncFn]);

return { loading, data, error, run };
}



7. useLocalStorage

Простой хук для хранения данных в localStorage.


import { useState, useEffect } from 'react';

export function useLocalStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(() => {
const json = localStorage.getItem(key);
return json ? JSON.parse(json) : initial;
});

useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);

return [value, setValue] as const;
}



8. useMediaQuery

Работа с медиа-запросами в React без CSS.


import { useEffect, useState } from 'react';

export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(() => window.matchMedia(query).matches);

useEffect(() => {
const media = window.matchMedia(query);
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [query]);

return matches;
}



9. useToggle

Бинарный переключатель состояния (on/off).


import { useCallback, useState } from 'react';

export function useToggle(initial = false) {
const [state, setState] = useState(initial);
const toggle = useCallback(() => setState(prev => !prev), []);
return [state, toggle] as const;
}


✍️ @React_lib
👍3🔥31🤪1
Введение в Angular: основы и практические навыки

В ходе занятия познакомимся с основными концепциями Angular, разберем его ключевые компоненты и научимся создавать интерактивные и структурированные приложения. Что такое модули, компоненты, директивы, пайпы и сервисы, а также освоите работу с данными через привязку, настроите маршрутизацию и создадите простую форму с валидацией.

👉Какие ключевые темы и вопросы будут рассмотрены на вебинаре?
- Поймут, как устроен Angular и как с ним работать.
- Сумеют самостоятельно создать простое одностраничное приложение.
- Освоят основы архитектуры приложения: компоненты, модули и маршруты.
- Получат опыт настройки форм и базовой проверки данных.
- Будут готовы к дальнейшему изучению Angular и построению полноценных проектов.

Бесплатный вебинар проходит в рамках курса “Angular Developer“

Регистрация и подробнее о курсе Angular Developer - https://vk.cc/cNzyP1

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1
This media is not supported in your browser
VIEW IN TELEGRAM
Как работает комбинация clip + mask:

- маска применяется к контейнеру с использованием соответствующего изображения клавиши, чтобы изображение обрезалось при смещении (translate)

- clip применяется к контейнеру, чтобы зона взаимодействия (hit area) не перекрывала другие клавиши 🧑‍🍳

👉 @frontend_1
👍14
💡 HTML Tip: Скачивание файлов одной строкой

Хочешь, чтобы пользователь скачивал файл по клику? Просто добавь атрибут download к ссылке:

<a href="/images/logo.svg" download="codewithshripal-logo.svg">Download File</a>

📌 Что важно знать:

– download — указывает браузеру, что нужно не открыть файл, а скачать его
– Можно задать имя файла прямо в атрибуте
– Работает только с ресурсами того же источника (same-origin)
– Поддерживает blob: и data: ссылки для скачивания сгенерированного контента

🔍 Важно: имя из download будет использоваться только если сервер не задал своё имя в заголовке Content-Disposition.

👉 @frontend_1
🤝5👍3
Разработчик воссоздал LisaOS в виде веб-приложения

Разработчик Эндрю Ярос (Andrew Yaros) выпустил веб-версию операционной системы Lisa Office System.

У Яроса есть физическая версия Lisa 2/10, и он хотел повторить её операционную систему, чтобы пользователи могли погрузиться в ретротехнологии прямо в браузере. Веб-версия LisaOS написана с нуля на JavaScript. Автор проект подчёркивает, что это не эмулятор и не CSS-скин — система написана с нуля и с использованием современных веб-технологий.

Также Ярос рассказал, что весь интерфейс рендерится в одном элементе <canvas>. Автор проекта хотел добиться одинакового отображения элементов на разных разрешениях экрана, но из-за особенностей работы DOM и CSS этого очень сложно добиться. Решением стал перенос большей части кода в JavaScript.

В воссозданной LisaOS есть файловая система на базе IndexedDB, бенчмарки, игры, собственный 1-битный графический движок, текстовый редактор и холсты для рисования. Автор проекта перенёс не только оригинальные элементы, но и шрифты. Для этого пришлось реализовать собственную систему набора текста с поддержкой генерации новых глифов и возможностью комбинировать стили.

В воссозданной ОС есть много визуальных настроек внешнего вида системы. Можно менять цвета, шрифты и паттерны на фоне рабочего стола.

Веб-версия LisaOS работает в десктопных браузерах. В мобильных могут быть проблемы с позиционированием холста, экранной клавиатурой и перемещением объектов на рабочем столе. Протестировать проект можно на официальном сайте.

👉 @frontend_1
👍8
💬 Создаем чат на Vue с WebSocket: интерактив в реальном времени 🚀

🔥21 июля в 20:00 мск. приглашаем на открытый вебинар в OTUS, на котором разберем:
- Почему WebSocket — это не просто альтернатива HTTP, а ключевая технология для приложений в реальном времени.
- Как Vue делает интерфейсы реактивными и позволяет обновлять их без перезагрузки.
- Подключение WebSocket к Vue-приложению для отправки и получения сообщений.
- Создание интерфейса чата с автофокусом, прокруткой вниз и другими полезными функциями.
- Погружение в ключевые концепции Vue: ref, watch, v-for, v-model.

Что узнаете:
- Как настроить WebSocket-соединение во Vue.
- Как мгновенно обновлять интерфейс при получении новых данных.
- Как собрать реальный чат за 1 час.

👉 Регистрируйтесь по ссылке: https://vk.cc/cNJ7m3

Бесплатное занятие приурочено к старту курса “Vue.js разработчик”, на котором можно глубже погрузиться в особенности фреймворка, научиться работать с его инструментами и создавать реальные проекты.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1
Vue DevTools

Браузерное расширение для отладки приложений Vue.js.

https://github.com/vuejs/devtools

👉 @frontend_1
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Response-print-pdf — UI Kit для создания PDF-файлов с использованием React и TypeScript.

Создавайте и генерируйте PDF-документы с помощью React 📄. Этот UI-набор компонентов предназначен для создания PDF и печатных документов, таких как счета, брошюры и другие документы. Используйте простые и многократно используемые компоненты и шаблоны для создания профессиональных документов. Реализуйте свои идеи с помощью любимого фреймворка фронтенда React для создания PDF-документов следующего поколения.

Забудьте о docx, latex или устаревших библиотеках. С помощью react-print-pdf вы получите:

☑️ Простоту в использовании
☑️ Готовые компоненты и шаблоны
☑️ 100% контроль макета
☑️ Интеграция динамических данных в PDF-файл

https://github.com/OnedocLabs/react-print-pdf

👉 @frontend_1
👍3
🚀 Реактивное программирование в Angular

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

👉Какие ключевые темы и вопросы будут рассмотрены на вебинаре?
- Что такое реактивное программирование в контексте Angular
- Observable и Signals: в чём разница, когда что использовать
- Операторы RxJS
- Создание и управление сигналами (signal, computed, effect)
- Как внедрить сигналы в компоненты, шаблоны и сервисы
- Связь между RxJS и Signals через rxjs-interop
Бесплатный вебинар проходит в рамках курса “Angular Developer“

Регистрация и подробнее о курсе Angular Developer - https://vk.cc/cNKJm1

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Прощай, Zone.js: ускоряем Angular с Signal API и Zoneless-подходом

Привет! Я Незар, фронтенд-разработчик Т-Банка в одном из продуктов Т-Бизнеса. Наша команда использует Angular, и мы следим за всеми изменениями, которые с ним происходят.

В статье разберу, как Angular эволюционировал от Zone.js к Zoneless-приложениям с современным реактивным подходом Signal API и почему это стало ключевым шагом для повышения производительности и упрощения реактивного программирования.

На примерах и замерах производительности посмотрим, как переход к Zoneless-подходу с Signal API позволяет сократить избыточные перерисовки, ускорить отклик приложения и сделать код значительно чище и предсказуемее. Сделаем Angular-приложения быстрее и проще!

https://habr.com/ru/companies/tbank/articles/928206/

👉 @frontend_1
👍2
⚡️Хотите научиться писать надежные тесты для React-приложений и улучшить свои навыки в тестировании?

Присоединяйтесь к открытому уроку «Тестирование React-приложений с помощью React Testing Library» 23 июля в 20:00 МСК! Разберем:
- Основы React Testing Library (RTL): философию и ключевые принципы.
- Разницу между RTL и Enzyme, и почему RTL — лучший выбор.
- Как тестировать рендеринг, события, асинхронный код и кастомные хуки.

Это отличная возможность перед стартом курса «React.js Developer» от OTUS. Все участники получат скидку на обучение и полезные материалы для дальнейшего изучения.

👉Регистрация открыта: https://vk.cc/cNMUv5

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Трюк с style в React, который упростит работу с динамическими стилями

Вместо создания длинных условий или классов, можно использовать spread-оператор и логические выражения прямо в объекте стилей:


<div
style={{
padding: '16px',
...(isError && { border: '1px solid red' }),
...(isActive ? { backgroundColor: '#def' } : { opacity: 0.5 }),
}}
>
Hello!
</div>


📌 Что тут происходит:

* ...(условие && { стиль }) добавит стиль, если условие true;
* Альтернатива classnames для inline-стилей;
* Чисто, читаемо и удобно при большом числе условий.

🧠 Подходит, когда используете inline-стили (например, в дизайн-системах или при генерации email-шаблонов).

💡 Можно комбинировать с memo-компонентами и кастомными хуками, чтобы минимизировать ререндеры и повысить производительность.

👉 @frontend_1
👍3
2025/10/22 03:14:33
Back to Top
HTML Embed Code: