Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam

Пикабу Игры +1000 бесплатных онлайн игр

“Рецепт Счастья” — увлекательная игра в жанре «соедини предметы»! Помогите Эмили раскрыть тайны пропавшего родственника, найти сокровища и восстановить её любимое кафе.

Рецепт Счастья

Казуальные, Головоломки, Новеллы

Играть
Погружайтесь в загадочный мир подводных приключений с игрой

Тайна морей - Затерянные сокровища: Три в ряд

Три в ряд, Казуальные, Головоломки

Играть
Реалистичный симулятор игры бильярд. Играйте в Бильярд 3D: Русский бильярд, как в настоящей бильярдной!

Бильярд 3D: Русский бильярд

Симуляторы, Спорт, Настольные

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

Пикабомбер

Аркады, Пиксельная, 2D

Играть
Погрузись в мир куриных перестрелок! Хватай пушку и пусть только перья останутся на месте твоих врагов!

Чикен Страйк

Шутер, Экшены, Для мальчиков

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • AlexKud AlexKud 26 постов
  • StariiZoldatt StariiZoldatt 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Front-end

669 постов сначала свежее
12
Web.Study
Web.Study
2 года назад
Web-технологии

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS⁠⁠

В последние пять лет в интерфейсном дизайне появилось понятие тёмной темы: это когда фон делают тёмным, а текст — светлым. Это полезно в телефонах для энергосбережения и чтения с экрана ночью. Ну и просто красиво.


Сегодня мы добавим на страницу переключатель тёмной и светлой темы с помощью CSS.


Не только про CSS, но и про другие штуки из области Front-end мы рассказываем тут

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Автопереключение тёмной темы



Современные браузеры умеют определять, что на телефоне или компьютере включена тёмная тема. Для этого разработчики используют такой медиазапрос:


@Media screen and (prefers-color-scheme: dark) {}


Если на устройстве используется тёмная тема, то CSS выполнит всё, что написано в фигурных скобках. В нашем случае нам нужно сделать тёмный фон и светлый текст:

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Добавим этот код в стили на странице, и задача решена: мы получили поддержку тёмной темы. Если в настройках устройства переключить тему обратно на светлую, то сайт тоже получит белый фон.


Посмотреть на автопереключение темы на странице проекта.



Ручное переключение темы


Медиазапросы — это хорошо, но иногда нужно поставить принудительный переключатель темы, чтобы не зависеть от настроек устройства. Например, если нужно отладить тёмную тему, когда у вас на компьютере работает светлая тема.


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



Настраиваем стили


Единственное, что нам нужно добавить в стили — это два класса: для светлой и тёмной темы:

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Первый класс устанавливает чёрный фон и белый цвет текста, а второй, наоборот, — белый фон и чёрный текст. Цвета здесь можно указывать любые и для любых элементов, а мы для простоты остановимся на двух.


Внешне страница никак не поменяется — мы ещё не применили эти стили. Чтобы это сделать, надо поработать с остальными элементами, например добавить id к тегу <body> — по нему мы будем обращаться к содержимому всей страницы:

<body id="main">

Добавляем переключатель


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

<p id="select" onclick="darkLight()" style="cursor: help;">Включить тёмную тему</p>

Вот что здесь происходит:


<p id="select» ← указываем id переключателя, чтобы потом получить доступ к нему из скрипта;


onclick="darkLight ()» ← говорим, что должно произойти при нажатии: вызываем функцию darkLight ();


style="cursor: help;»> ← меняем внешний вид курсора при наведении на переключатель;


Включить тёмную тему</p> ← текст надписи.


Переключатель появился на странице, но пока ничего не переключает. Исправим это в скрипте.

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Пишем скрипт


Мы указали в свойствах переключателя, что при нажатии нужно выполнить функцию darkLight () — значит, нам нужно добавить её в рабочий скрипт.


Чтобы не зависеть от работы других скриптов и не лезть в их код, сделаем новый js-файл dark.js и положим в него такой код:

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Последнее, что осталось сделать, — подключить скрипт в конце HTML-страницы:


<script type="text/javascript" src="dark.js"></script>


Теперь у нас появилась поддержка тёмной темы с моментальным переключением:

Мам, сейчас так модно. Добавляем темную тему на страницу с помощью CSS Программирование, IT, Программист, CSS, Frontend, Web-программирование, Веб-дизайн, Веб-разработка, Длиннопост

Посмотреть на работу переключателя на странице проекта.



Что дальше


Этот способ работает только на одной странице, и после перезагрузки тему нужно переключать заново. В следующий раз сделаем апгрейд — научим сайт запоминать настройки и применять их ко всему сайту. А ещё подружим автопереключение с надписью на переключателе.

Показать полностью 6
[моё] Программирование IT Программист CSS Frontend Web-программирование Веб-дизайн Веб-разработка Длиннопост
9
9
Maclaudstein
2 года назад

Что такое cls и почему фронтендер и продакт на Пикабу заслуживают по щщам⁠⁠

Есть сайты, есть у них разные особенности, благодаря которым одни сайты считаются "приятными", а другие нет.


