Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: начальный курс c
Вивчай Spring MVC на ITVDN

Автор: Редакція ITVDN

Вітаємо, друзі! Тепер у вас є можливість отримати якісні знання зі Spring MVC українською мовою у форматі відео курсів – на ITVDN опубліковано новий курс “Spring MVC”. Spring – потужний фреймворк з модульною структурою та відкритим кодом для створення серверних застосунків на платформі Java. Spring MVC – це частина інфраструктури Spring, при тому й окремий фреймворк для створення вебзастосунків з архітектурою Модель–Представлення–Контролер (Model-View-Controller). На курсі детально розглядаються можливості використання цього фреймворку для створення сучасних вебзастосунків. Ви познайомитеся з основними концепціями та цілями Spring Framework, дізнаєтеся про ключові деталі та практику використання, що пов'язані з роботою архітектури MVC, та особливості її реалізації фреймворком Spring MVC. Після завершення курсу ви матимете навички та знання для розробки вебзастосунків, використовуючи Spring Framework та Spring MVC. Ви зможете створювати, тестувати, забезпечувати безпеку та оптимізувати вебзастосунки, включаючи RESTful сервіси та асинхронний функціонал. Автор курсу – Андрій Кобрин, Java Software Engineer. Тривалість курсу – 4 години 39 хвилин. Структура курсу: Основи Spring Framework. Введення до Spring MVC. Основи CRUD операцій. Підключення бази даних. Тестування проєкту. Обробка винятків і валідація форм. RESTful сервіси. Аутентифікація та безпека. Асинхронні запити в Spring MVC. Чого ви навчитеся на даному курсі: Розуміти принципи архітектури Spring MVC та вміти створювати з нею вебзастосунки. Створювати, читати, оновлювати та видаляти дані у вебзастосунках за допомогою Spring MVC. Використовувати різні способи підключення до баз даних та використовувати Spring Data JPA для доступу до даних. Створювати, читати, оновлювати та видаляти дані в своєму вебзастосунку, використовуючи підходи CRUD (Create, Read, Update, Delete) засобами Spring MVC. Розуміти принципи інверсії управління (Inversion of Control) і як Spring Framework реалізує цей підхід в Java-застосунках. Використовувати механізми Dependency Injection для впровадження залежностей в об'єкти. Писати тести для перевірки функціональності вебзастосунків (юніт-тести, інтеграційні, функціональні). Розуміти, як валідувати та обробляти вхідні дані та винятки у вебзастосунках. Створювати RESTful API та обробляти запити до застосунку. Розуміти механізми аутентифікації та авторизації в Spring Security для захисту застосунку та даних. Використовувати асинхронні запити для підвищення продуктивності вебзастосунків. Попередні вимоги Для проходження курсу необхідно мати: Знання Java. Знання SQL. Досвід роботи хоча б з однією базою даних (MySQL, PostgreSQL і т. д.). Середовище розробки програмного забезпечення IntelliJ IDEA. Дивіться перший урок у вільному доступі. Курс вже доступний на нашому сайті в повному обсязі – до кожного уроку є практичні завдання, опорний конспект та онлайн тести для більш глибокого засвоєння матеріалу. Якщо у вас є активна підписка, ви можете дивитися його прямо зараз. Курс входить до комплексної програми підготовки за спеціальністю Java Developer.     
Вивчай Python безкоштовно українською мовою

Автор: Редакція ITVDN

З 2 до 9 листопада 2023 року на ITVDN проходить акція – ви можете пройти навчання за курсом “Python Стартовий” безкоштовно! Курс українською мовою! Що таке Python? Python – одна з найпопулярніших мов програмування. Легкість вивчення та можливості мови дозволяють застосовувати її у багатьох сферах – у створенні настільних застосунків, веб backend розробці, у машинному навчанні, аналізі великих даних, а також для створення ігор, вирішення завдань з автоматизації системного адміністрування та кібербезпеці. Python стане в нагоді для вирішення широкого кола завдань і буде корисним розробникам, DevOps інженерам, тестувальникам програмного забезпечення та іншим IT-спеціалістам. Про курс “Python Стартовий” Курс познайомить вас із базовими поняттями та основами мови програмування Python. Ви дізнаєтесь про різні типи даних і як з ними працювати, розберете, що таке цикли та умовні конструкції, і навчитеся обробляти помилки, які можуть виникати в роботі ваших програм. До кожного уроку є практичні завдання та тести для перевірки знань. А в кінці ви зможете пройти фінальний тест і отримати сертифікат. Тривалість курсу – 10 годин 47 хвилин. Програма курсу: Ознайомлення з мовою Python. Примітивні типи даних та змінні. Умовні оператори. Цикли. Списки та зрізи. Словники. Множини та кортежі. Функції. Частина 1. Функції. Частина 2. Винятки та їх оброблення. Автор курсу – Руслан Скіра, Python Developer (EPAM Systems, Хорватія) з 6+ роками ІТ-досвіду на різних позиціях: QA/QC Engineer, Full Stack Python Developer. Має глибокі пізнання у веб-розробці та обробці даних, а також практичний досвід роботи з такими інструментами, як Django, DRF, Odoo, Pytest, Panda, Celery, PostgreSQL, MongoDB, Elasticsearch, AWS ES2, GCP. Попередні вимоги Цей курс розрахований на початківців без досвіду та знань у програмуванні. Якщо ви вже займаєтеся розробкою іншою мовою програмування і хочете вивчити Python – ці відео уроки допоможуть вам: просто швидко перегляньте перші вступні теми і сконцентруйте увагу на особливостях Python. Якщо ви займаєтеся тестуванням ПЗ, цей курс допоможе вам розібратися з синтаксисом мови та стане першим кроком в опануванні автоматизації тестування з використанням Python. Чого ви навчитеся на курсі “Python Стартовий”: Розуміти основні принципи програмування та застосування їх у Python. Розуміти та вміти застосовувати примітивні типи даних та змінні. Працювати з умовними та циклічними конструкціями. Використовувати списки, зрізи та словники. Працювати з різними множинами та кортежами. Розуміти сенс та вміти використовувати на практиці функції. Відловлювати та обробляти можливі винятки у коді програми. Створювати скрипти, що реалізують нескладні завдання обробки даних. Терміни акції Акція проходить з 2 до 9 листопада 2023 року включно. Доступ до курсу відкривається на 10 днів.
Вивчай CSS Flexbox безкоштовно українською мовою
З 11 по 18 квітня 2023 року на ITVDN проходить акція – ви можете пройти навчання за курсом "CSS Flexbox" безкоштовно! Курс українською мовою! Що таке Flexbox? Flexbox (читається як "флексбокс") покликаний спростити позиціонування елементів на сторінці. Він дозволяє забути про проблеми з незручним ручним налаштуванням розмірів і положення блоків, яке забрало б у вас купу часу, так і не давши бажаного результату. За допомогою технології флексбокс можна задати бажану поведінку всім елементам сторінки, прописавши мінімум коду. Це особливо зручно при адаптивному та мобільному верстанні, коли розміри вашої інтернет-сторінки не фіксовані та змінюють свій розмір залежно від пристрою, з якого користувач зайшов на сайт. Іншими словами, це сучасний інструмент верстання, що дозволяє швидко створювати складні гнучкі макети та функції, спрощуючи вирішення завдань, для яких раніше використовували чистий CSS. Сьогодні флексбокси дуже популярні у використанні та підтримуються майже всіма сучасними браузерами. Про курс “CSS Flexbox” Автор відео курсу – Олексій Кучеренко, FrontEnd розробник та тренер-консультант навчального центру CyberBionic Systematics. Ви познайомитеся із загальними поняттями та принципами логіки роботи технології Flexbox, навчитеся застосовувати основні властивості, розглянете способи взаємодії між елементами, побачите, як можна комбінувати медіа-запити з флексбоксом та як правильно застосовувати цю технологію для створення адаптивних веб-сторінок. У кожному уроці показано поетапне створення розмітки, яка повністю відповідає макету сайту. Будуть детально розібрані способи розміщення блоків по горизонталі та вертикалі так, щоб забезпечити їхнє зручне відображення на будь-яких пристроях. Програма курсу: Знайомство з Flexbox. Верстання трьох секцій. Зміна потоку та медіа-запити. Адаптивне версання сайту. Для кого цей курс Курс призначений насамперед для верстальників-початківців і FrontEnd розробників, а також для всіх, кого цікавить така технологія верстання сайтів, як Flexbox. Щоб опанувати флексбокси, вам необхідно знати мови HTML та CSS на базовому рівні. Курс входить до комплексних програм навчання за спеціальностями FrontEnd Developer та Верстальник сайтів. Чого ви навчитеся на даному курсі: Виконувати верстання header-a макету та меню в ньому. Створювати просте меню на сайті за допомогою флексбокс технології. Використовувати властивості flex-grow та flex-shrink для створення «гумового» верстання. Виконувати планшетну та мобільну версії простої сторінки без використання додаткових правил медіа-запитів. Розуміти функції властивостей align-items, flex-wrap, order, а також їх нюанси та переваги використання. Працювати з додатковим потоком у flexbox, розміщуючи елементи у потрібній позиції. Розуміти, як, навіщо і коли потрібно змінити напрямок основного потоку. Розміщувати багато рядових блоків, незалежно від їхньої кількості, працюючи з флексбоксами. Терміни акції Акція проходить з 11 до 18 квітня 2023 року включно. Доступ до курсу відкривається на 10 днів. Доступ до курсу не надається громадянам росії та білорусі.
Вивчай Spring Data безкоштовно

