<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>jQuery</title>
    <description/>
    <link>https://tproger.ru/tag/jquery</link>
    <atom:link href="https://tproger.ru/tag/jquery/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Mon, 21 Sep 2026 00:59:22 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>jQuery</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</title>
      <link>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</link>
      <comments>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Фёдор Малков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</guid>
      <description><![CDATA[<p>Как добавить кнопку «наверх» в Django-сайт и Django Admin: настройка, CSP, доступность, мобильная версия и работа рядом с cookie-баннерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j">Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2026 13:01:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Как сделать scroll-to-top для сайта и Django Admin, не забыв про мобильные устройства, CSP, доступность, плавающие виджеты и нормальную настройку без правки шаблонов.</p><p>На первый взгляд кнопка «наверх» — задача на пять минут. Добавил<i> position: fixed</i>, обработчик window.scrollTo()  — готово.</p><p>Но стоит этой кнопке появиться в живом проекте, как выясняется, что она пересекается с cookie-баннером, мешает чату поддержки, выглядит иначе в мобильной версии, не дружит со строгим CSP или пропадает из Django Admin.</p><p>В итоге маленькая UI-деталь начинает обрастать условиями. Я решил собрать их в отдельный Django-пакет — django-scroll-to-top</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/000bf08b-be8e-4252-82ce-dbef3556426e.webp" alt="Пример кнопки &quot;Наверх&quot; на демо сайте" /><figcaption>Пример кнопки "Наверх" на демо сайте</figcaption></figure><h2>Когда трёх строк JavaScript достаточно</h2><p>Для небольшого сайта, где нет сложной верстки, админки, CSP и требований к повторному использованию, самый простой вариант действительно выглядит примерно так:</p><p>Это нормальное решение. Не всегда стоит тянуть пакет ради одной кнопки.</p><p>Но в реальном Django-проекте быстро появляются дополнительные вопросы:</p><ul><li>когда именно показывать кнопку: после 300 пикселей, одного экрана или только при прокрутке вверх;</li><li>что делать на коротких страницах;</li><li>как не перекрыть cookie-баннер, чат, toast-уведомления или нижнюю мобильную навигацию;</li><li>как дать пользователю закрыть кнопку;</li><li>как не сломать клавиатурную навигацию и режим reduced motion;</li><li>как сделать отдельное оформление для сайта и Django Admin;</li><li>как не заставлять проект добавлять unsafe-inline в Content Security Policy;</li><li>как позволить редактору или администратору изменить цвет, положение и иконку без нового деплоя.</li></ul><p>Именно в этот момент «три строки JavaScript» превращаются в отдельный компонент.</p><h2>Что я хотел получить</h2><p>Цель была не в том, чтобы сделать ещё одну стрелку в правом нижнем углу. Хотелось собрать переиспользуемый компонент со следующими свойствами:</p><ol><li>Подключение сайта одной template-тегом.</li><li>Отдельная поддержка обычных страниц и стандартного Django Admin.</li><li>Настройка внешнего вида через админку, а не через постоянную правку CSS.</li><li>Без jQuery, CDN, фронтенд-фреймворка и обязательной сборки.</li><li>Безопасная работа при строгой CSP.</li><li>Прогрессивное улучшение: без JavaScript остаётся обычная ссылка в начало страницы.</li><li>Возможность жить рядом с другими фиксированными элементами интерфейса.</li></ol><p>Пакет в итоге хранит обычные настройки установки в settings.py, а визуальное поведение — в базе данных. Это позволяет менять кнопку через Django Admin, публиковать новую версию настроек и при необходимости откатываться на предыдущую. В проекте есть отдельные профили для публичного сайта и Django Admin, а ревизии могут быть черновыми, опубликованными или архивными.</p><h2>Быстрое подключение</h2><p>Базовый сценарий начинается с установки:</p><p>В settings.py добавляем приложение. Если нужна поддержка стандартной админки, пакет должен идти раньше django.contrib.admin:</p><p>Включаем области, где должна работать кнопка:</p><p>Для публичной части добавляем URLConf пакета:</p><p>А в общий шаблон сайта — один тег:</p><p>На стандартном Django Admin ничего дополнительно вставлять не нужно: пакет использует обычный механизм разрешения шаблонов Django. Если же в проекте переопределён admin/base_site.html  тег можно добавить вручную в блок footer</p><h2>Настройка без превращения админки в редактор CSS</h2><p>Мне не хотелось хранить в базе шаблоны, произвольный CSS или JavaScript. Это неудобно для сопровождения и создаёт лишнюю поверхность для ошибок.</p><p>Поэтому визуальная часть собрана из контролируемых вариантов:</p><ul><li>круг, квадрат, скруглённый квадрат или pill;</li><li>заливка solid, outline, soft, ghost, glass или gradient;</li><li>положение в любом углу экрана;</li><li>отдельные размеры для desktop и mobile;</li><li>светлая и тёмная тема;</li><li>встроенные иконки, иконки от разработчика или загружаемые SVG;</li><li>настройки тени, границы, opacity и focus ring.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/90107109-2271-460a-9dea-815592d468e7.webp" alt="Настройки кнопки" /><figcaption>Настройки кнопки</figcaption></figure><h2>Что происходит, когда рядом есть cookie-баннер или чат</h2><p>Нижний правый угол страницы редко бывает свободен. Там часто живут:</p><ul><li>cookie-баннер;</li><li>компактная кнопка после закрытия баннера;</li><li>чат поддержки;</li><li>кнопка обратного звонка;</li><li>мобильная навигация;</li><li>toast-уведомления.</li></ul><p>Пакет умеет рассматривать такие элементы как препятствия. Для этого можно пометить элемент атрибутом:</p><p>Дальше для кнопки можно выбрать поведение: игнорировать препятствия, сдвинуться вдоль края, попробовать другой угол или скрыться, если безопасного места не осталось.</p><p>Для сложных виджетов есть отдельный адаптер: он может отслеживать появление и исчезновение элементов, например компактного launcher после закрытия cookie-баннера. При этом ни cookie-пакет, ни чат не становятся зависимостями  django-scroll-to-top</p><h2>Доступность — не отдельная галочка в конце</h2><p>У кнопки есть понятное имя для screen reader, поддержка клавиатуры, видимый focus-visible, минимальный размер области нажатия и режим prefers-reduced-motion.</p><p>Если пользователь отключил анимации на уровне системы, плавная прокрутка не будет навязываться. Если JavaScript не загрузился, кнопка остаётся обычной ссылкой на начало документа.</p><p>Полный независимый аудит WCAG 2.2 AA и тестирование масштабирования 200% и 400% пока находятся в roadmap, поэтому называть компонент полностью сертифицированным по WCAG было бы неправильно. Но структурные требования — клавиатурная доступность, фокус, reduced motion, forced-colors и безопасная работа без JavaScript — уже заложены в компонент и покрываются тестами.</p><h2>CSP и загружаемые SVG</h2><p>В корпоративных проектах часто нельзя просто добавить inline-скрипт и включить unsafe-inline ради одной кнопки.</p><p>По умолчанию компонент использует same-origin CSS и JavaScript. Для него подходит политика такого вида:</p><p>Настраиваемые цвета и размеры отдаются не через inline-стили, а через версионированный stylesheet endpoint. Это позволяет сохранить простой контракт с одним template-тегом и не ослаблять CSP.</p><p>Отдельно пришлось подумать о загружаемых SVG. Админ не рендерит исходный файл как есть: SVG проходит санитарную обработку. Скрипты, обработчики событий, внешние ресурсы, встроенные документы и небезопасные namespace отклоняются. Для загружаемых иконок также хранится информация об авторе, источнике и лицензии.</p><h2>Ревизии, публикация и откат</h2><p>Одна из самых полезных вещей в пакете — не сама кнопка, а жизненный цикл её настроек.</p><p>Можно создать черновик, посмотреть результат в live preview, опубликовать изменения или вернуться к предыдущей версии. Это особенно удобно, когда кнопку настраивает не разработчик, а контент-менеджер или дизайнер.</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/c9840966-4e32-4506-807a-ac78830fecfa.webp" alt="Живой предпросмотр" /><figcaption>Живой предпросмотр</figcaption></figure><p>У ревизий есть три состояния:</p><ul><li>draft — редактируемый черновик;</li><li>published — текущая активная конфигурация;</li><li>archived — сохранённая версия для отката.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/2fcf0cfc-b29e-4ce1-b1de-9c07aac1fce0.webp" alt="настройки ревизий профиля кнопки" /><figcaption>настройки ревизий профиля кнопки</figcaption></figure><h2>Где пакет уместен, а где нет</h2><p>django-scroll-to-top имеет смысл, когда кнопка нужна в нескольких проектах, должна работать в Django Admin, настраиваться без деплоя или жить в окружении со строгими требованиями к CSP и интерфейсу.</p><p>Для лендинга на одну страницу проще и правильнее написать несколько строк самостоятельно. Это будет быстрее, понятнее и дешевле в сопровождении.</p><p>Но если такая маленькая деталь начинает повторяться в нескольких продуктах, появляется необходимость поддерживать мобильную версию, доступность, независимые настройки для сайтов и админки, то отдельный компонент уже перестаёт быть избыточным.</p><p>Сейчас пакет выпущен как beta-версия 0.2.0, требует Python 3.10+ и поддерживает Django 4.2 LTS, 5.x и 6.0. Лицензия — MIT.</p><p>Исходный код, документация и примеры использования доступны в GitHub-репозитории проекта.</p><p>Пакет опубликован в PyPI под именем django-scroll-to-top.</p><p>Обратная связь, баг-репорты и предложения по интеграции с кастомными Django Admin-темами приветствуются в Issues.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 библиотек JavaScript, которые можно забыть в 2025 году</title>
      <link>https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu</link>
      <comments>https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu</guid>
      <description><![CDATA[<p>Неактуальные библиотеки и фреймворки JavaScript, о которых можно забыть в 2025 году. Более современные и производительные аналоги. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu">10 библиотек JavaScript, которые можно забыть в 2025 году</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Feb 2025 10:01:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие разработчики, как и люди других профессий, придерживаются консервативных взглядов. Они считают, что если технология старая, но еще работает, нет смысла менять ее на новую. Такие программисты продолжают пользоваться неактуальными библиотеками для написания кода, не обращая внимания на современные тренды.</p><p>Это в корне неправильный подход. Устаревшие фреймворки и библиотеки не отвечают текущим требованиям к производительности, масштабируемости и адаптивности. Они не успевают за новейшими парадигмами и функциями, что неизбежно отражается на качестве создаваемых продуктов.</p><p>В нашем обзоре — 10 библиотек JavaScript, которым в 2025 году пора сказать «До свидания». Для каждого продукта из антирейтинга мы подобрали альтернативные варианты.</p><h2>Фреймворки, которые утратили актуальность в 2025 году</h2><h3>jQuery</h3><p>Это одна из первых библиотек JavaScript, которая из-за инерционного мышления все еще входит в некоторые списки самых популярных инструментов разработки. Пользователи ценят jQuery за кроссбраузерную поддержку, лаконичный синтаксис и простые алгоритмы взаимодействия с DOM.</p><p>Почему прогеры продолжают пользоваться библиотекой? Чисто технически jQuery присутствует во множестве сайтов, сделанных 10-15 лет назад (тогда этот код стал альтернативой VanillaJS). Библиотека создавалась, чтобы сделать язык более гибким и удобным в разработке.</p><p>Сегодня многие преимущества jQuery утратили свою актуальность — например, создание кода, работающего на всех браузерах. Теперь платформы стандартизированы, что делает кроссбраузерные решения библиотеки ненужными.</p><p>Кроме того, современные нативные API JavaScript серьезно улучшились — для подавляющего большинства задач, которые раньше выполнял jQuery, достаточно ванильного JS. Новейшие методики обеспечивают все манипуляции с DOM и взаимодействие веб -страницы с сервером (AJAX-запросы), поэтому необходимость в библиотеке отпадает.</p><p>В 2025 пришло время отпустить jQuery — его применение сейчас может привести к замедлению загрузки веб-страниц и приложений, а уж этого бы нам точно не хотелось.</p><h4>Чем заменить</h4><p>Нативного API JavaScript в ряде случаев будет достаточно для разработки, а для всех остальных ситуаций есть новые версии высокопроизводительных фреймворков React, Vue и Angular.</p><h3>Lodash</h3><p>Когда-то эта универсальная библиотека утилит считалась почти обязательной для каждого проекта на JavaScript. Здесь есть String — функция преобразования для обрезки и переноса в верхний регистр; Object — утилита для  расширения и слияния; Array — для сжатия и изменения; многие другие фичи, включая глубокое клонирование объектов и манипуляции с массивами данных.</p><p>Библиотека Lodash помогала программистам писать более компактный, чистый и простой в обслуживании и поддержке код, конвертировать данные в различные форматы, выполнять математические операции. В настоящее для большинства таких операций утилиты не требуются.</p><h4>Чем заменить</h4><p>Сегодня многие функции, представленные в Lodash, есть в новой спецификации JavaScript E56. Оператор spread (…), методы Array (map, reduce, filter и прочие) решают те же задачи, которые некогда решал Lodash. В число главных недостатков библиотеки входит также ее большой вес — импорт всего одной функции увеличивает накладные расходы проекта.</p><h3>Moment.js</h3><p>Долгое время эта библиотека была основным инструментом для работы с датами. Ее сильными сторонами были:</p><ul><li>способность анализировать, проверять, актуализировать и отображать текущие метки времени;</li><li>работать с календарными датами;</li><li>определять длительность различных процессов;</li><li>поддерживать часовые пояса и т.д.</li></ul><p>Сейчас эта библиотека стала слишком тяжелой — даже в мини-формате она занимает 66 КБ, что излишне нагружает устройства, отражается на производительности и быстрой работе UX-функций. Есть более легкие пакеты с теми же функциями.</p><h4>Чем заменить</h4><p>Современная альтернатива — date-fns — набор функций для работы с датами на JavaScript, который не входит в библиотеки и работает независимо. Предусматривает модульный импорт — вы можете взять из пакета только то, что требуется для работы, тем самым снижая нагрузку.</p><p>Ещё один вариант — Luxon — новая библиотека для работы с датами, созданная командой Moment. Этот инструмент изначально позиционировался как замена предыдущему продукту компании как более мощное, современное и удобное средство. Здесь работа с часовыми поясами реализована без дополнительных расширений, применяется современный подход к написанию кода.</p><p>Кроме того, JavaScript Temporal API позволяет работать с датами и временем напрямую, не используя сторонние библиотеки. Поэтому любое из указанных трех решений делает применение Moment.js избыточным и ненужным.</p><h3>RequireJS</h3><p>Долгое время библиотека была для JavaScript-разработчиков основным инструментом для управления зависимостями. Технология асинхронного определения модулей (AMD) обеспечивала эффективную асинхронную загрузку файлов. Модульный принцип не использовался в других библиотеках и инструментах, что создавало ощущение эксклюзива.</p><p>Это был самый эффективный способ взаимодействия с зависимостями, особенно ценный в работе с большими приложениями. Совместимость со всеми популярными браузерами, включая Firefox, Safari, Chrome, Opera, а также веб-продуктами на Node, была еще одной сильной стороной библиотеки.</p><p>С появлением модулей в ES6 RequireJS утратила статус уникального инструмента. В новой спецификации JavaScript реализован нативный способ определения и импорта модулей. Такой подход делает синтаксис более интуитивным, ускоряет и упрощает разработку.</p><p>При этом RequireJS в сравнении с более свежими аналогами слишком сложен в настройке и применении. Он требует от прогеров ручной настройки загрузчика и управления путями зависимостей, что повышает риск ошибок и отнимает кучу времени. Современные загрузчики более расторопные и автоматизированные.</p><h4>Чем заменить</h4><p>Помимо ES6, с модулями успешно работает сборщик Webpack, компилируя их в единый файл. Это еще более эффективный инструмент, совместимый с TypeScript и Node.js. При запуске программа обрабатывает модули, выстраивает граф зависимостей между ними и на его основе генерирует общий файл.</p><p>У этого бендлера есть дополнительные продвинутые возможности — например, разделение кода, горячая замена модулей в реальном времени, а также операция tree shaking (встряхивание дерева), то есть удаление мертвого кода из продукта. Webpack делает работу с зависимостями более рациональной и полностью заменяет тяжелый и устаревший RequireJS.</p><h3>Backbone.js</h3><p>Одна из первых библиотек JS (выпущена в 2010), основанная на шаблоне проектирования Model-View-Controller. Предназначена, в основном, для разработки пользовательских интерфейсов и структурирования веб-приложений.</p><p>Некогда  Backbone.js считался легковесным и функциональным инструментом, который упрощал работу с кодом, улучшал синхронизацию приложения с сервером и позволял создавать эффективный клиентский код.</p><p>Со временем у фреймворка стали проявляться ограничения. Например, отсутствие механизма двусторонней привязки данных. Такая опция есть у многих современных библиотек, поэтому разработчикам не приходится при каждом обновлении или изменении модели вручную настраивать DOM и множить шаблонный код. Все прогеры в курсе, что ручные операции существенно повышают риск ошибок.</p><p>Кроме того, в Backbone.js нет собственного шаблонизатора, что вынуждает применять другие библиотеки типа Handlebars.js.</p><h4>Чем заменить</h4><p>Достойных вариантов замены достаточно. Это React с его архитектурой, основанной на компонентах, и виртуальным DOM. Это и Vue.js с двусторонней привязкой данных и гибкой архитектурой. Это также универсальный Angular с теми же функциями.</p><h3>Modernizr</h3><p>Библиотека обнаружения особенностей HTML5 и CSS3 в браузере пользователя. В свое время была крайне полезной и обеспечивала работу приложений в разных браузерах.</p><p>С появлением транпислеров (программ, которые переводят части кода с одного языка программирования на другой) необходимость в Modernizr существенно снизилась. Более того, использование этого инструмента чревато увеличением расходов на приложения. Разработчикам приходится задействовать множество тестов на обнаружение функций, что замедляет загрузку.</p><h4>Чем заменить</h4><p>Компилятор (транспилер) JavaScript Babel успешно решает задачу преобразования современного кода в формат, совместимый со старыми версиями браузеров. Кроме того, Babel — полифил, то есть способен заполнять пробелы в скрипте с целью добавления новых функций.</p><h3>MooTools</h3><p>Объектно-ориентированный фреймворк, некогда популярный и безальтернативный. MooTools содержит комплект утилит для работы с DOM, событиями и AJAX-запросами. Сильными сторонами библиотеки был объектно-ориентированный подход и лаконичный синтаксис. Разрабы, предпочитающие писать элегантный и ясный код, были от MooTools в восторге.</p><p>Однако постепенно все преимущества фреймворка нивелировались — сообщество так и не дождалось существенных обновлений и перешло на более прогрессивные инструменты. В сравнении с ними MooTools занимает много места, что негативно сказывается на приложениях, где важна производительность (а сегодня она важна везде).</p><h4>Чем заменить</h4><p>В современной версии Vanilla JavaScript реализована большая часть функций, представленных в MooTools, в том числе методы для работы с DOM и для обработки событий.</p><p>Что касается полноценных библиотек, то MooTools без проблем заменят React или Vue.js. Это простые в освоении и использовании прогрессивные фреймворки для разработки пользовательских интерфейсов.</p><h3>Script.aculo.us</h3><p>Библиотека визуальных эффектов и методов управления пользовательским интерфейсом. Была популярна у разработчиков, работающих с анимацией и интерактивными опциями в приложениях. Сильные стороны Script.aculo.us — простота в применении, обширный ассортимент возможностей — перетаскивание, сортировка, слайдеры и т.д.</p><p>Отсутствие значительных обновлений и большой вес были факторами, которые ослабили позиции Script.aculo.us в сообществе. Если в 2025 году в мире еще остались программисты, которые пользуются этой библиотекой, им точно пора осваивать новые инструменты.</p><h4>Чем заменить</h4><p>GreenSock — более мощная, быстрая и универсальная библиотека анимации с огромным выбором эффектов и элементов управления. Работает на стороне клиента и сервера, совместима со всеми браузерами.</p><p>Anime.js — еще один гибкий и адаптивный инструмент. Подходит новичкам, поскольку его просто настраивать и легко использовать.</p><h3>Underscore.js</h3><p>Библиотека утилит, которая годами удерживала лидирующие позиции в разработке на  JavaScript. Эксперты называли ее «швейцарским ножом разработчика» за большой выбор функций и массу возможностей.</p><p>Однако с этим инструментом произошло то же, что и другими библиотеками утилит. Большинство функций, которые были представлены в Underscore.js, теперь реализованы в ES6.</p><h4>Чем заменить</h4><p>Новая спецификация JavaScript E56+ поддерживает методы функционального программирования, позволяет манипулировать объектами и массивами данных. Таким образом, все функции Underscore.js доступны непосредственно на JavaScript без всяких посредников. Вывод — переносите код на E56+, он станет чище и проще в поддержке.</p><h3>Axios</h3><p>Библиотека для отправки запросов HTTP из браузера или Node.js. Поддерживает множество методов запросов (Get, Put, Delete и другие), загрузку и отправку файлов. Сильные стороны — удобный интерфейс, поддержка Promise API (способ организации асинхронного кода).</p><p>Несмотря на популярность Axios и его относительную свежесть, эта библиотека стремительно теряет позиции, поскольку появились новые инструменты с более расширенным функционалом.</p><h4>Чем заменить</h4><p>Fetch API превосходит конкурента по простоте и гибкости. Он выполняет те же задачи, но оснащен дополнительными функциями — потоковой передачей, отменой запросов, улучшенной обработкой ошибок.</p><p>Замена устаревших библиотек новыми — не только погоня за трендами и стремление к прогрессу, но и возможность создавать более производительные, легкие и экономичные веб-страницы и приложения.</p><p>В эпоху, когда быстродействие, лаконичность и оптимизация ценятся как разработчиками, так и юзерами, использование наиболее эффективных инструментов становится ключевым конкурентным преимуществом поставщиков цифровых продуктов.</p><p>Делитесь в комментариях, на какие библиотеки перешли! Ну а если хотите детальнее разобраться во всех аспектах Java и JavaScript, заходите в наш <a href="https://t.me/+b_gDXaX2fMIwODky">тг-канал</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Tproger Changelog: добрые комментарии, красивые картинки и путь избавления от jQuery</title>
      <link>https://tproger.ru/articles/tproger-changelog-09-20</link>
      <comments>https://tproger.ru/articles/tproger-changelog-09-20?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tproger-changelog-09-20</guid>
      <description><![CDATA[<p>Алексей рассказывает о падении сайта и увеличении шрифтов, Игорь — об изменениях в работе с изображениями, Аня — о сложностях работы в медиа.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tproger-changelog-09-20">Tproger Changelog: добрые комментарии, красивые картинки и путь избавления от jQuery</a>»</p>]]></description>
      <category><![CDATA[Tproger Changelog]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 Oct 2020 08:55:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этом ченжлоге Алексей рассказывает про падение сайта при тестировании новой функциональности и про увеличение шрифтов, Игорь делится приятным изменением в работе с изображениями, а Аня рассуждает про сложности работы в медиа и благодарит вас за положительные комментарии.</p><p>В ночь с четверга на пятницу, 2 октября, у нас падал сайт. Примерно с трёх ночи до десяти утра многие страницы не открывались вообще.</p><p>Причина оказалась простой: мы тестировали новые рассылки в боте. Для этого нужно подключаться к продакшен базе и получать свежие посты. Бот не закрывал MySQL-соединение и мы быстро достигли лимита в 255 открытых дескрипторов (ограничение managed MySQL от DO). Я закрыл подключение для бота и минут через 15 база данных разрешила к себе подключаться.</p><figure><img src="https://media.tproger.ru/uploads/2020/10/Untitled-19.png" alt="" /></figure><p>Выводы — настраивайте больше алертов на неочевидные метрики. Количество подключений не приводит к перегрузке по памяти или ЦП, и мы не смогли отловить состояние текущим мониторингом для принятия превентивных действий. Ну и пишите качественный код, не забывайте закрывать открытые соединения с чем бы то ни было.</p><p>Из хорошего: мы увеличили базовый шрифт на сайте с 16 до 17 пикселей, читать статьи стало приятнее. Это потянуло за собой увеличение и других шрифтов, а также корректировки по отступам и в целом вёрстке. Изменение лучше заметно на мобильных:</p><figure><img src="https://media.tproger.ru/uploads/2020/10/Untitled-17.png" alt="" /></figure><p>Ещё мы наконец победили проблемы с CLS и даже написали про это отдельную статью, которая может помочь и вам:</p><p>Я сделал для нашего сайта несколько приятных обновлений. Одно из них вы можете увидеть, если кликните по любому изображению прямо в этой статье.</p><p>В ходе нашей борьбы с jQuery пришла очередь избавиться от библиотеки просмотра изображений Lightbox, но увеличение картинки при клике мы терять не хотели. И среди нескольких кандидатов на замену мы выбрали библиотеку <a href="https://photoswipe.com/">Photoswipe</a>.</p><p>Что получили в итоге:</p><ol><li>Самобытную библиотеку просмотра изображений, с возможностью настройки под наши требования.</li><li>Увеличение картинок происходит с красивой анимацией и поддержкой адаптивности.</li><li>В скорости загрузки особых изменений нет, но это минус одна зависимость от jQuery, а значит на дальней дистанции мы ожидаем получить прирост скорости.</li><li>В скором времени на основе этой библиотеки появятся галереи.</li></ol><p>Работать в медиа не всегда просто. Часто тебе нужно искать баланс между тем, что ты сам хочешь транслировать, что хотят читать люди, на что у тебя есть ресурсы. Усложняет дело то, что редко получается получить прямой фидбек. Ты можешь посмотреть на техническую информацию: сколько просмотров, как долго люди остаются на странице, как много людей уходит, не дочитав материал. Ты смотришь на эти цифры и пытаешься понять: нравится или не нравится, что именно нравится, что стоит повторить, а чего избегать.</p><p>Иногда мы всё-таки получаем живой фидбек — через комментарии. Но чаще всего он бывает негативным, потому что люди склонны скорее писать об ошибках, чем хвалить, потому что если всё ок — чего писать-то? Тем удивительнее для меня было то, что когда мы запустили свои комментарии на сайте и начали появляться первые комментарии, многие из них были положительными! Люди благодарили за материалы, писали, что им понравилось, что материал пригодился. В это было так сложно поверить, что я даже заподозрила в этом атаку каких-то дружелюбных ботов ?</p><p>В этих итогах месяца я бы хотела сказать спасибо всем, кто писал нам комментарии, всем, кто читает наши статьи и участвует в жизни нашего сайта. Спасибо всем, кто высказывает своё мнение: и отрицательное — потому что оно показывает, в чём мы можем стать лучше, — и положительное, потому что оно даёт нам силы становиться лучше.</p><p>Доброго нам всем месяца и новых успехов.</p><p><a href="https://media.tproger.ru/uploads/2020/10/chenzhlog_nju.jpg"></a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как отказаться от jQuery в современном фронтенде: опыт команды GitHub</title>
      <link>https://tproger.ru/translations/removing-jquery-from-github-frontend</link>
      <comments>https://tproger.ru/translations/removing-jquery-from-github-frontend?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/removing-jquery-from-github-frontend</guid>
      <description><![CDATA[<p>История работы GitHub с jQuery: почему библиотека понадобилась в 2007 году, когда стало ясно, что пора уходить, и как обошлись без других фреймворков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/removing-jquery-from-github-frontend">Как отказаться от jQuery в современном фронтенде: опыт команды GitHub</a>»</p>]]></description>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Sep 2018 14:50:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Не так давно GitHub полностью перестал использовать jQuery в своём фронтенд-коде. Мы перевели пост, в котором разработчики рассказывают, с чего началась их работа с jQuery, как они поняли, что пора от него отказываться, и как они смогли сделать это без использования других библиотек или фреймворков.</p><h2>Зачем jQuery был нужен раньше?</h2><p><a href="https://blog.jquery.com/2007/09/16/jquery-1-2-1-released/">jQuery 1.2.1</a> вошёл в число зависимостей GitHub в конце 2007 года. Это произошло за год до того, как Google выпустил первую версию браузера Chrome. На тот момент не было общепринятого способа обращаться к элементам DOM с помощью CSS-селектора, не было стандартного способа добавить анимацию к стилю элемента, а интерфейс <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest">XMLHttpRequest</a>, предложенный Internet Explorer, как и многие API, был плохо совместим с браузерами.</p><p>С jQuery стало гораздо проще управлять DOM, создавать анимации и делать AJAX-запросы. У веб-разработчиков появилась возможность создавать более современные, динамические сайты, которые выделялись среди остальных. Самое главное, все функции JavaScript, проверенные в одном браузере с помощью jQuery, как правило, работали и в других браузерах. На заре GitHub, когда большинство его функций только обретали форму, появление jQuery позволило небольшой команде разработчиков быстро создавать прототипы и представлять новые функции без необходимости подстраивать их отдельно под каждый браузер.</p><p>Простой интерфейс jQuery также послужил основой для создания библиотек, которые в будущем стали компонентами остальной части фронтенда GitHub.com: <a href="https://github.com/defunkt/jquery-pjax">pjax</a> и <a href="https://github.com/defunkt/facebox">facebox</a>.</p><h2>Веб-стандарты в последующие годы</h2><p>С течением времени GitHub превратился в компанию с сотнями разработчиков и постепеннно сформировалась команда, которая отвечала за размер и качество JavaScript-кода, который мы отправляем браузерам. Одна из вещей, за которыми мы постоянно следим, — технический долг, порой вырастающий из некогда полезных зависимостей, которые потеряли свою актуальность по прошествии времени.</p><p>Когда очередь дошла до jQuery, мы сравнили его с развивающимся веб-стандартом в браузерах и поняли, что:</p><ul><li>Шаблон $(selector) можно легко заменить на querySelectorAll();</li><li>Переключение CSS-классов теперь можно осуществить с помощью <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/classList">Element.classList</a>;</li><li>CSS теперь поддерживает создание <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Using_CSS_animations">анимации в таблицах стилей</a>, а не в JavaScript;</li><li>$.ajax-запросы можно выполнять с помощью <a href="https://fetch.spec.whatwg.org">Fetch Standard</a>;</li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener">Интерфейс</a> addEventListener() достаточно стабилен для кроссплатформенного использования;</li><li><a href="https://github.com/dgraham/delegated-events#readme">Шаблон делегирования событий</a> легко инкапсулировать с помощью легковесной библиотеки;</li><li>С эволюцией JavaScript часть синтаксического сахара jQuery устарела.</li></ul><p>Кроме того, синтаксис цепочек команд не удовлетворял нашим представлениям о коде, который мы хотели бы писать в будущем. Например:</p><p>Такой синтаксис прост в написании, однако по нашим стандартам не очень хорошо передаёт намерения автора. Сколько элементов js-widget, по его задумке, должно быть на странице: один или больше? А если мы обновим разметку страницы и случайно оставим имя класса js-widget, будет ли выброшено исключение, которое сообщит нам, что что-то пошло не так? По умолчанию jQuery молча пропускает всё выражение, когда нет совпадений по начальному селектору; однако для нас такое поведение было больше багом, нежели фичей.</p><p>Наконец, нам хотелось начать аннотировать типы с <a href="https://flow.org">Flow</a>, чтобы проводить статическую проверку типов во время сборки, и мы пришли к выводу, что синтаксис цепочек плохо поддаётся статическому анализу, так как почти каждый результат вызова метода jQuery одного и того же типа. Из возможных вариантов мы выбрали именно Flow, так как тогда такие возможности, как режим @flow weak, позволили нам начать прогрессивно и эффективно применять типы к кодовой базе, которая по большей части была нетипизированной.</p><p>В конечном счёте отказ от jQuery означает, что мы можем больше полагаться на веб-стандарты, использовать <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript">веб-документацию MDN</a> в качестве официальной документации для наших фронтендеров, поддерживать более гибкий код в будущем и уменьшить вес наших зависимостей на 30 Кбайт, что в итоге увеличит скорость загрузки страницы и выполнения JavaScript.</p><h2>Постепенный переход</h2><p>Хотя наша конечная цель была не за горами, мы знали, что было бы нецелесообразно направить все имеющиеся ресурсы на переписывание всего с jQuery на чистый JS. Во всяком случае, такое поспешное решение негативно бы сказалось на функциональности сайта, от которой нам бы пришлось отказаться. Вместо этого мы:</p><ul><li>Начали отслеживать количество вызовов jQuery на строку кода и следили за графиком на протяжении времени, чтобы убедиться, что он либо не меняется, либо падает, но не растёт.<a href="https://media.tproger.ru/uploads/2018/09/jquery-usage.png"></a></li><li>Отказались от использования jQuery в новом коде. Чтобы достичь этого с помощью автоматизации, мы создали <a href="https://github.com/dgraham/eslint-plugin-jquery#readme">eslint-plugin-jquery</a>, который проваливал CI-тесты при попытке использовать возможности jQuery вроде $.ajax.</li><li>В старом коде появилось много нарушений правил eslint, которые мы пометили с помощью специальных правил eslint-disable в комментариях. Для того, кто будет это читать, такие комментарии должны были служить явным сигналом того, что здесь не отражаются наши текущие методы написания кода</li><li>Мы написали бота, который при отправке pull request’а оставлял комментарий, сигнализирующий нашей команде каждый раз, как кто-то хотел добавить новое правило eslint-disable. Таким образом мы могли провести ревью кода на ранней стадии и предложить альтернативы.</li><li>Большая часть старого кода была явно связана с внешними интерфейсами jQuery-плагинов pjax и facebox, поэтому мы оставили их интерфейсы почти без изменений, в то время как изнутри заменили их реализацией на чистом JS. Наличие статической проверки типов вселило в нас уверенность в проводимом рефакторинге.</li><li>Много старого кода было связано с <a href="http://josh.github.io/rails-behaviors/">rails-behaviors</a>, нашим адаптером для Ruby on Rails, таким образом, что он присоединял обработчик жизненного цикла AJAX к определённым формам:// УСТАРЕВШИЙ ПОДХОД  $(document).on('ajaxSuccess', 'form.js-widget', function(event, xhr, settings, data) {    // вставка данных ответа куда-нибудь в DOM  })Вместо того чтобы переписывать все эти вызовы согласно новому подходу, мы решили использовать ложные события жизненного цикла ajax*, и формы продолжали отправлять данные асинхронно, как и раньше; только теперь изнутри использовался fetch().</li><li>Мы поддерживали свою сборку jQuery, из которой убирали ненужные нам модули и заменяли более лёгкой версией. Например, после избавления от всех jQuery-специфичных CSS-псевдоселекторов вроде :visible или :checkbox мы смогли убрать <a href="https://sizzlejs.com">модуль Sizzle</a>; а когда мы заменили $.ajax-вызовы на fecth(), мы смогли отказаться от модуля AJAX. Мы убивали двух зайцев разом: уменьшали время выполнения JavaScript, параллельно гарантируя то, что никто не напишет код, который будет пытаться использовать удалённую функциональность.</li><li>Глядя на статистику нашего сайта, мы старались прекратить поддержку Internet Explorer настолько быстро, насколько это возможно. Как только использование определённой версии IE падало ниже определённого порога, мы прекращали её поддержку и фокусировались на более современных браузерах. Отказ от поддержки IE 8-9 на раннем этапе позволил нам использовать многие нативные возможности браузеров, которые в противном случае было бы сложно «заполифиллить».</li><li>В рамках нашего усовершенствованного подхода к написанию фронтенда GitHub мы сосредоточились на использовании обычного HTML по-максимуму, добавляя JavaScript в качестве последовательного улучшения. В итоге даже те формы и другие элементы интерфейса, которые были улучшены с помощью JS, как правило, могли работать даже с выключенным в браузере JavaScript. В некоторых случаях нам даже удалось удалить определённую устаревшую функциональность вместо её переписывания на чистом JS.</li></ul><p>Благодаря этим и аналогичным усилиям с течением времени мы постепенно смогли уменьшить нашу зависимость от jQuery вплоть до того момента, когда не осталось ни одной строки кода, ссылающейся на эту библиотеку.</p><h2>Custom Elements: пользовательские элементы</h2><p>Одна технология, наделавшая шуму в последние годы, — <a href="https://developers.google.com/web/fundamentals/web-components/customelements">Custom Elements</a>: библиотека компонентов, встроенная в браузер, что означает отсутствие необходимости для пользователя качать, парсить и компилировать дополнительные байты фреймворка.</p><p>Мы создали несколько пользовательских элементов на основе спецификации v0 с 2014 года. Однако, поскольку стандарты в то время постоянно менялись, мы сильно в это не вкладывались. А <a href="https://github.com/search?q=topic%3Aweb-components+org%3Agithub">начали только с 2017 года</a>, когда была выпущена спецификация Web Components v1, реализованная как в Chrome, так и в Safari.</p><p>Во время перехода с jQuery мы искали структуры, которые можно было бы извлечь в качестве пользовательских элементов. Например, мы преобразовали код facebox, использованный для отображения модальных диалогов, в <a href="https://github.com/github/details-dialog-element#readme">элемент</a> &lt;details-dialog&gt;.</p><p>Наша общая философия прогрессивного улучшения относится и к пользовательским элементам. Это значит, что мы стараемся хранить как можно больше контента в разметке и только добавлять поведение поверх неё. Например, &lt;local-time&gt; по умолчанию показывает исходную временную метку, но с улучшением может переводить время в местный часовой пояс, а &lt;details-dialog&gt;, расположенный внутри элемента &lt;details&gt;, интерактивен даже без JavaScript, но может быть улучшен до расширенных возможностей доступа.</p><p>Вот пример того, как можно реализовать элемент &lt;local-time&gt;:</p><p>Один из аспектов Web Components, который мы очень хотим перенять, — <a href="https://developers.google.com/web/fundamentals/web-components/shadowdom">Shadow DOM</a>. У Shadow DOM есть потенциал для раскрытия множества возможностей для веба, однако он также усложняет полифиллинг. Так как его полифиллинг на данный момент приведёт к снижению производительности даже для кода, который управляет частями DOM, не относящихся к веб-компонентам, для нас нецелесообразно использовать его в продакшне.</p><h2>Полифиллы</h2><p>Здесь вы можете увидеть полифиллы, которые помогли нам перейти к использованию встроенных возможностей браузера. Мы стараемся использовать их, только когда это совершенно необходимо, т.е. как часть отдельного JavaScript-бандла для совместимости с устаревшими браузерами.</p><ul><li><a href="https://github.com/github/eventlistener-polyfill#readme">github/eventlistener-polyfill</a></li><li><a href="https://github.com/github/fetch#readme">github/fetch</a></li><li><a href="https://github.com/github/form-data-entries#readme">github/form-data-entries</a></li><li><a href="https://github.com/iamdustan/smoothscroll#readme">iamdustan/smoothscroll</a></li><li><a href="https://github.com/javan/details-element-polyfill#readme">javan/details-element-polyfill</a></li><li><a href="https://github.com/jonathantneal/closest#readme">jonathantneal/closest</a></li><li><a href="https://github.com/kumarharsh/custom-event-polyfill#readme">kumarharsh/custom-event-polyfill</a></li><li><a href="https://github.com/marvinhagemeister/request-idle-polyfill#readme">marvinhagemeister/request-idle-polyfill</a></li><li><a href="https://github.com/mathiasbynens/Array.from#readme">mathiasbynens/Array.from</a></li><li><a href="https://github.com/mathiasbynens/String.prototype.codePointAt#readme">mathiasbynens/String.prototype.codePointAt</a></li><li><a href="https://github.com/mathiasbynens/String.prototype.endsWith#readme">mathiasbynens/String.prototype.endsWith</a></li><li><a href="https://github.com/mathiasbynens/String.prototype.startsWith#readme">mathiasbynens/String.prototype.startsWith</a></li><li><a href="https://github.com/medikoo/es6-symbol#readme">medikoo/es6-symbol</a></li><li><a href="https://github.com/nicjansma/usertiming.js#readme">nicjansma/usertiming.js</a></li><li><a href="https://github.com/rubennorte/es6-object-assign#readme">rubennorte/es6-object-assign</a></li><li><a href="https://github.com/stefanpenner/es6-promise#readme">stefanpenner/es6-promise</a></li><li><a href="https://github.com/webcomponents/template#template">webcomponents/template</a></li><li><a href="https://github.com/webcomponents/URL#readme">webcomponents/URL</a></li><li><a href="https://github.com/webcomponents/webcomponentsjs#readme">webcomponents/webcomponentsjs</a></li><li><a href="https://github.com/WebReflection/url-search-params#readme">WebReflection/url-search-params</a></li><li><a href="https://github.com/yola/classlist-polyfill#readme">yola/classlist-polyfill</a></li></ul><p>Смотрите также: «<a href="https://tproger.ru/translations/oop-js-fundamentals/">Фундаментальные принципы объектно-ориентированного программирования на JavaScript</a>»</p>]]></content:encoded>
    </item>
    <item>
      <title>Краткая шпаргалка по jQuery: селекторы, атрибуты CSS, манипуляции с DOM, события и другие способы использования библиотеки</title>
      <link>https://tproger.ru/articles/jquery-cheatsheet</link>
      <comments>https://tproger.ru/articles/jquery-cheatsheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/jquery-cheatsheet</guid>
      <description><![CDATA[<p>Методы и атрибуты jQuery по разделам — селекторы, атрибуты CSS, работа с DOM, обход элементов, события, AJAX и эффекты — в виде картинки и PDF.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/jquery-cheatsheet">Краткая шпаргалка по jQuery: селекторы, атрибуты CSS, манипуляции с DOM, события и другие способы использования библиотеки</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Материалы от друзей Tproger]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Mar 2017 19:26:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>В нашу редакцию поступило письмо от веб-разработчика Роба Менинга — он показал нам свою шпаргалку по jQuery и предложил разместить ее на Tproger. Шпаргалка представлена в двух форматах: в виде большой картинки и PDF-файла — и разбита на разделы: в каждом из них кратко представлены все методы и атрибуты jQuery. Такая шпаргалка будет очень полезна и новичку, и уже опытному веб-разработчику для повседневного использования, поэтому мы решили поделиться ею с вами.</p><p>Мы разбили оригинальную картинку на разделы, но если вам удобнее использовать один большой файл, то его можно скачать <a href="https://media.tproger.ru/uploads/2017/03/Jquery-Cheat-Sheet-WSU.png">здесь</a>.</p><h4>Селекторы</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/1-selectors-929x1024.png" alt="" /></figure><h4>Атрибуты / CSS</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/2-attribute-1024x625.png" alt="" /></figure><h4>Манипуляции с DOM</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/3-manipulation-1024x490.png" alt="" /></figure><h4>Обход элементов</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/4-traversing-1024x474.png" alt="" /></figure><h4>События</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/5-events-1024x957.png" alt="" /></figure><h4>Эффекты</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/6-effects-1024x490.png" alt="" /></figure><h4>Ajax</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/7-ajax-1024x356.png" alt="" /></figure><h4>Возможности самого jQuery</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/8-core-736x1024.png" alt="" /></figure><p>PDF-файл со всеми разделами шпаргалки, собранными вместе:</p><p><a href="https://media.tproger.ru/uploads/2017/03/wsu-jquery-cheat-sheet.pdf">Ссылка на PDF</a> для тех, у кого не работает встраивание PDF в браузере.</p><p>Благодарим Роба Менинга, автора сайта <a href="https://websitesetup.org">WebsiteSetup</a>, за предоставленный <a href="https://websitesetup.org/jquery-cheat-sheet/">материал</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>17 нововведений jQuery 3 и советы по их использованию</title>
      <link>https://tproger.ru/translations/new-features-of-jquery-3</link>
      <comments>https://tproger.ru/translations/new-features-of-jquery-3?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Глеб Умаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/new-features-of-jquery-3</guid>
      <description><![CDATA[<p>Разбор изменений в версии jQuery 3: обновлённые методы скрытия и отображения элементов, новые возможности и советы по применению.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/new-features-of-jquery-3">17 нововведений jQuery 3 и советы по их использованию</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Feb 2017 23:11:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Прошло уже более 10 лет с того момента, как библиотека jQuery начала своё широкое распространение по Интернету, и она до сих пор пользуется большой популярностью. В июле 2015 года jQuery анонсировала альфа-версию 3.0 — крупнейшее обновление за долгие годы.</p><p>Текущая версия 3.1.1, <a href="http://blog.jquery.com/2016/09/22/jquery-3-1-1-released/">вышедшая в сентябре 2016 года</a>, исправила множество багов, добавила новые методы и удалила избыточные, также изменив поведение некоторых функций. Давайте разберемся в нововведениях, которые были представлены в этой версии.</p><h3>Методы скрытия и отображения</h3><p>Для лучшей совместимости с адаптивным дизайном jQuery3 была усовершенствована, получив возможность скрытия нескольких элементов. <a href="http://jsperf.com/old-vs-new-show-hide/3">Тесты</a> показали, что новая версия справляется с этим на 2% быстрее, чем предыдущая.</p><figure><img src="https://media.tproger.ru/uploads/2017/02/26xBHo21LLLJ4z3d6.gif" alt="" /></figure><p>Кроме того, методы .hide(), .show() и .toggle() будут ориентироваться на inline-стили. Эта особенность позволит корректно работать с функцией display, что позволит правилам CSS изменяться динамически в зависимости от таких событий, как изменение разрешения окна и ориентации экрана.</p><h3>Методы wrapAll() и unwrap()</h3><p>В jQuery 2 метод .wrapAll() при передаче функции в качестве аргумента вёл себя точно так же, как и метод .wrap(). Это изменили — теперь .wrapAll(function) вызывает функцию и использует строковое представление результата как обёртку коллекции.</p><p>В jQuery 3 также появился опциональный параметр-селектор метода unwrap(). Это нововведение позволяет передавать методу строковое значение, которое содержит выражение селектора.</p><h3>Полосы прокрутки высоты и ширины теперь учитываются</h3><p>В jQuery 2 вызов $(window).width() возвращал ширину содержимого, не учитывая полосы прокрутки, добавленные браузером, когда содержимое превышало размеры элемента. Для того, чтобы предоставить возможность измерения, эквивалентную CSS-медиазапросу, $(window).outerWidth() и $(window).outerHeight() теперь возвращают ширину и длину с учётом полос прокрутки. Это эквивалентно свойству DOM window.innerWidth.</p><h3>Поведение data()</h3><p>В jQuery 3 поведение метода data() было немного изменено, чтобы он подходил под спецификации Dataset API. Теперь он переводит имена свойств в <a href="https://tproger.ru/translations/camelcase-vs-underscores-scientific-showdown/">верблюжью нотацию</a>.</p><p>При использовании старой версии вы получите следующий результат:</p><p>В jQuery 3 вы получите:</p><p>Как вы заметили, название параметра переведено в верблюжью нотацию, в то время как в старых версиях параметр оставался в нижнем регистре с дефисом.</p><h3>Поддержка SVG при операциях с классами</h3><p>jQuery до сих пор не полностью поддерживает SVG, но методы наподобие .hasClass() или .addClass(), которые управляют CSS-классами, могут быть использованы для работы с SVG. Вы можете изменять или находить классы в SVG, затем применять стили к классам, используя CSS.</p><h3>Фильтры скрытия и отображения</h3><p>jQuery 3 изменяет смысл фильтров :visible и :hidden. Он воспринимает элементы как :visible, если у них есть хоть какие-то окна макета, включая те, которые имеют нулевую ширину и длину. Для примера, элемент br и строковые элементы без содержимого будут выделены фильтром :visible.</p><p>Если вы имеете следующую HTML-страницу:</p><p>и запускаете выражение:</p><p>то в jQuery 2, вы получите результат 0, а в третьей версии результат будет равен 3.</p><h3>jQuery больше не округляет параметры высоты и ширины</h3><p>Теперь jQuery возвращает дробные значения .width() и .height() вместо целого числа, если браузер поддерживает это. Для пользователей, которым нужна субпиксельная точность (например, при дизайне веб-сайтов), это может быть полезным.</p><p>Например, у вас есть 3 элемента с шириной, равной одной третьей (33.333333%), внутри контейнера шириной 100px:</p><p>Если вы запросите ширину дочернего элемента:</p><p>то получите значение 33.33333, что будет являться более точным результатом.</p><h3>Дополнительный уровень защиты</h3><p>Дополнительный уровень был добавлен для защиты от <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3">межсайтового скриптинга (XSS)</a>. Разработчикам теперь нужно уточнять dataType:”script” в опциях методов $.ajax() и $.get(). Это предотвращает возможность атак. Предоставляем пример кода:</p><h3>Неприменимый хеш</h3><p>jQuery 3 возвращает синтаксическую ошибку, если строка селектора состоит лишь из хеша, вроде jQuery("#") или .find("#"). В старой версии $("#") возвращал пустое множество, а .find("#") — ошибку.</p><h3>Новый метод для выделения строк</h3><p>Новый метод jQuery.escapeSelector() позволяет вам выделить любую строку или символ, которые имеют определенное значение в CSS-селекторах.</p><p>Например, если элемент на странице имеет id “abc.xyz”, то он не может быть выбран методом $("abc.xyz"), т.к. селектор будет распознан как элемент с id “abc”, и классом “xyz”. Однако он может быть выбран новой функцией $("#" + $.escapeSelector("abc.xyz")).</p><h3>Аргументы jQuery.when()</h3><p>В jQuery 3 при добавлении методом then() аргумента к $.when(), он возвращает его promise-версию. Это расширяет возможности для ввода, включая промисы <a href="https://github.com/petkaantonov/bluebird/blob/master/API.md">Bluebird</a> и промисы ES6, что дает возможность писать более сложные асинхронные обратные вызовы.</p><h3>Хеш в URL</h3><p>Теперь функция jQuery.ajax() больше не удаляет хеш в URL, если он присутствует. Однако, вам придется удалять его вручную до отправки запроса, если сервер на другом конце соединения не может обработать URL с хешем.</p><h3>Deferred-объекты совместимы с JS-промисами</h3><p>Deferred’ы — это объекты которые можно соединять цепными обратными вызовами. jQuery 3 сделал их совместимыми с новыми стандартами Promises/A+. Также есть ключевое изменение в функции .then(). Любое исключение, выбрасываемое в рамках обратного вызова .then(), теперь конвертируется в отклоняемое значение. Непромисообразные значения, возвращенные обработчиком отклонений, меняются на выполняемые значения.</p><p>Устаревший deferred-метод:</p><p>Новый стандарт поведения Promises/A+:</p><h3>Новый API для анимации</h3><figure><img src="https://media.tproger.ru/uploads/2017/02/26gslYXlnrhN4DvAA.gif" alt="" /></figure><p>jQuery 3 использует API requestAnimationFrame() для работы с анимацией. Этот API воспроизводит анимации плавнее и быстрее, затрачивая меньше вычислительного времени. Он используется лишь в тех браузерах, которые поддерживают этот API. Для старых же браузеров, таких как Internet Explorer 9, jQuery использует старый API в качестве запасного варианта.</p><h3>jQuery 3 работает в строгом режиме</h3><p>Большинство браузеров, поддерживающих jQuery3, используют строгий режим (strict mode). Новая версия была создана с учётом это. Несмотря на то, что jQuery 3 была написана в строгом режиме, вашему коду не обязательно использовать его. Следовательно, вам не нужно переписывать уже существующий код, если вы желаете перейти на новую версию. Однако есть одно исключение: некоторые версии ASP.NET не совместимы из-за строгого режима.</p><h3>Новая сигнатура методов get и post</h3><p>jQuery получила новые сигнатуры сервисных функций $.get() и $.post() для единообразия с $.ajax().</p><h3>Оператор цикла for…of</h3><p>jQuery 3 поддерживает оператор цикла for..of, который имеется в спецификации <a href="https://ponyfoo.com/articles/es6">ECMAScript 6</a>. Это позволяет вам запускать цикл по итерируемым объектам, таким как Map, Set, Array и т.д.</p><p>Оператор цикла for..of может быть использован для замены синтаксической конструкции $.each( ). Предположим, что вы хотите применить имя к каждому вводимому элементу страницы.</p><p>Код на jQuery 2 выглядит так:</p><p>Но код на jQuery 3 будет иметь следующий вид:</p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка интерактивных самоучителей, которые помогут в увлекательной форме изучить основы популярных технологий</title>
      <link>https://tproger.ru/digest/trysmthorg</link>
      <comments>https://tproger.ru/digest/trysmthorg?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/trysmthorg</guid>
      <description><![CDATA[<p>Игровой формат обучения выручает новичков без мотивации: подборка интерактивных курсов, среди которых приятный самоучитель по библиотеке jQuery.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/trysmthorg">Подборка интерактивных самоучителей, которые помогут в увлекательной форме изучить основы популярных технологий</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Игры для программистов]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 19 Jul 2016 18:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Часто основная проблема у начинающих программистов — отстутствие мотивации. Очень сложно собраться с силами, чтобы читать документацию или длинные туториалы на английском. Наверное именно поэтому всё популярнее становятся интерактивные самоучители, обучение в которых происходит в формате, который похож на игру. Выбрали для вас несколько таких самоучителей с просторов интернета.</p><h3>jQuery</h3><p>Очень <a href="http://try.jquery.com">приятный курс</a>, проходить который можно, даже не зная, что такое jQuery вообще. Если что, jQuery — библиотека для JavaScript, с помощью которой можно находить и, например, изменять различные элементы HTML. Впрочем, это пояснение лишнее — курс начинается с весёлой песни, которая рассказывает про то, что такое jQuery.</p><p><a href="http://try.jquery.com"></a></p><p>Затем песню сменяет ведущий, который рассказывает теорию. Ведущий очень живой, слушать его приятно. Вдобавок, всё, что он говорит, сопровождается иллюстрациями. Слайды к тому, что он говорил, можно позже скачать.</p><p>Лекция ведущего сменяется практическими заданиями — с возможностью запросить подсказки. За просмотр подсказок условные баллы не снимаются, зато снимаются за просмотр ответов (такая возможность, естественно, тоже предусмотрена).</p><p><a href="http://try.jquery.com"></a></p><p>Задания сменяются новой теорией от ведущего, теория — снова практикой. В целом курс создан не для глубинного обучения jQuery, а для изучения основ синтаксиса и понимание общих принципов работы.</p><h3>Github</h3><p><a href="https://try.github.io/">Этот курс</a> построен несколько иначе, чем предыдущий. Курс построен так, будто вам нужно запушить свой проект на Github — сначала даётся объяснение того, что на данном этапе нужно сделать, а чуть ниже — команда, которая это выполняет. Для перехода к следующему уроку эту команду необходимо перепечатать в терминал и выполнить. Результат работы команды вы можете увидеть в импровизированном диспетчере файлов. В общем-то, чаще всего к подобным самоучителям прибегают, именно когда появляется срочная необходимость выложить свой проект на Github. Лучшего способа, чем проделать все шаги самому под чутким руководством милого Октокота, наверное, нет. Ну, разве что наше <a href="https://tproger.ru/articles/git-quick-start/">руководство</a> по быстрому старту с git.</p><p><a href="https://try.github.io/"></a> Оформление заданий</p><h3>Ruby</h3><p>В <a href="http://tryruby.org">этом туториале</a> каждый урок строится достаточно простым образом — программа сообщает вам, как делается в Ruby то или иное действие, и немного теории. Переход к следующему уроку осуществляется, когда вы выполните это (или аналогичное действие) в консоли справа. Курс достаточно интересный, к тому же система довольно сносно шутит (например, сначала предлагает вам выполнить 40.reverse(), а потом сообщает, что перевернуть можно только строку, а число нельзя. Если вы, конечно, не поднесёте к монитору зеркало :D)</p><p><a href="http://tryruby.org"></a> Первый урок на tryruby</p><p>А какие интерактивные самоучители знаете вы? Пишите в комментариях, лучшими из предложенных мы пополним статью.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел релиз-кандидат библиотеки jQuery 3.0</title>
      <link>https://tproger.ru/news/jquery-3-0-release-candidate-released</link>
      <comments>https://tproger.ru/news/jquery-3-0-release-candidate-released?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jquery-3-0-release-candidate-released</guid>
      <description><![CDATA[<p>В jQuery 3.0 привели в порядок API, исправили баги и добавили совместимость с Promises/A+ и ES2015, а поддержки IE 6-8 в новой версии нет.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jquery-3-0-release-candidate-released">Вышел релиз-кандидат библиотеки jQuery 3.0</a>»</p>]]></description>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 May 2016 20:55:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня разработчики библиотеки <a href="http://blog.jquery.com/2016/05/20/jquery-3-0-release-candidate-released/">объявили</a> о выходе релиз-кандидатной версии jQuery 3.0 — в ней приведено в порядок API, а также исправлены многие баги. Процесс приведения в порядок подразумевает под собой удаление ранее объявленных устаревшими публичных API, изменение или удаление недокументированных API, а также изменение поведения существующих интерфейсов.</p><p>Также некоторые объекты были обновлены для совместимости со стандартами Promises/A+ и ES2015 Promises. Важно помнить, что новая версия библиотеки не поддерживает IE 6-8 версий.</p><p>После релиза окончательной версии jQuery 3.0 она станет единственной поддерживаемой версией jQuery. Ветки 1.12 и 2.2 будут получать критические обновления, но никаких нововведений или изменений в них уже не будет.</p><p>Инструкцию по обновлению до новой версии можно прочитать <a href="http://jquery.com/upgrade-guide/3.0/">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Стало доступно обновление jQuery</title>
      <link>https://tproger.ru/news/jquery-update-review</link>
      <comments>https://tproger.ru/news/jquery-update-review?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Глаз]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jquery-update-review</guid>
      <description><![CDATA[<p>Обновление библиотеки jQuery принесло новые возможности и рост производительности за счёт предкомпилированных Sizzle-селекторов. Дальше выйдет версия 3.0.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jquery-update-review">Стало доступно обновление jQuery</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 Jan 2016 22:54:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вышли 2 новые версии библиотеки jQuery: 1.12.0 и 2.2.0. Следует отметить, что это последние обновления данных веток в преддверии того, как выйдет jQuery 3.0.</p><p>В новой версии нас ждет несколько новых фич и некоторое улучшение производительности, достигнутое за счет того, что при определенных ситуациях будут использоваться предкомпилированные Sizzle-селекторы. Кроме того:</p><ul><li>Появилась поддержка манипуляции над SVG-элементами.</li><li>Добавили новую сигнатуру к AJAX-ярлыкам, которая дает возможность использовать символы и итераторы в параметрах объектов.</li><li>Метод jQuery.unique(), после удаления дубликатов, теперь еще и сортирует.</li></ul><p>Разработчики также пообещали, что jQuery 3.0 выйдет довольно скоро, но не уточнили когда именно.</p>]]></content:encoded>
    </item>
  </channel>
</rss>