У Гугла даже есть метрики для таких вещей, в lighthouse. И одной такой метрикой является CLS - customer layout shift, это когда ты по сайту серфишь, тыкаешь на "дальше", а тебе вместо этого в это время реклама подгрузилась в ту точку, куда ты тыкаешь, и ты туда пошёл.


Так вот плохо так делать, уважаемые. Если вам фронтендера хорошего не хватает, то могу понять, это ж дефицит. Но продакт, мать его куда смотрит? Пользовательский опыт там, ранжирование в забугорных браузерах?  Одно из самых важных, что надо сделать. Лечится, кстати, просто, скелетонами. А измеряется тоже просто - библиотечкой в реакте нативной и прокидыванием метрик в GA или кликхаус.


Стыдно, господа, отдайте мне продакшн.

Реклама на Пикабу Frontend Ошибка IT Текст
3
16
Web.Study
Web.Study
2 года назад
Web-технологии

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log()⁠⁠

Что такое отладка


Отладка — это поиск и исправление ошибок в программе. Например, мы написали скрипт, добавили его на страницу, настроили запуск по нажатию кнопки — а при нажатии ничего не происходит. При этом в консоли нет никаких ошибок — все команды верные, браузер просто что-то делает, а результата нет. Отладка нужна как раз для того, чтобы найти ошибку и исправить её.

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Варварская отладка


Самый примитивный вариант отладки — добавить в код на JavaScript метод console.log (), поместив в скобки нужные данные для отладки. Console.log () — это просто способ вывести в консоль какой-нибудь текст.


Например, внутри функции можно сказать: console.log (‘Вызвана такая-то функция’) — и в нужный момент мы увидим, что функция вызвалась (или нет).


Минус этого подхода в том, что в коде появляется много отладочного мусора. А ещё, если мы не предусмотрели логирование для какой-то функции, то мы не поймаем в ней ошибку.


К счастью, помимо console.log () человечество изобрело много удобных инструментов отладки.



Что нужно для отладки

Для несложных проектов на JavaScript проще всего использовать встроенный отладчик в браузере Google Chrome. Единственное ограничение — он работает только с файлами скриптов, а не со встроенным в страницу кодом. Это значит, что если код скрипта находится внутри HTML-файла внутри тега <script>, то отладка не сработает.


Чтобы открыть панель отладки в Chrome, нажимаем ⌘+⌥+I и переходим на вкладку Sources (Источники):

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Открываем скрипт


Допустим, мы хотим посмотреть, как работает какой-либо скрипт.


Всё, что у нас есть, — это код. Чтобы мы смогли его отладить, его нужно положить в отдельный файл скрипта, присоединить к HTML-документу и запустить в браузере.


Открываем любой текстовый редактор, например Sublime Text, вставляем код скрипта и сохраняем файл как temp.js. Имя может быть любым, а после точки всегда должно стоять js — так браузер поймёт, что перед нами скрипт.


После этого в новом файле вставляем шаблон пустой HTML-страницы и подключаем наш скрипт — добавляем в раздел <body> такую строку:

<script type="text/javascript" src="temp.js"></script>
Получиться должно что-то вроде такого:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Сохраняем этот код как HTML-файл, например index.html, и кладём в ту же папку, что и скрипт. Теперь заходим в папку и дважды щёлкаем по HTML-файлу, чтобы открыть эту страницу в браузере:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

На странице ничего нет, но нам нужна не страница, а скрипт, поэтому находим слева наш файл temp.js и нажимаем на него — откроется код скрипта. Теперь можно начинать отладку:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Добавляем точки остановки


Точка остановки — это место, в котором наш скрипт должен остановиться и ждать дальнейших действий программиста. Их ещё называют брейкпоинты, от английского breakpoint — точка, где всё останавливается.


Когда скрипт доходит до этой точки, он ставит скрипт на паузу. При этом все данные и значения переменных скрипта остаются в памяти — в них можно заглянуть.


Брейкпоинт нужен для того, чтобы выполнить скрипт по шагам, начиная с первой команды. Чтобы его установить, нажимаем на номер строки с первой командой — в нашем случае это строка 2:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Обновим страницу и увидим, что скрипт начал работу и остановился. Но он остановился не на второй строке, а на шестой — всё потому, что это первая строка в скрипте, где происходит какое-то действие. Дело в том, что просто объявление новых переменных не влияет на работу скрипта, поэтому он ищет первую команду с действием. В нашем случае — это цикл for:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Пошаговая отладка


Чтобы посмотреть на работу скрипта по шагам, надо нажимать F9 или стрелку вправо с точкой на панели отладки:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Каждый раз, как мы будем нажимать F9 или эту кнопку, скрипт будет переходить к следующей команде, выполнять её и снова становиться на паузу:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Добавляем переменные для отслеживания


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


Чтобы добавить переменную и видеть её значение во время выполнения, в панели отладки в разделе Watch нажимаем плюсик, вводим имя переменной, выбираем её из списка и нажимаем энтер:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Теперь видно, что на этом шаге значение переменной a равно нулю:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Точно так же добавим остальные переменные: i, b, c. Так мы увидим, что первые два цикла только начались, а внутренний прошёл уже три итерации:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Так, нажимая постоянно F9, мы прогоним весь скрипт до конца и посмотрим, при каких значениях какие условия выполняются и как находится решение:

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

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