Автор: Редакція ITVDN

С 9 по 15 июля на ITVDN проходит акция — вы можете пройти обучение по курсу Создание приложений с помощью Spring Data бесплатно! Что такое Spring Data? Spring Data — это фреймворк, сильно упрощающий Java разработчику работу с базами данных, которые являются важнейшей частью любого современного приложения. О курсе “Создание приложений с помощью Spring Data” Курс состоит из 9 видео уроков общей продолжительностью 8 часов. С его помощью вы научитесь создавать полноценное приложение с подключением баз данных и применением популярных фреймворков для работы с данными. Вы на практике изучите способы подключения к БД и дальнейшую работу приложений с помощью Spring Data, а также рассмотрите несколько других способов сохранения объектов в реляционных БД с их плюсами и минусами. Данный курс позволит на практике пройти все этапы создания полноценного web-приложения. Вы рассмотрите вопросы архитектуры приложения, основы безопасности и создания системы авторизации на основе аспектов, а также методы обработки исключений в web-приложениях и основы тестирования. Автор видео курса — Андрей Губаренко, Java Developer, более 10 лет лет работы в IT. Программа курса: Создание и настройка проекта. Работа с базами данных. Обзор систем объектно-реляционного отображения. Транзакции. Использование REST-архитектуры. Подключение Spring Data. Исключения при доступе к данным в Spring. Создание простейшей системы авторизации при помощи АОР. Тестирование. Для кого этот курс Этот курс рассчитан на тех, кто имеет достаточно глубокие знания языка Java, умеет работать с базами данных при помощи Java-ориентированных технологий, а также имеет опыт работы со стандартным фреймворком Spring. Курс входит в комплексную программу обучения по специальности Java Developer. Чему вы научитесь на этом курсе: Понимать принципы работы и применять на практике системы объектно-реляционного отображения (ORM). Создавать полноценные web-приложения на основе Maven с использованием таких фреймворков, как: Hibernate, JPA, Spring Data. Понимать архитектуру REST и планировать архитектуру своего приложения исходя из необходимости соответствия такой архитектуре. Понимать существующий принцип иерархии исключений и как такая иерархия реализована в Spring, уметь обрабатывать исключения в web приложениях. Выполнять тестирование работы своего приложения с различными настройками. Сроки акции Акция проходит с 9 по 15 июля 2021 года включительно. Доступ к курсу открывается на 10 дней.
Вивчай SOLID принципи у Java безкоштовно

Автор: Редакція ITVDN

С 11 по 17 декабря 2020 года на ITVDN проходит акция — вы можете пройти обучение по курсу “SOLID принципы в Java” бесплатно! Что такое SOLID принципы? SOLID — это принципы, являющиеся своеобразным ремнем безопасности для тех, кто работает в соответствии с парадигмами объектно-ориентированного программирования. Они были созданы с целью обезопасить ООП-ориентированного разработчика от непонятного, запутанного, нечитабельного кода, который помимо прочего еще и очень тяжело поддерживать. SOLID — это акроним, который состоит из пяти букв, кодирующих пять основных принципов: S — Single Responsibility Principle (принцип единственной ответственности) O — Open-Closed Principle (принцип открытости-закрытости) L — Liskov Substitution Principle (принцип подстановки Барбары Лисков) I — Interface Segregation Principle (принцип разделения интерфейса) D — Dependency Inversion Principle (принцип инверсии зависимостей) Владение данными принципами позволяет грамотно проектировать и разрабатывать такие программные системы, которые с большой вероятностью смогут длительное время развиваться, расширяться и поддерживаться. О курсе “SOLID принципы в Java” Автор видео курса — Андрей Фок, сертифицированный Java Developer и тренер учебного центра CyberBionic Systematics. Этап проектировки — самая важная часть при разработке любого приложения. С помощью этого курса вы узнаете, каких принципов стоит придерживаться, чтобы создавать не просто приложения, а целые системы, которые будет легко поддерживать, масштабировать, менять и кастомизировать. Принципы SOLID должен понимать каждый, кто называет себя разработчиком. В конце курса вы сможете выстраивать архитектуру ваших приложений согласно данным принципам. Программа курса: Введение в SOLID. Принцип единственной ответственности Принцип открытости/закрытости Принцип подстановки Лисков Принцип разделения интерфейса Принцип инверсии зависимостей Для кого этот курс Курс предназначен в первую очередь для тех, кто владеет языком программирования Java на продвинутом уровне, и при этом интересуется не только разработкой, но и непосредственно этапом проектирования, желая создавать грамотные и легко масштабируемые архитектуры своих приложений. Курс входит в комплексные программы обучения по специальностям Java Developer, Android Developer. Чему вы научитесь на этом курсе: Применять принципы SOLID на практике Понимать построение приложений, основанных на принципах SOLID Проектировать приложения согласно SOLID Сроки акции Акция проходит с 11 по 17 декабря 2020 года включительно. Доступ к курсу открывается на 10 дней.
Вивчайте Spring безкоштовно

Автор: Редакція ITVDN

С 19 по 25 июня 2020 года на ITVDN проходит акция - вы можете пройти обучение по курсу Spring бесплатно! Что такое Spring? Spring — это фреймворк, который помогает разрабатывать простые, быстрые, гибкие и переносимые приложения на Java. Особенности ядра Spring применимы в любом Java-приложении, и существует множество расширений и усовершенствований для построения веб-приложений на Java Enterprise платформе. По этим причинам Spring приобрёл большую популярность и признаётся разработчиками как стратегически важный фреймворк. О курсе Автор - Роман Дзюба, Java Developer. Курс состоит из 10 видео уроков общей продолжительностью 6 часов 9 минут. В курсе рассмотрены различные способы использования модулей Spring, написание REST приложений, использование MVC моделей и другие темы. Программа курса: Введение в Spring Внедрение зависимостей и IoC контейнер Spring MVC Spring Data Spring Testing AOP RESTful web services Security Cache Boot Для кого этот курс Этот курс предназначен для Java разработчиков,он предполагает базовые знания программирования на Java и входит в комплексную программу обучения по специальности Java Developer. Чему вы научитесь на этом курсе: Понимать механизмы работы основных модулей Spring Framework. Использовать принципы Инверсии управления (Inversion of Control) и Внедрения зависимостей (Dependency Injection) для создания более качественной архитектуры приложения. Понимать принципы паттерна MVC и уметь создавать контроллеры для обработки запросов пользователя. Настраивать соединение приложения с реляционной БД и создавать методы для выполнения запросов к БД. Создавать модульные и интеграционные тесты для вашего приложения. Понимать принципы Аспектно-ориентированного программирования и использовать их для уменьшения дублирования кода, сокращения времени разработки, упрощения кода и его сопровождения. Создавать веб-сервисы, используя стиль архитектуры REST (Representational state transfer). Настраивать безопасность приложения на уровне методов и на уровне конечных точек (endpoints). Создавать роли пользователей и настраивать права доступа. Ускорять процесс разработки приложений и сокращать время на их развертывание. Как получить Сертификат по курсу Spring После каждого урока Вы сможете проходить онлайн тестирование, чтобы проверить, как усвоен материал, а после завершения курса пройти финальный тест, и, если Ваш результат будет выше 70%, Вы получите электронный сертификат, подтверждающий Ваши знания. Сроки акции Акция проходит 19 по 25 июня 2020 года. Доступ к курсу открывается на 10 дней. Изучайте программирование на ITVDN!
Акція «Снігопад цін на ITVDN»

Автор: Редакція ITVDN