Отладка брейкпойнтами


Допустим, нам важно понять, в какой момент скрипт находит и выдаёт решение. Глядя в код, мы понимаем, что как только скрипт дошёл до команды console.log () — он нашёл очередное решение. Это значит, что мы можем поставить брейкпоинт только на эту строчку и не прогонять вручную весь скрипт: он сам остановится, когда дойдёт до неё, а мы сможем посмотреть значения переменных в этот момент.


Для этого:

1. Нажимаем снова на строку 2 и убираем предыдущую точку остановки.

2. Ставим брейкпоинт на строку 20 — там, где происходит вывод решения в консоль.

3. Нажимаем F8.

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

Как поймать баг в коде: отладка в браузере. Вместо тысячи console.log() Программирование, IT, Инструкция, Баг, Frontend, Web, Длиннопост

Таких точек остановки можно поставить сколько угодно и в любой момент — на каждой из них отладчик остановится и покажет текущее состояние скрипта.



Зачем это всё


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


В следующей статье мы покажем на примере с реальным кодом, как отладка помогает находить и исправлять такие ошибки. Подпишитесь, на наш телеграм, чтобы не пропустить это – https://t.me/havaevau_webstudy

Показать полностью 13
[моё] Программирование IT Инструкция Баг Frontend Web Длиннопост
9
Аноним
Аноним
2 года назад
Лига программистов

Топ 5 программ для начинающего веб разработчика!⁠⁠

[моё] Разработка IT Программирование Программист YouTube Windows Веб-разработка Frontend Видео
7
23
Web.Study
Web.Study
2 года назад
Web-технологии

4 редких API, которые встречаются в дикой природе JavaScript⁠⁠

В продолжение к этой статье я хочу вам рассказать о еще 4 API, которые не очень популярны, но могут выручить вас в некоторых ситуациях


Наш канал для новичков во Front-end

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Beacon API


Beacon API позволяет отправлять на сервер асинхронные и неблокирующие запросы (методом POST), которые гарантированно завершаются до выгрузки страницы, в отличие от XMLHttpRequest или Fetch API.


Одним из основных вариантов использования Beacon API является логгирование активности пользователей или отправка аналитических данных на сервер.


Раньше для этого приходилось прибегать к таким уловкам, как обработка событий unload или beforeunload глобального объекта Window с помощью синхронного XMLHttpRequest, например:


const someData = {
a: 1,
b: 2,
};
// страница будет выгружена только после отправки данного запроса
window.addEventListener("beforeunload", () => {
const xhr = new XMLHttpRequest(); 
xhr.open("POST", "https://example.com/beacon");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
const params = new URLSearchParams(Object.entries(someData)); xhr.send(params); 
});


Интерфейс


Beacon API расширяет свойство navigator методом sendBeacon, который имеет следующую сигнатуру:

navigator.sendBeacon(url: string | URL, data?: BodyInit | null)

- url — адрес сервера;

- data — опциональные данные для отправки, которые могут быть строкой, объектом, ArrayBuffer, Blob, DataView, FormData, TypedArray или URLSearchParams.


sendBeacon возвращает логическое значение (true или false) — индикатор постановки data в очередь для передачи.


Пример использования


Создаем шаблон проекта с помощью Yarn и Vite на чистом JavaScript:

# rare-web-apis - название проекта
# --template vanilla - используемый шаблон
yarn create vite rare-web-apis --template vanilla

Переходим в созданную директорию, устанавливаем зависимости и запускаем сервер для разработки:

cd rare-web-apis
yarn
yarn dev

Определяем в файле main.js следующий обработчик:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Событие visibilitychange объекта document (подробнее о нем можно почитать по ссылке, приведенной в начале статьи) является более надежным способом определения состояния видимости страницы, чем события unload или beforeunload. В обработчике при скрытии страницы, например, при переключении вкладки или сворачивании страницы, с помощью sendBeacon по адресу https://example.com/beacon отправляются некоторые данные в форме URLSearchParams.


Результат переключения вкладки:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост
4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Поддержка — 96.8%.



Clipboard API



Clipboard API позволяет выполнять асинхронные операции записи/чтения текстовых и других данных в/из системного буфера обмена, а также обрабатывать события copy, cut и paste (копирование, вырезка и вставка) буфера.

По причинам безопасности Clipboard API доступен только при условии, что:


- страница обслуживается по протоколу https или localhost;

- страница находится в активной вкладке браузера (не находится в фоновом режиме);

- операции записи/чтения инициализируются пользователем (например, с помощью нажатия кнопки).


Разрешение clipboard-write для записи данных предоставляется активной странице автоматически, а разрешение clipboard-read для чтения данных запрашивается у пользователя с помощью Permissions API.


Раньше для работы с содержимым редактируемой области использовался метод document.execCommand. Например, вот как выполнялась запись текста:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Интерфейс


Clipboard API расширяет свойство navigator интерфейсом Clipboard, экземпляры которого предоставляют следующие методы для работы с буфером:


- writeText(text: string) — для записи текста, принимает строку;

- readText() — для чтения текста, возвращает строку;

- write(data: ClipboardItem[]) — для записи данных, принимает массив объектов ClipboardItem (см. ниже);

- read() — для чтения данных, возвращает массив объектов ClipboardItem.


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


ClipboardItem — это интерфейс, предназначенный для работы с нетекстовыми данными, который имеет следующую сигнатуру:

new ClipboardItem(
items: Record<string, string | Blob | PromiseLike<string | Blob>>,
options?: ClipboardItemOptions
)

- items — данные для записи в форме объектов, ключами которых являются MIME-типы, а значениями — строки, Blob или промисы, разрешающиеся строками или Blob;

- options — опциональные настройки (точнее, одна настройка — presentationStyle).


В действительности, ClipboardItem можно использовать также для работы с текстовыми данными, но есть один нюанс, о котором чуть позже.


Что касается событий copy, cut и paste, то их обработка обычно выполняется через свойство clipboardData события ClipboardEvent, которое содержит объект DataTransfer, предоставляющий следующие методы:


- setData(format: string, data: string) — для записи данных;

- getData(format: string) — для чтения данных;

- clearData() — для удаления данных и др.

Пример использования


Начнем с записи и чтения текста. Редактируем файл index.html следующим образом:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Получаем ссылки на DOM-элементы:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Определяем функцию копирования текста:


async function copyText() {
let textToCopy; 
// получаем выделение
const selectedText = getSelection().toString().trim(); 
// текстом для копирования является либо выделенный текст, либо содержимое `copyBox`
selectedText
? (textToCopy = selectedText)
: (textToCopy = copyBox.textContent.trim()); 
// если текст отсутствует
if (!textToCopy) {
logBox.textContent = "No text to copy"; 
return; 
}
try {
// записываем текст в буфер
await navigator.clipboard.writeText(textToCopy); 
logBox.textContent = "Copy success"; 
} catch (e) {
console.error(e); 
logBox.textContent = "Copy error"; 
}
}

Определяем функцию для вставки текста:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Наконец, регистрируем соответствующие обработчики:

copyBtn.addEventListener("click", copyText); 
pasteBtn.addEventListener("click", pasteText);

Обратите внимание: при первой вставке текста браузер запрашивает разрешение на чтение буфера. При отказе в разрешении выбрасывается исключение DOMException: Read permission denied.


Записать текстовые данные с помощью ClipboardItem можно следующим образом:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Обратите внимание: несмотря на то, что значением объекта ClipboardItem может быть строка (new ClipboardItem({ [type]: text })), при записи такого объекта в буфер выбрасывается исключение DOMException: Invalid Blob types.


Также обратите внимание, что при программной записи данных в случае, когда страница находится в фоновом режиме, выбрасывается исключение DOMException: Document is not focused.


Для извлечения данных из ClipboardItem используется метод getType:

const blob = await item.getType(type); 
const text = await blob.text(); 
console.log(text); // Text to copy

Добавим возможность копирования и вставки изображения, хранящегося на сервере.


Добавляем кнопки в index.html:

<div>
<button id="copy-img-btn">Copy remote image</button>
<button id="paste-img-btn">Paste remote image</button>
</div>

Определяем тип и функцию для копирования изображения:


const IMG_TYPE = "image/png";
async function copyRemoteImg() {
try {
const response = await fetch(
"https://images.unsplash.com/photo-1529788295308-1eace6f67388..."
);

// см. ниже
const blob = new Blob([await response.blob()], { type: IMG_TYPE });

// создаем элемент копирования

const item = new ClipboardItem({ [blob.type]: blob });
// записываем его в буфер
await navigator.clipboard.write([item]);

logBox.textContent = "Copy image success";
} catch (e) {
console.error(e);
logBox.textContent = "Copy image error";
}
}

Не уверен насчет других браузеров, но в Chrome наблюдается следующее:


- при преобразовании изображения из тела ответа в Blob с помощью response.blob() дефолтным типом становится image/jpeg (независимо от типа запрашиваемого изображения);

- при попытке записи такого Blob в буфер выбрасывается исключение DOMException: Type image/jpeg not supported on write.


Поэтому приходится выполнять двойное преобразование с помощью new Blob([await response.blob()], { type: IMG_TYPE });.


Определяем функцию для чтения данных из буфера и вставки изображения:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Итерация по item.types является безопасной, в отличие от прямого обращения к item.getType() — при отсутствии типа выбрасывается исключение DOMException: Failed to execute 'getType' on 'ClipboardItem': The type was not found.


Регистрируем соответствующие обработчики:

copyImgBtn.addEventListener("click", copyRemoteImg); pasteImgBtn.addEventListener("click", pasteRemoteImg);

Реализуем модификацию копируемых и вставляемых данных.


Редактируем index.html:


<textarea cols="30" rows="10" id="text-area">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Libero, labore.</textarea>