С 10 по 17 декабря для всех, кто хочет стать программистом – снегопад цен на ITVDN! Первые скидки самые долгожданные и самые большие! Но не зевайте, потому что они быстро тают. Покупайте подписку на год и учитесь на ITVDN всего за $8.5 в месяц. Для вас будут доступны более 150 видео курсов, которые позволяют пройти полное обучение по 11 IT специальностям, самые популярные из них: FrontEnd Developer – 32 видео курса С#/.NET Developer – 46 видео курсов Java Developer – 12 видео курсов Python Developer – 6 видео курсов PHP Developer – 9 видео курсов Разработка игр на Unity – 17 видео курсов Mobile Developer - 11 видео курсов Всем известно, что программистом нельзя стать за месяц, и за два, и за три... Как показывает опыт, самые талантливые и мотивированные студенты добиваются первых успехов в разработке через полгода самообучения.  С хорошим наставником этот срок может быть короче. Но найти наставника довольно сложно. Поэтому мы решили поддержать тех, кто решительно настроен на обучение программированию и дарим большие скидки на долгосрочные подписки. Первая волна скидок – 10, 11, 12 декабря скидка на подписку  6 и 12 месяцев– 40%. Вторая волна – 13, 14, 15 декабря – 35%. Третья волна  - 16 и 17 декабря – 30%. Акционная стоимость подписки на 12 месяцев: 10, 11, 12 декабря годовая подписка будет стоить $102 (это $8.5 в месяц вместо $19,99) 13, 14, 15 декабря годовая подписка будет стоить $110.5 (это $9.2  в месяц вместо $19,99) 16 и 17 декабря годовая подписка будет стоить $119 (это $9.9  в месяц вместо $19,99) Акционная стоимость подписки на 6 месяцев: 10, 11, 12 декабря подписка на 6 месяцев будет стоить $54 (это $9 в месяц вместо $19,99) 13, 14, 15 декабря подписка на 6 месяцев будет стоить $58.5 (это $9.75  в месяц вместо $19,99) 16 и 17 декабря подписка на 6 месяцев будет стоить $63 (это $10.5  в месяц вместо $19,99) Долгосрочные подписки – это самый лучший выбор для тех, кто хочет пройти полное обучение по специальности и в итоге подтвердить свой уровень Дипломом специалиста. В пакете подписки для Вас будут доступны более 150 курсов по программированию, которые есть на данный момент, а также все новые, которые появятся на ITVDN в то время, когда Ваша подписка будет активна. Ежемесячно мы записываем 5-7 новых видео курсов по самым актуальным технологиям, учитывая пожелания наших пользователей. Вы сможете неоднократно возвращаться к пройденным курсам и сложным темам в течение года, консультироваться с тренером и формировать практические навыки, используя тренажер. Коллектив ITVDN желает Вам успешного достижения целей в учебе и карьере и будет рад помочь Вам в этом.  Оставайтесь с нами! Приобрести подписку по акционной цене. 
RxJS: розбір Subject`ів

Автор: Nicholas Jamieson

Я был свидетелем многих вопросов, связанных с Subject`ами на Stack Overflow. Недавно я увидел одного разработчика, который интересовался, как, собственно говоря, работает AsyncSubject. Вопрос заставил меня написать эту статью, чтобы показать, почему необходимо использовать различные типы Subject`ов и как их использовать.   Когда мы используем Subject`ы? В своей статье Бен Леш утверждал, что: … [мультикастинг] является основной причиной использования Subject`ов в RxJS. Что касательно мультикастинга, мы рассмотрим его более подробно немного позже. Сейчас же нам достаточно знать, что он позволяет принимать оповещения от одной «наблюдаемости» и отправлять их другим «наблюдателям». Подобная связь «наблюдаемости» с «наблюдаемыми» и есть сутью Subject`ов. Причина этого заключается в том, что де-факто Subject`ы являются одновременно «наблюдаемостью» и «наблюдателями».   Как они могут быть использованы? В качестве примера давайте рассмотрим компонент Angular awesome-component. Наш компонент выполняет определенную работу и содержит в себе внутреннюю «наблюдаемость», что производит определенное значение при работе с ней пользователя. Чтобы позволить родительским компонентам получить доступ к «наблюдаемости», awesome-component принимает «наблюдателя», что вводит свойство и что подписывается, в свою очередь, на «наблюдаемость». Это значит, что отныне родитель может соединиться с «наблюдаемостью» при помощи спецификации «наблюдателя» - что-то наподобие этого: Так как теперь «наблюдатель» «обвязан», родитель соединен и получает значения от awesome-component. Впрочем по сути это то же самое, как  если бы awesome-component производил значения через подписанные события. Так почему же мы здесь не используем события? Дело в том, что «наблюдаемостями» проще управлять. К примеру, чтобы добавить фильтры, нам необходимо использовать лишь несколько операторов. Но немаловажный нюанс: родительский компонент имеет «наблюдателя» – не «наблюдаемость», так как в таком случае мы можем применять операторы? Subject`ы - это одновременно и «наблюдаемости», и «наблюдатели», поэтому, когда мы создаем Subject, он может быть использован по отношению к awesome-component в качестве «наблюдателя» или работать с компонентом как с «наблюдаемостью». Что-то наподобие этого: Subject соединяет «наблюдателя» по принципу «делай-все-что-хочешь-со-значением» с «наблюдаемостью» в виде awesome-component. Но здесь применяется набор операторов родителей компонента.   Композиция различных «наблюдаемостей» При помощи Subject`а для композиции «наблюдаемости» awesome-component может быть использован в разных целях разными компонентами. К примеру, другой компонент может быть заинтересован только в последнем сгенерированном значении. Для этого нужно использовать last-оператор: Что интересно, это не единственный способ получения последнего значения: мы просто можем использовать другой Subject. К примеру, при помощи AsyncSubject код будет выглядеть следующим образом, так как он производит только последнее полученное значение: Но, если использование AsyncSubject равнозначно композиции «наблюдаемости» при помощи использования Subject и last-оператора, зачем усложнять RxJS лишним классом? Ну, в основном потому что Subject`ты предназначены для мультикастинга. В данном случае два способа эквивалентны, потому что здесь есть только один подписчик. В ситуации с применением мультикастинга здесь было бы несколько подписчиков и применять оператор last здесь было бы нецелесообразно. Теперь же давайте рассмотрим мультикастинг более детально.   Как Subject`ы используются непосредственно в RxJS? Ядро инфраструктуры мультикастинга RxJS исполняется при помощи оператора multicast. Multicast вообще применяется к ключевым «наблюдаемостям», принимает Subject и возвращает полученную из Subject`а «наблюдаемость». Оператор multicast чем-то похож на awesome-component. Мы можем принимать «наблюдаемость», чье поведение зависит от принимаемого Subject`а. Ситуации, когда базовый Subject передается multicast: Подписчики мультикаст-«наблюдаемости» принимают оповещения типа next, error, complete. «Поздние» подписчики , другими словами, те, которые подписались после оповещений error, complete, – так же в свою очередь принимают эти оповещения. Важно отметить, что пока мультикастинг не передал factory, «поздние» подписчики не работают с другими подписками на источник. Чтоы произвести композицию по отношению к мультикаст-«наблюдаемости», что передает последнее оповещение next ко всем подписчикам, недостаточно просто применить last-оператор к «наблюдаемости», созданной при помощи Subject. «Поздние» подписчики подобной «наблюдаемости» не получат последнее next-оповещение. Они получат только complete. Специально для этого оповещения должны храниться в состоянии Subject`а. Именно это делает класс AsyncSubject и именно для этого мы используем AsyncSubject в подобной ситуации.   Что касательно других классов Subject`ов? Существует двое других вариантов Subject`ов: BehaviorSubject и ReplaySubject. Чтобы понимать BehaviorSubject лучше, давайте рассмотрим пример: Здесь родительский компонент соединяется с awesome-component при помощи Subject и применяет оператор startWith. Этот оператор обеспечивает надежный прием значения “awesome” вместе со значениями, сгенерированными awesome-component – в случае, конечно, если они таки были сгенерированы. Подобно тому, как AsyncSubject используется вместо обычного Subject`а и оператора last, BehaviorSubject может заменить собой оператора startWith и Subject`а – так как его конструктор принимает значение, которое было бы в противном случае направлено к startWith. В случае с использованием BehaviorSubject все подписчики получат начальное значение. Это возможно потому, что BehaviorSubject хранит значение переменной в своем состоянии. По той причине, что концепция «переигрывания» уже полученных оповещений внедрена в мульти-подписку, аналогии с единым подписчиком для ReplaySubject просто не существует. Так же, как и BehaviorSubject, переменные хранятся в состоянии Subject`а.   Итак, как мы используем эти Subject`ы? Мы увидели, какие бывают Subject`ы и для чего они используются. Но как они должны быть использованы? Что ж, как бы это ни было парадоксально, но класс Subject – это тот класс, который вам, вероятно, никогда не придётся использовать. Subject работает прекрасно при связывании «наблюдателя» с «наблюдаемостью». Но для ситуаций с мультикастингом существуют альтернативы. RxJS содержит операторы мультикастинга, которые используют различные Subject – классы, причем точно так же, как я могу использовать генераторы «наблюдаемостей» RxJS (fromEvent) над вызовами Observable.create. Но для ситуаций с мультикастингом я все же предпочитаю использовать следующие операторы: Publish или share могут быть использованы вместо Subject; publishBehavior может быть использован вместо BehaviorSubject; publishLast может быть использован вместо AsyncSubject; publicReplay или shareReplay могут быть использованы вместо ReplaySubject.   Автор перевода: Евгений Лукашук Источник
Як я побудував проект на Django, Django REST Framework, Angular 1.1.x та Webpack

Автор: Редакція ITVDN

Моя идея состояла в том, чтобы построить простой репликабельный проект на Angular с бэкэндом на Django. Я искал и не смог найти нужных решений, пришлось во всем разбираться самому. В итоге я разобрался и решил сам написать гайд для всех, кого может заинтересовать данная проблема.  Данная статья поможет вам построить простое приложение Angular с бэкэндом на Django, организованного с помощью Webpack. Проблема Я хочу настроить проект на Angular 1.1.x и скормить ему данные с сервера Django. Мне бы хотелось использовать Django REST Framework (DRF), чтобы пострить RESTful API. Я также хочу сбандлить JS ассеты. Сейчас я собираюсь запустить сайт на одном сервере. Предварительные требования Python 2.x Django 1.9.x npm 2.15.8+ Webpack 1.13.x (sudo npm i -g webpack) ESLint 2.13.1+ (sudo npm i -g eslint) NodeJS 4.4.7+ Содержание Скаффолдинг проекта. Создайте свои начальные директории. Скаффолдинг проекта на Django. Настрока переменных среды, нужных для запуска сервера Django. Установка Django REST Framework и настройка Django с использованием переменных среды. Создание API. Запуск Django сервера с использованием dev settings. Инициализация npm-пакета и установка front-end JS зависимостей. Создание Angular entry-point и загрузка начальных зависимостей. Настройка Webpack'а. Дайте команду Django загрузить приложение. Создайте шаблон базы приложения Angular. Напишите компонент home. Напишите Angular роуты, ведущие к вашему компоненту home и странице 404. Добавьте директивы ангуляр-маршрутизатора к шаблону входной точки приложения. Проверьте ваше REST API в приложении Angular.  Шпаргалка. Итак, начнем! 0. Настройте среду для Python. mkvirtualenv mysite 1. Скаффолдинг проекта на Django. Создайте начальные директории. Мы хотим сфокусироваться на модулярности в ходе разработки. Следовательно, существует множество директорий в конечном итоге использования. Мы хотим, чтобы наше дерево изначально выглядело так: mysite ├── backend │ ├── docs │ ├── requirements └── frontend ├── app │ ├── components │ └── shared ├── assets │ ├── css │ ├── img │ ├── js │ └── libs ├── config ├── dist └── js  Сделайте следующее: mkdir mysite && cd mysite mkdir -p backend/docs/ backend/requirements/ \ frontend/app/shared/ \ frontend/app/components/ \ frontend/config \ frontend/assets/img/ frontend/assets/css/ \ frontend/assets/js/ frontend/assets/libs/ \ frontend/dist/js/  *Примечание: Структура этого проекта была навеяна опытом с несколькими другими проектами. Я считаю эту организацию идеальной, но вам не обязательно ей следовать. Но, пока вы читаете этот гайд, вы должны придерживаться этой структуры. 2. Скаффолдинг проекта на Django. В директории backend/ создайте Django проект: python django-admin.py startproject mysite  Также создайте requirements.txt: pip freeze > requirements/requirements.txt В директории (вашего проекта) backend/mysite/ произведите скаффолдинг директории, той, где будет жить ваше API: mkdir -p applications/api/v1/ touch applications/__init__.py applications/api/__init__.py \ applications/api/v1/__init__.py applications/api/v1/routes.py \ applications/api/v1/serializers.py applications/api/v1/viewsets.py Теперь создайте структуру директории настроек: mkdir -p configlord/settings/ touch configlord/settings/__init__.py \ configlord/settings/base.py configlord/settings/dev.py configlord/settings/prod.py \ configlord/dev.env configlord/prod.en 3. Настройте переменные окружения, которые нужны для запуска сервера Django. На этом этапе я предпочитаю пользоваться django-environ для работы с переменными окружения. Существует множество способов сделать это, но пакет django-environ чрезвычайно упрощает этот процесс, поэтому я использую его во всех своих проектах. Установите django-environ: pip install django-environ  В mysite/dev.env добавьте следующее: DATABASE_URL=sqlite:///mysite.db DEBUG=True FRONTEND_ROOT=path/to/mysite/frontend/ SECRET_KEY=_some_secret_key Мы собираемся использовать эти переменные среды в наших настройках. Выгода от использования наших переменных окружения в отдельных файлах состоит в основном в том, что такая настройка позволяет облегчить переключение между средами. В нашем случае файл the dev.env является списком переменных, которые мы бы использовали в локальной среде разработки. *Примечание: SECRET_KEY можно взять из settings.py, который был сгенерирован django-admin.py startproject. 4. Установите Django REST Framework и настройте Django, используя переменные среды. Установка DRF: pip install djangorestframework Наполните settings/base.py  следующим: Укажите, где искать переменные окружения. import environ project_root = environ.Path(__file__) - 3 env = environ.Env(DEBUG=(bool, False),) CURRENT_ENV = 'dev' # 'dev' is the default environment # read the .env file associated with the settings that're loaded env.read_env('./mysite/{}.env'.format(CURRENT_ENV)) Установите базу данных. В данном случае мы собираемся использовать встроенные в django-environ настройки SQLite. DATABASES = { 'default': env.db() } Установите SECRET_KEY ,а также debug. SECRET_KEY = env('SECRET_KEY') DEBUG = env('DEBUG') Добавьте DRF в пул приложений, которые Django должен использовать. # Application definition INSTALLED_APPS = [ ... # Django Packages 'rest_framework', ] Ссылки будут «жить» в специальном URL модуле, созданном с помощью базы проекта. ROOT_URLCONF = 'mysite.urls' Укажите Django, где искать все шаблоны и другие статические ассеты. STATIC_URL = '/static/' STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ] STATICFILES_DIRS = [ env('FRONTEND_ROOT') ] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [env('FRONTEND_ROOT')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] В соответствии с настройкой TEMPLATES Django должен будет искать шаблоны внутри frontend/ directory. Это то, где Angular приложение будет жить. Мы используем только Django, чтобы обслужить шаблон, внутри которого Angular приложение будет загружаться, которое будет выполнено через entry-point директиву. Если вы не знаете, о чем я, продолжайте чтение...  Наполните settings/dev.py: from mysite.settings.base import * CURRENT_ENV = 'dev' Здесь мы указываем, что этот файл настроек унаследывает настройки из base.py и переопределяет строку CURRENT_ENV, найденную в base.py. Мы говорим: «Используй это значение вместо значения, найденного в наследуемом модуле». 5. Создайте API. Нам нужно нечто, с помощью чего мы сможем протестировать службы Angular, поэтому давайте создадим небольшое API. Этот шаг можно пропустить, но я не советовал бы делать этого. Нам важно знание того, что настройки приложения Angular работают исключительно с точки зрения его потенциала, чтобы облегчить HTTP запросы. Сгенерируйте приложение. manage.py startapp games Создайте модель в games/models.py. class Game(models.model): title = models.CharField(max_length=255) description = models.CharField(max_length=750) Создайте DRF сериализатор для модели игры в  applications/api/v1/serializers.py. from rest_framework.serializers import ModelSerializer from applications.games.models import Game class GameSerializer(ModelSerializer): class Meta: model = Game Создайте  DRF viewset для модели в приложениях applications/api/v1/viewsets.py. from rest_framework import viewsets from applications.games.models import Game from applications.api.v1.serializers import GameSerializer class GameViewSet(viewsets.ModelViewSet): queryset = Game.objects.all() serializer_class = GameSerializer В applications/api/v1/routes.py зарегистрируйте роуты, используя DRF's router registration features. from rest_framework import routers from applications.api.v1.viewsets import GameViewSet api_router = routers.SimpleRouter() api_router.register('games', GameViewSet) Обозначьте ссылки для зарегистрированного DRF роута внутри mysite/urls.py: from django.contrib import admin from django.conf.urls import include, url from applications.api.v1.routes import api_router urlpatterns = [ url(r'^admin/', admin.site.urls), # API:V1 url(r'^api/v1/', include(api_router.urls)), ] 6. Запустите сервер Django, используя dev settings. manage.py runserver --DJANGO_SETTINGS_MODULE=mysite.settings.dev Впуская DJANGO_SETTINGS_MODULE в runserver, мы «говорим» - работать используя специфические параметры. Если все работает, у вас появится возможность открыть localhost:8000/api/v1/games и увидеть ответ от DRF. Если все работает – самое время заняться построением приложения Angular. Если нет – направьте автору проблему. Если вы застряли на этом этапе – оставьте комментарий автору под оригиналом публикации. 7. Инициализируйте npm-пакет и установите front-end JS зависимости. Приложение Angular не будет работать так, как мы хотим, если правильные зависимости не будут установленны. Самое время установить базовые пакеты, которые понадобятся. Инициализируйте npm-пакет. Прямо из  frontend/ запустите npm init --yes By passing the --yes flag into init, you're telling NPM to generate a package.json using NPM defaults. Otherwise, if you don't pass that in, you'll have to answer questions... Boring. Установите dev dependencies.  npm install --save-dev eslint eslint-loader Установите общие зависимости. npm install --save eslint eslint-loader angular angular-resource angular-route json-loader mustache-loader lodash Файл package.json file во frontend/ должен выглядеть приблизительно следующим образом: { "name": "my-app", "version": "0.0.1", "description": "This is my first angular app.", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "eslint": "^3.1.1", "eslint-loader": "^1.4.1" }, "dependencies": { "angular": "^1.5.8", "angular-resource": "^1.5.8", "angular-route": "^1.5.8", "eslint": "^3.1.1", "eslint-loader": "^1.4.1", "json-loader": "^0.5.4", "lodash": "^4.13.1", "mustache-loader": "^0.3.1" } } Здесь то, что мы только что установили: eslint – отличный линтер, благодаря которому код JavaScript будет в порядке (последователен). eslint-loader – для запуска eslint через Webpack. Чуть позже я объясню концепцию «загрузчиков». angular -  MVC фреймворк. Если  вы не знали об этом, стоит подумать о том, чтобы закрыть эту страничку прямо сейчас. angular-resource -  (Angular) HTTP библиотека выбора. Это абстракция $http. json-loader - загрузчик (снова, используемый Webpack) для распаковки JSON из .json файлов с помощью require() во время работы нашего приложения. mustache-loader – загрузчик, который мы будем использовать, чтобы парсить наши mustache шаблоны. Mustache шаблоны – это веселье. Я могу спокойно предположить, что вы не знаете, как все эти пакеты заиграют вместе.  Не переживайте, братишки. 8. Создайте entry-point в Angular, объявите начальные зависимости, объявите первоначальные глобальные переменные. В frontend/app/app.js добавьте следующее: /* Libs */ require("angular/angular"); require("angular-route/angular-route"); require("angular-resource/angular-resource"); /* Globals */ _ = require("lodash"); _urlPrefixes = { API: "api/v1/", TEMPLATES: "static/app/" }; /* Components */ /* App Dependencies */ angular.module("myApp", [ "ngResource", "ngRoute", ]); /* Config Vars */ // @TODO in Step 13. /* App Config */ angular.module("myApp").config(routesConfig); app.js это то, где Webpack будет искать модули, чтобы бандлить их вместе. Лично я ценю такую организацию и методику вызовов, но такой порядок не обязателен. Существует 6 секций: Libs – главные библиотеки, используемые на протяжении работы Angular приложения; Globals – зарезервированные глобальные переменные, которые мы можем использовать во время работы приложения; Components (Компоненты) – особенные модули проекта; App Dependencies (Зависимости приложения) – объявление входной точки приложения и его зависимостей; Config Vars – переменные, где хранятся настройки, такие как route config; App Config - вводит configs (настройки) в приложение, используя сохраненные из предыдущей секции. Для того, чтобы globals работали, вам следует указать ESLint на то, какие из переменных - глобальные. В config/eslint.json добавляем следующее: { "env": { "node": true }, "extends": "eslint:recommended", "rules": { "indent": [ "error", 2 ], "linebreak-style": [ "error", "unix" ], "quotes": [ "error", "double" ], "semi": [ "error", "always" ], "no-console": 0 }, "globals": { "_": true, "_urlPrefixes": true, "angular": true, "inject": true, "window": true }, "colors": true } Ниже несколько переменных, о которых мы предупредили ESLint: _ представить lodash. _urlPrefixes – объект, который мы будем использовать в приложении для гиперссылок. Я расскажу об этом позже. angular, чтобы представить AngularJS object driving our entire application. inject, который будет использоваться для ввода зависимостей Angular. window, которая просто представляет объекты окон в JavaScript, является представителем  DOM. 9. Настройка Webpack. Теперь, когда мы выложили большинство наших зависимостей приложения, мы можем построить config file для Webpack. Webpack будет консолидировать все зависимости, а также модули для приложений, которые мы создаем в один файл. В bundle. В frontend/webpack.config.js добавляем следующее. module.exports = { entry: "./app/app.js", output: { path: "./dist/js/", filename: "bundle.js", sourceMapFilename: "bundle.js.map", }, watch: true, // eslint config eslint: { configFile: './config/eslint.json' }, module: { preLoaders: [{ test: /\.js$/, exclude: /node_modules/, loader: "eslint-loader" }], loaders: [ { test: /\.css$/, loader: "style!css" }, { test: /\.html$/, loader: "mustache-loader" }, { test: /\.json$/, loader: "json-loader" }] }, resolve: { extensions: ['', '.js'] } }; Для того, чтобы Webpack бандлил все наши статические зависимости, нам нужно указать ему, где их брать, какие зависимости обрабатывать и как управлять ими до банлинга. Давайте посмотрим на то, что указывает Webpack с помощью webpack.config.js: Entry - это путь к тому, что Webpack'у нужно для старта бандлинга. Это можеть быть полный путь или путь, относительный тому, где webpack.config.js располагается. В данном случае мы говорим о последнем варианте. output -  это объект, содержащий в себе path, который является директорией, в которую связанные зависимости будут помещаться; filename - это название бандла; и, в данном случае, мы решили использовать sourceMapFilename, чтобы обозначить, что наша() source map будет вызван(а). watch указывает Webpack следить за изменениями в файле, пока он выполняется. Если это не настроено как true, Webpack прогонит процесс бандлинга единожды и остановится. eslint содержит в себе специфические ESLint настройки, используемые eslint-loader. module указывает Webpack'у, что делать с модулями, с которыми он работает. module.preLoaders «говорит», что делать перед бандлингом. В данном случае мы хотим запустить модули (исключив модули установленные npm) через eslint. module.loaders - это то, где указана последовательность загрузчика. В нашем случае мы просто настраиваем test и loader,  где test указывает Webpack’у, какие модули запускать в загрузчике (по соответствию с паттерном regex), и loader говорит Webpack’y, какой загрузчик использовать в модулях, которые соответствуют regex паттерну в test. Каждый загрузчик указан в строке и разделен восклицательным знаком. Ex:  loader!another_loader!yet_another_loader module.preLoaders указывает, какие preLoaders'у запускать модули. Используемые настройки такие же точно, какие мы использовали в module.loaders. Но, Грег, какая  разница между preLoaders и loaders? Я рад, что ты спросил, мой дорогой друг!! A loader указывает Webpack'у, как бандлить требуемые файлы. Loader смотрит на модуль и говорт: «Эй, так как вы упаковываете это в один файл как строку – это то, как оно должно быть преобразованно для bundle'а». A preLoader обрабатывает код перед loaders, например, чтобы слинтить JavaScript модули. A postLoader является плагином Webpack'а, который обрабатывает код после бандинга. Мы не специфицировали ни один  postLoader ради простоты. 10. Укажите Django загрузить приложение. Прямо сейчас все, что нужно сделать – указать Webpack’у что создавать, как создавать и что должно быть создано. (На данном этапе я бы очень удивился, если вы попробуете запустить его и он заработает без ошибок. Если так и есть, я чертов мужик.) Так как Django использует свой собственный URL процессор в нашем приложении, мы можем быть рады тому, как любезно Django управляет всем тем, что введено в строку браузера пользователя. Как бы то ни было, мы бандлим одностраничное приложение, используя абсолютно другой фреймворк, и хотим, чтобы у приложения был полный контроль над тем, что пользователь вводит. Все, что нам нужно  – обслуживать одну страничку, в которой работает SPA. Следовательно... В backend/mysite/mysite/urls.py добавляем в список urlpatterns следующее: # Web App Entry url(r'^$', TemplateView.as_view(template_name="app/index.html"), name='index'), Это значит, что когда пользователь открывает mysite.com/, env('FRONTEND_ROOT') + app/index.html будет находить STATICFILES_FINDERS  в порядке рендера HTML шаблона. 11. Создайте шаблон базы приложения Angular. frontend/app/components/app/index.html шаблон должен выглядеть как обычный шаблон Django. В frontend/app/index.html добавляем следующее: {% load staticfiles %} <html ng-app="myApp"> <head> <title>My Sitetitle> <script src="{% static 'dist/js/bundle.js' %}">script> head> <body> body> html> В таком случае вам удастся запустить Webpack. Если вы запустите Django сервер и откроете localhost:8000,вы увидите пустую страничку. Если нет – дайте знать автору. 12. Напишите home component. Давайте напишем наш первый компонент. Он отобразит текст на страничке, пока пользователь открывает localhost:8000. Создайте директорию для компонента и базовые файлы. В frontend/app/components/: mkdir home && touch home/home-controller.js home/home.js home/home.html В frontend/app/components/home/home.html добавляем следующее: <div ng-controller="HomeController as ctrl"> <div> <h1>Home!h1> div> div> Теперь добавим следующее в  frontend/app/components/home/home-controller.js: function HomeController() { var that = this; that.foo = "Foo!"; console.log(that); // should print out the controller object } angular.module("Home") .controller("HomeController", [ HomeController ]) Определение модуля Angular должно быть объявлено в home.js: angular.module("Home", []); require("./home-controller"); Теперь мы можем сослаться на "Home" в области зависимости определения модуля. Давайте сделаем это! В app/app.js добавьте следующее: /* Components */ require("./components/home/home"); /* App Dependencies */ angular.module("myApp", [ "Home", // this is our component "ngResource", "ngRoute" ]); 13. Пропишите пути Angular'а, ведущие к home component и страничке 404. Нам нужно настроить первый путь. Когда пользователь попадает на localhost:8000, Angular должен взять контроль над загрузкой отрендеренного шаблона. Чтобы сделать это, нам потребуется использовать angular-router. В frontend/app/routes.js пишем следующее: function routesConfig($routeProvider) { $routeProvider .when("/", { templateUrl: _urlPrefixes.TEMPLATES + "components/home/home.html", label: "Home" }) .otherwise({ templateUrl: _urlPrefixes.TEMPLATES + "404.html" }); } routesConfig.$inject = ["$routeProvider"]; module.exports = routesConfig; Если мы не добавим _urlPrefixes.TEMPLATES, angular-router предположит, что components/home/home.html является действительной ссылкой, которую узнает сервер. Так как STATIC_URL в настройках предполагает неправильную работу localhost:8000/components/home/home.html. Также, если вы еще не заметили, вы увидите otherwise({...})  в коде роутов. Это то, как будут реализованы страницы 404. В frontend/app/404.html добавляем следующее: <h1>NOT FOUNDh1> И в завершении  добавляем frontend/app/app.js: /* Config Vars */ var routesConfig = require("./routes"); 14. Добавьте директивы angular-router к шаблону точки входа приложения. А теперь нам нужно указать Angular, где будет происходить переключение отображаемого, когда пользователь пользуется навигацией. Чтобы сделать это, мы используем всю силу angular-router. В тэг    в frontend/app/index.html добавляем: <base href="/"> Теперь в тэг  добавляем: <div ng-view>div> Ваш index.html теперь должен выглядеть так: {% load staticfiles %} <html ng-app="myApp"> <head> <title>My Sitetitle> <script src="{% static 'dist/js/bundle.js' %}" >script> <base href="/"> head> <body> <div> <div ng-view>div> div> body> html> Запустите Webpack. Откройте localhost:8000. Вы должны увидеть, что произошло в home/home.html. (Если ничего, отправьте эти данные автору J ). 15. Проверьте REST API в приложении Angular. Если все сделано, у вас появится возможность написать angular службы для Django API. Давайте создадим небольшой компонент, чтобы увидеть, можем ли мы это сделать. Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр. Создайте скаффолд компонент в frontend/app/components/: mkdir -p game/list/ && touch game/list/game-list-controller.js game/list/game-list-controller_test.js game/game-service.js game/game.js game/game.html Этот компонент будет перечислять игры. Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр. В game/game-service.js: function GameService($resource) { /** * @name GameService * * @description * A service providing game data. */ var that = this; /** * A resource for retrieving game data. */ that.GameResource = $resource(_urlPrefixes.API + "games/:game_id/"); /** * A convenience method for retrieving Game objects. * Retrieval is done via a GET request to the ../games/ endpoint. * @param {object} params - the query string object used for a GET request to ../games/ endpoint * @returns {object} $promise - a promise containing game-related data */ that.getGames = function(params) { return that.GameResource.query(params).$promise; }; } angular.module("Game") .service("GameService", ["$resource", GameService]); Обратите внимание на ссылку $resource, которую мы используем для того, чтобы настроить механизмы HTTP в нашей службе. В game/list/game-list-controller.js: function GameListController(GameService) { var that = this; /* Stored game objects. */ that.games = []; /** * Initialize the game list controller. */ that.init = function() { return GameService.getGames().then(function(games) { that.games = games; }); }; } angular.module("Game") .controller("GameListController", [ "GameService", GameListController ]); В game/game.html: <div ng-controller="GameListController as ctrl" ng-init="ctrl.init()"> <div> <h1>Gamesh1> <ul> <li ng-repeat="game in ctrl.games">{{ game.title }}li> ul> div> div> В game/game.js: angular.module("Game", []); require("./list/game-list-controller"); require("./game-service"); Затем обратимся к компоненту в app.js: /* Components */ require("./components/game/game"); /* App Dependencies */ angular.module("myApp", [ "Home", "Game", "ngResource", "ngRoute" ]); В конце концов, мы собираемся настроить роуты для списка игр, поэтому в frontend/app/routes.js добавьте следующее в объект $routeProvider: .when("/game", { templateUrl: _urlPrefixes.TEMPLATES + "components/game/list/game-list.html", label: "Games" }) Запустите Webpack снова. Все должно верно скомпилироваться. Если нет – дайте знать автору. Откройте localhost:8000/#/games. Вы увидите список игр. Сделано! Это все. Сомнения/Мысли Но есть некоторые сомнения: Глобальные переменные могут конкретно подставить вас, если вы не знаете, как с ними работать. Их локальное поведение не гарантирует того же на продакшене. Насколько я помню, их можно заставить работать, если правильно описан метод. Ваше приложение на Angular тесно связанно с Django. Поэтому ваше приложение не будет просто слиянием back- и фронтенда. Если ваш Django-RIP давно устарел, значит поменялись и маршруты, следовательно сконфигурируете ваш бэкенд согласно тому, как должны вести себя статические файлы. Так же вам будет необходимо заменить index.html с точкой входа Angular. Маленькие проекты не дадут вам особо попотеть, а вот большие явно заставят понервничать. Совет: единственное место, где должны сопрягаться приложение на Angular и Django сервер - это одна точка входа. Деплоймент должен быть выполнен так же, как любой обычный деплоймент приложения. Это все. Если у вас есть какие-либо вопросы и вы испытываете трудности, пожалуйста, оставьте их в комментариях в исходной статье! Чит! Автор пообещал выложить на гитхабе репозиторий со всем кодом. Оригинальная статья на английском языке. 
SVG animation

Автор: Дмитро Івченко

Обзор SVG графика может быть анимирована с использованием анимационных тегов. Они были описаны в спецификации Animation SMIL. Рассмотрим эти теги: позволяет анимировать свойства в течение времени. это удобное сокращение, которое полезно для присвоения значений анимационных нечисловых атрибутов и свойств, таких как свойства opacity. который двигает вдоль траектории движения path. которая модифицирует значение цвета отдельных атрибутов или свойств с течением времени. В дополнение к элементам, определенных в SMIL, SVG включает расширения, совместимые с SMIL анимацией спецификации. Эти расширения включают в себя атрибуты, которые расширяют функционал элемента. Расширения SVG включают в себя: - дает возможность анимировать один из SVG атрибутов в течение промежутка времени, например, в качестве атрибута преобразования нового центра фигуры или преобразование фигуры и использование поворота вокруг одной из осей (Х, Y, Z). path(attr) - позволяет анимировать  вдоль определенного пути.    - используется в сочетании с animateMotion элемента для ссылки на траекторию движения, которая должна быть использована в качестве пути для движения. Элемент mpath входит внутрь animateMotion элемента перед закрывающим тегом. keypoints (attr) - задается в качестве атрибута для animateMotion, обеспечивая точный контроль скорости траектории движения анимации. rotate(attr) - используется в качестве атрибута для animateMotion для того, чтобы контролировать поворот относительно оси поворота. SVG анимации могут быть похожи на CSS анимации. Ключевые кадры создаются, объекты движутся. Но они могут сделать нечто, что CSS анимации не делает. Применение SVG Анимации SVG элементы можно стилизовать и анимировать и с помощью CSS. В принципе, любое преобразование или анимации перехода, которые могут быть применены к HTML элементу, также могут быть применены к SVG. Но существуют некоторые SVG свойства, которые не могут быть сделаны через CSS. Векторная версия путь, например, поставляется с набором данных path, который определяет траекторию этому пути. Эти данные могут быть изменены и анимированных через SMIL, но не CSS. Это потому, что SVG элементы описаны набором атрибутов, известных как SVG атрибуты представления. Если вы предпочитаете использовать JavaScript, я рекомендую использовать snap.svg, который описан как "в JQuery в SVG". Вот коллекция примеров. http://snapsvg.io/demos/ Если вы предпочитаете декларативный подход анимации, вы можете применять элементы SVG анимации, о которых я расскажу. Еще одно преимущество SMIL над JS анимацией в том, что JS анимации не работают, когда SVG встроен в качестве IMG или используется в качестве фона изображения в CSS. SMIL анимации работают в обоих случаях. Это большое преимущество, на мой взгляд. Поддержка браузеров Поддержка браузеров для SMIL анимации довольно приличная. Они воспроизводятся во всех браузерах, кроме IE. Подробный обзор поддержки браузеров вы можете посмотреть в таблице совместимости на caniuseit. Если вам нужно обеспечить альтернативный вариант для SMIL анимации, вы можете проверить поддержки браузера на лету, используя Modernizr. Если SMIL не поддерживается, вы можете предоставить какой-то запасной вариант (анимации JavaScript, например). Анимация атрибутов элемента из одного значения к другому в течение произвольного времени с указанием конечного состояния: from, by, to, dur и fill. Давайте рассмотрим с перемещением круга из одного положения в новое. Это можно сделать, изменив значение его атрибута сх (который определяет х - положение его центра). Мы собираемся использовать элемент, чтобы сделать это. Атрибуты, которым устанавливают числовые значения и цвета, как правило, анимированные с помощью . Для получения списка атрибутов, которые могут быть анимированными, обратитесь к этой таблице: http://www.w3.org/TR/SVG2/animate.html#AnimationAttributesAndProperties Чтобы изменить значение на другое в течение времени используются from, by, to, dur и fill. В дополнение к этому, вы также хотите указать, когда анимация должна начинаться с атрибутом начала. В приведенном примере, я определил круг, а затем вызываю анимацию на этом круге. Центр окружности перемещается из исходного положения - 500 единиц, до 1750 единиц вдоль оси х. Начальное значение установлено на кнопку мыши. Это означает, что круг будет двигаться, когда она нажата. Вы можете установить это значение к значению времени, а также. Например, начинают = "0s" начнет анимацию, как только страница загружена. Вы можете задержать анимацию, установив положительное значение времени. Например, начать = "6s" запустит анимацию через шесть секунды после нагрузки. Атрибут Dur похож на анимации-импульса в CSS. from - to атрибуты похожи на from to ключевых кадров в keyframe блока анимации в CSS: Повторяющиеся анимации с Repeat-Count Когда вы хотите воспроизвести анимацию несколько раз, вы можете сделать это с использованием атрибута RepeatCount. Можно указать, сколько раз вы хотите повторить или использовать ключевое слово, чтобы он без конца повторять. Так что, если мы должны были повторить анимацию вида круга в течение двух раз, код будет выглядеть так: Управление значениями ключевых кадров анимации: keyTimes и values. В CSS, мы можем задать значения, которые мы хотим, чтобы взять в определенные рамки во время анимации. 0%, 40 % , 80 % и 100% являются кадрами анимации. Анимация вдоль определенных путей: Хорошие примеры таких анимаций можно посмотреть здесь http://codepen.io/mileselam/pen/kprKm http://codepen.io/rossfenrick/pen/gpzJzz http://codepen.io/tmrDevelops/pen/yyveKv Так же более подробный пример есть на хабре http://habrahabr.ru/post/207908/ Функция прохода анимации Еще один важный элемент — это функция по которой будет проходить анимация. Среди всем известных функций анимации мы знаем ease, ease-in, ease-out, linear. Но если Вы хотите создать свою функцию прохождения анимации, то вам сюда http://cubic-bezier.com/ И напоследок лучший пример, от которого просто невозможно оторвать глаз http://codepen.io/thiennhat/pen/BNByzJ?editors=001 Пробуйте и у вас все получится!
Notification success