Определяем функцию модификации копируемых данных:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Данная функция добавляет к копируемому тексту строку copied from MySite.com.


Определяем функцию модификации добавляемых данных:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Данная функция переводит добавляемый текст в верхний регистр.


Обратите внимание, что в обоих случаях отключается стандартная обработка события браузером с помощью e.preventDefault().


Регистрируем соответствующие обработчики:

textArea.addEventListener("copy", onCopy); textArea.addEventListener("paste", onPaste);

Поддержка — 95.08%.



Notifications API


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


Интерфейс


Для запроса разрешения на показ уведомлений используется метод Notification.requestPermission. Данный метод возвращает промис, который разрешается или отклоняется со статусом разрешения. Статус разрешения содержится в свойстве Notification.permission и может иметь одно из трех значений:


- default — запрос на разрешение не выполнялся, уведомления не отображаются;

- granted — пользователь предоставил разрешение, уведомления отображаются;

- denied — пользователь отклонил запрос, уведомления не отображаются.


Для создания уведомления используется конструктор Notification, который имеет следующую сигнатуру:

new Notification(title: string, options?: NotificationOptions | undefined)

- title: string — заголовок уведомления;

- options — опциональный объект с настройками, такими как:

- body: string — тело уведомления;

- icon: string — ссылка на иконку;

- tag: string — тег, используемый для идентификации уведомления. Тег позволяет обновлять уведомления без их отображения, что может быть полезным при большом количестве уведомлений;

- image: string — ссылка на изображение;

- data: any — данные, ассоциированные с уведомлением и др.


Для закрытия уведомления используется метод notification.close.


Notifications API позволяет обрабатывать следующие события:


- show — отображение уведомления;

- close — закрытие уведомления;

- click — нажатие на уведомление;

- error.


Пример использования


В качестве примера реализуем отображение уведомлений о скрытии страницы. При клике по уведомлению в контейнер для логгов будет выводиться соответствующее сообщение.


Определяем в index.html кнопку для запроса разрешения на показ уведомлений:

<button id="notification-btn">Enable notifications</button>

Регистрируем соответствующий обработчик в main.js:

notificationBtn.addEventListener("click", () => { Notification.requestPermission();
});
Определяем переменные для уведомления и идентификатора таймера, а также функцию для создания уведомления:
4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Несмотря на то, что большинство браузеров автоматически уничтожают уведомления по прошествии некоторого времени (около 4 сек), рекомендуется делать это явно.


Расширяем обработку изменения состояния видимости страницы:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Включаем уведомления:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Переключаем вкладку:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

При клике по уведомлению на странице приложения появляется сообщение Notification clicked.


Обратите внимание: при нахождении в другой вкладке уведомление уничтожается через 3 сек, а при возвращении в приложение — сразу.


Поддержка оставляет желать лучшего — 79.86%.



Performance API


Performance API позволяет измерять задержку в приложении на стороне клиента. Интерфейсы Performance (интерфейсы производительности) считаются высокоточными (high resolution), поскольку имеют точность, равную тысячным миллисекунды (точность зависит от ограничений аппаратного или программного обеспечения). Данные интерфейсы используются для вычисления частоты кадров (например, в анимации) и бенчмаркинге (например, для измерения времени загрузки ресурса).


Поскольку системные часы (system clock) платформы подвергаются различным корректировкам (таким как коррекция времени по NTP), интерфейсы Performance поддерживают монотонные часы (monotonic clock), т.е. время, которое все время увеличивается. Для этого Performance API определяет тип DOMHighResTimeStamp вместо использования интерфейса Date.now().


DOMHighResTimeStamp представляет высокоточную отметку времени (point in time). Данный тип является double и используется интерфейсами производительности. Значение DOMHighResTimeStamp может быть дискретной отметкой времени или разницей между двумя такими отметками.


Единицей DOMHighResTimeStamp является миллисекунда с точностью до 5 микросекунд. Если браузер не может обеспечить такую точность, допускается представление значения в миллисекундах с точностью до миллисекунды.


Интерфейс


Основным методом, предоставляемым Performance API, является метод now, который возвращает DOMHighResTimeStamp, значение которого зависит от времени создания контекста браузера или воркера (worker).

Кроме этого, рассматриваемый интерфейс содержит два основных свойства:


- timing — возвращает объект PerformanceTiming, содержащий такую информацию, как время начала навигации, время начала и завершения перенаправлений, время начала и завершения ответов и т.д.;

- navigation — возвращает объект PerformanceNavigation, представляющий тип навигации, происходящей в текущем контексте браузера, такой как переход к странице из истории, по ссылке и т.п.


Пример использования


В качестве примера реализуем функцию для измерения времени выполнения другой функции.


Редактируем main.js:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

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

const getFactorial = (n) => (n <= 1 ? 1 : n * getFactorial(n - 1)); howLong(getFactorial)(12);

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

const fetchSomething = (url) => fetch(url).then((r) => r.json()); howLong(fetchSomething)("https://jsonplaceholder.typicode.com/users?_limit=10");

Результат:

4 редких API, которые встречаются в дикой природе JavaScript Программирование, IT, Javascript, API, Frontend, Программист, Длиннопост

Поддержка — 97.17%.



Иии...


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

Показать полностью 17
[моё] Программирование IT Javascript API Frontend Программист Длиннопост
1
24
Web.Study
Web.Study
2 года назад
Web-технологии

4 малоизвестных, но не маловажных API для Javascript⁠⁠

Недавно я копался на хабре и нашел подборку полезных API, которые при этом не мейнстримные. Решил поделиться ими с вами, чтобы вы их юзали на практике (а грех их не заюзать).


Наш канал для новичков во fron-end, где мы рассказываем не только о JS

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Page Visibility API


Данный интерфейс позволяет определять, когда пользователь покидает страницу. Точнее, он вызывает событие при каждом изменении состояния видимости (visibility status) страницы, например, когда пользователь сворачивает/разворачивает окно, переходит на другую вкладку и т.д.


Раньше для этого приходилось прибегать к таким уловкам, как обработка событий blur и focus. Соответствующий код выглядел так:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приведенный код работает, но не совсем так, как ожидается. Поскольку событие blur вызывается, когда страница теряет фокус, оно может возникнуть, когда пользователь нажимает на поиск, диалоговое окно (alert), консоль или границу окна. События blur и focus сообщают нам о том, что страница активна, но не о том, видим или скрыт ее контент.


Случаи использования


Page Visibility API может использоваться для предотвращения выполнения операций, которые имеют значение, только когда пользователь видит страницу, или для выполнения фоновых операций. Еще несколько кейсов:


• приостановка воспроизведения видео, каруселей изображений (автослайдеров) или анимации, когда пользователь покидает страницу;

• если на странице отображаются данные в реальном времени, нет смысла их обновлять, если пользователь покинул страницу;

• отправка аналитических данных о действиях пользователя.


Интерфейс


Page Visibility API предоставляет 2 свойства и одно событие для получения доступа к состоянию видимости страницы:


• document.hidden — доступное только для чтения глобальное свойство. Признано устаревшим. Если страница скрыта, возвращается true, иначе — false;

• document.visibilityState — обновленная версия document.hidden. Возвращает 4 возможных значения:
• visible — страница видима или, если быть точнее, страница не свернута и находится в текущей вкладке;

• hidden — страница скрыта;

• prerender — начальное состояние видимой страницы: предварительный рендеринг;

• unloaded — страница выгружена из памяти;

• visibilitychange — событие объекта document, возникающее при изменении visibilityState:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Пример использования


В качестве примера рассмотрим приостановку видео и прекращение получения ресурсов из API, когда пользователь покидает страницу. Создаем шаблон проекта с помощью Vite и Yarn:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Переходим в созданную директорию, устанавливаем зависимости и запускаем сервер для разработки:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приложение доступно по адресу http://localhost:3000.


Удаляем шаблонный код из файла main.js и добавляем элемент video в файле index.html:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Возвращаемся к main.js. Добавляем обработчик события visibilitychange объекта document:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

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


Получаем ссылку на элемент video и управляем воспроизведением видео в зависимости от видимости страницы:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Прим. пер.: приведенный код работать не будет: получаем ошибку Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.. Это объясняется тем, что вызов video.play() при изменении состояния видимости страницы на visible равносилен наличию у элемента video атрибута autoplay. Современные браузеры допускают автоматическое (без участия пользователя) воспроизведение видео только в режиме без звука. Соответственно, для того, чтобы код работал, как ожидается, элементу video необходимо добавить атрибут muted.


Когда пользователь покидает страницу, воспроизведение видео приостанавливается. Когда пользователь возвращается на страницу, воспроизведение видео продолжается.

Теперь рассмотрим пример прекращения выполнения запросов к API. Для этого напишем функцию, запрашивающую цитату из quotable.io. Добавляем в index.html элемент div для хранения цитаты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Определяем в main.js функцию для получения произвольной цитаты с помощью Fetch API:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Приведенный код работает, но функция getQuote вызывается только один раз. Обернем ее в setInterval с интервалом в 10 секунд:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Если пользователь свернет окно или перейдет на другую вкладку, запросы все равно будут отправляться каждые 10 секунд. Давайте это исправим:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Теперь запросы будут выполняться только при условии, что страница находится в видимом состоянии.


Поддержка — 98.24%.


Web Share API


Web Share API предоставляет разработчикам доступ к встроенному механизму совместного использования (native sharing mechanism) операционной системы, что особенно актуально для мобильных телефонов. Данный интерфейс позволяет делиться текстом, ссылками и файлами без создания собственного механизма или использования сторонних решений.


Случаи использования


Web Share API позволяет делиться содержимым страницы в соцсетях или копировать его в буфер обмена пользователя.


Интерфейс


Web Share API предоставляет 2 метода:


• navigator.canShare(data): принимает данные для совместного использования и возвращает логическое значение — индикатор того, можно ли этими данными поделиться;

• navigator.share(data): возвращает промис, который разрешается в случае успешного шаринга (sharing) данных. Данный метод вызывает нативный механизм и принимает данные для шаринга. Обратите внимание: этот метод может вызываться только в ответ на действие пользователя (нажатие кнопки, переход по ссылке и т.п.) (требуется кратковременная активация). data — это объект со следующими свойствами:

• url — ссылка для шаринга;

• text — текст;

• title — заголовок;

• files — массив объектов File.



Пример использования


Возьмем последний пример и добавим возможность делиться цитатой. Добавляем соответствующую кнопку в index.html:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

В main.js получаем ссылку на эту кнопку и определяем функцию для шаринга данных:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Нам также потребуется глобальная переменная для хранения содержимого текущей цитаты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Определяем обработчик нажатия кнопки:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Обратите внимание: Web Share API работает только в безопасном окружении. Это означает, что страница должна обслуживаться по протоколу https или wss.


Поддержка — 89.82%.



Broadcast Channel API


Broadcast Channel API позволяет контекстам браузера (browser contexts) обмениваться данными друг с другом. К браузерным контекстам относятся такие элементы, как окно, вкладка, iframe и т.д. По причинам безопасности контексты, обменивающиеся данными, должны принадлежать одному источнику (same origin). Один источник означает одинаковый протокол, домен и порт.


Случаи использования


Broadcast Channel API обычно используется для синхронизации окон и вкладок браузера для улучшения пользовательского опыта или повышения безопасности. Он также может применяться для уведомления одного контекста о завершении процесса в другом контексте. Другие примеры:


• авторизация пользователя во всех вкладках;

• отображение загруженного ресурса во всех вкладках;

• запуск сервис-воркера для выполнения фоновой задачи.


Интерфейс


Broadcast Channel API предоставляет объект BroadcastChannel, позволяющий обмениваться сообщениями с другими контекстами. Конструктор этого объекта принимает единственный аргумент: строку — идентификатор канала (channel identifier):

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

BroadcastChannel предоставляет 2 метода:


• broadcastChannel.postMessage(message): позволяет отправлять сообщения всем подключенным контекстам. В качестве аргумента данный метод принимает любой тип данных:
4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

• broadcastChannel.close(): закрываем канал коммуникации, что позволяет браузеру выполнить сборку мусора.


При получении сообщения возникает событие message. Это событие содержит свойство data с отправленными данными, а также другие свойства, позволяющие идентифицировать отправителя, такие как origin, lastEventId, source и ports:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Пример использования


Возьмем последний пример, создадим новый контекст и добавим возможность обмена цитатами между существующим и новым контекстами.

Создаем директорию new-context в корне проекта. Создаем в ней файл index.html следующего содержания:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Создаем файл new-context/main.js.


Получаем ссылку на div и создаем новый канал коммуникации:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Добавляем обработчик события message:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Создаем канал в основном main.js и редактируем функцию getQuote:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

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


• в корне проекта создаем файл vite.config.js следующего содержания:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

• запускаем сервер для разработки с помощью команды yarn dev;

• открываем 2 вкладки:
• по адресу http://127.0.0.1:5173/index.html;

• по адресу http://127.0.0.1:5173/new-context/index.html.


Поддержка — 92.3%.



Internationalization API


Шпаргалка по Internationalization API


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


Предположим, что мы хотим отобразить на странице "10 ноября 2022 года" как "11/10/22". Эта дата в разных странах будет выглядеть по-разному:


• 11/10/22 или ММ/ДД/ГГ в США;

• 10/11/22 в Европе и Латинской Америке;

• 22/11/10 в Японии, Китае и Канаде.


Здесь на помощь приходит Internationalization API (или I18n). Данный интерфейс позволяет решить несколько групп задач, связанных с интернационализацией и локализацией, но в этой статье мы не будем погружаться в него слишком глубоко.


Интерфейс


Для определения страны пользователя в I18n используется идентификатор локали (или просто локаль) (locale identifier, locale). Локаль — это строка, представляющая страну, регион, диалект и другие характеристики. Если точнее, локаль — это строка, состоящая из подтегов (subtags), разделенных дефисом, например:


• zh — китайский (язык);

• zh-Hant — китайский (язык), традиционные иероглифы (сценарий — script);

• zh-Hang-TW — китайский (язык), традиционные иероглифы (сценарий), используемые на Тайване (регион).


Полный список подтегов можно найти в этом RFC.


I18n предоставляет объект Intl, который, в свою очередь, предоставляет несколько специальных конструкторов для работы с чувствительными к языку данными, наиболее интересными из которых являются следующие:


• Intl.DateTimeFormat — форматирование даты и времени;

• Intl.DisplayNames — форматирование названий языков, регионов и сценариев;

• Intl.Locale — генерация и манипуляция идентификаторами локалей;

• Intl.NumberFormat — форматирование чисел;

• Intl.RelativeTimeFormat — форматирование относительного времени (завтра, 2 дня назад и т.п.).


Пример использования


В качестве примера рассмотрим использование конструктора Intl.DateTimeFormat для форматирование свойства dateAdded цитат. Данный конструктор принимает 2 аргумента: строку locale для определения правил форматирование даты и объект options для кастомизации форматирования.


Прим. пер.: в качестве первого аргумента Intl.DateTimeFormat также принимает массив локалей. Например, для установки дефолтной локали пользователя в конструктор передается пустой массив ([]).


Объект, возвращаемый Intl.DateTimeFormat, предоставляет метод format, который принимает объект Date с датой для форматирования и объект options для кастомизации отображения форматированной даты:

4 малоизвестных, но не маловажных API для Javascript Программирование, IT, Javascript, API, Frontend, Длиннопост

Обратите внимание: мы установили настройку timeZone в значение UTC для того, чтобы при форматировании даты не учитывалось локальное время пользователя.


Определяем в main.js функцию для форматирования даты:

function formatDate(dateString) {
const date = new Date(dateString);
const dateTime = new Intl.DateTimeFormat([], { timeZone: "UTC" });
return dateTime.format(date);
}

Вызываем эту функцию внутри функции getQuote для форматирования свойства dateAdded:

const getQuote = async () => {
if (document.visibilityState !== "visible") return;
try {
// ...
const parsedQuote = `<q>${content}</q> <br> <p>- ${author}</p> <br> <p>Added on ${formatDate(
dateAdded
)}</p>`;
// ...
} catch (e) {
console.error(e); 
}
};

Поддержка — 97.74%.


Прим. пер.: на днях использовал Intl.DateTimeFormat для отображения даты и времени в коротком формате:

const getDateWithHoursAndMinutes = (date) => 
new Intl.DateTimeFormat([], {
dateStyle: "short",
timeStyle: "short",
}).format(date); 
console.log(getDateWithHoursAndMinutes(new Date())); // 23.09.2022, 21:30

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

Благодарю за внимание и happy coding!

Показать полностью 25
[моё] Программирование IT Javascript API Frontend Длиннопост
3
Web.Study
Web.Study
2 года назад

7 легких способов склонировать массив в JS⁠⁠

Приветствую коллеги, как я думаю уже понятно из названия тут будет небольшая шпаргалка на тему клонинрования массивов.


const cloneArr = (arr) => arr.slice(0);
const cloneArr = (arr) => arr.concat([]);
const cloneArr = (arr) => Array.from(arr);
const cloneArr = (arr) => arr.map((x) => x);
const cloneArr = (arr) => [...arr];
const cloneArr = (arr) => Array.from(arr);
const cloneArr = (arr) => JSON.parse(JSON.stringify(arr));

Удачи в экспериментах!


Наш канал

[моё] Программирование IT Javascript Web-программирование Frontend Веб-разработка Текст
10
Expromtom
2 года назад

Таки Хекслет Фронтенд⁠⁠

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


Выиграл Hexlet, так что впереди еще чуть больше полугода на обучение. Что могу сказать по разнице с вводной частью?


Интенсивный темп: это круто мотивирует, добавляет задачек в расписание, а еще добавляет азарт.

Много практики к каждому уроку: с одной стороны, все время есть, что попробовать и поделать, с другой — еженедельные итерации с домашкой не успевают превратиться в бесконечную тяжелую повинность. А глядя на себя еще в «весенней» нулевой версии, уже_есть_понимание и прогресс. Кураторы хвалят;)


Поддержка ментора и сообщества: это маст хэв, за которым только и стоит идти. Да, можно самому всё, в интернете навалом материалов. Даже слишком навалом, всё не перечитать. Здесь есть четкая структура программы, последовательность и обратная связь. Круто, когда не только получаешь ответ, сколько общее представление и контекст, в котором находится оптимальное решение.


Скажем, тупняк в верстке мне казался натурально неразрешимой задачей, пока куратор не помог нарисовать в голове, а потом и на натуральной аналоговой бумажке роад мап проекта, и всё встало на свои места. Безмерная гордость от того, что додуматься удалось самостоятельно:)

Наставничество явно экономит время и ресурсы на обучение. Когда человек в теме не только конкретной профессии, но и хода обучения, не надо вдаваться в подробности и на ломанном «фронтендовом» пытаться намычать вопрос.


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


Сейчас подбираюсь к теме фреймворков. Уже миновали JS, HTML, CSS. Кое-что уже было понятно на вводной части, а тут совсем серьезно, с реальными примерами и наглядностью. Первый проект почти допилен, вовлечение максимальное!


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


Гуглю стеки в вакансиях и прикидываю, как в них заглянуть на следующих учебных проектах. Интересно, что можно прям рабочие тулзы написать для себя. Почему-то казалось, что на фронте программирования меньше, чем рисования красивых кнопочек. Оказалось, что кнопочки как раз уже нарисованы, а вот логику можно реализовывать бесконечно красиво!


Тем не менее, цель моя — портфолио, приближенный к реальному опыт разработки фронта, понимание основ и «где рыть», ну, и трудоустройство. На канале трудоустройства у Hexlet пролетают лакомые вакансии, так что иногда хочется жамкнуть на отклик. Останавливают пока малопонятные требования в описании:))


Перекраиваю расписание, чтобы больше учиться — затягивает))

Показать полностью
[моё] Обучение Программирование IT Программист Frontend Профессия Личный опыт Текст
2
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии