От нуля до героя фронтенда (Часть 2)

Это вторая статья из серии “От нуля до героя фронтенда”. В первой части вы научились создавать раскладку при помощи HTML и CSS и познакомились с некоторыми лучшими практиками. Во второй части мы сосредоточимся на изучении языка JavaScript, способах добавления интерактива в интерфейс, принципах и основных шаблонах в JavaScript и на создании веб-приложений.

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

Если вы еще не читали первую статью, то начните с нее, а потом вернитесь сюда.

Основы JavaScript

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

Язык

Перед началом изучения области применения JavaScript в вебе, мы рассмотрим его как язык. Сперва прочитайте Ускоренный курс по основам языка от Mozilla Developer Network (MDN). Этот материал разъяснит основные языковые конструкции: переменные, условия и функции.

Дальше прочитайте некоторые главы в Руководстве по JavaScript от MDN:

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

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

Интерактивность

Одна из областей применения JavaScript — добавление интерактивности вашей странице

Теперь, когда у вас есть представление о JavaScript как о языке, можно перейти к его применению в вебе. Для понимания того, как JavaScript взаимодействует с сайтами, вы должны сначала узнать об объектной модели документа (DOM).

DOM является отражением структуры HTML-документа. Это древовидная структура, состоящая из объектов JavaScript, которые соответствуют узлам HTML. Для дальнейшего изучения DOM, прочитайте Что такое DOM? в переводе Frontender Magazine. Статья даст вам простое и понятное объяснение понятия DOM.

Инспектируем DOM

JavaScript взаимодействует с DOM и изменяет или обновляет его. Вот пример, в котором мы выбираем HTML элемент и изменяем его содержимое:

var container = document.getElementById(“container”);
container.innerHTML = 'New Content!';

Не волнуйтесь, что это какой-то очень элементарный пример. Вы можете сделать гораздо больше этого при помощи манипуляций с DOM. Чтобы узнать больше о использовании JavaScript для взаимодействий с DOM, пройдите в раздел Руководство по DOM в документации MDN.

Опять же, сосредоточьтесь на понимании концепции, минуя синтаксис. У вас должны быть ответы на следующие вопросы:

  • Что такое DOM?
  • Как обратится к элементам?
  • Как добавить обработчик событий?
  • Как изменить свойства узла DOM?

Для получения полного списка доступных манипуляций с DOM при помощи JavaScript, обратитесь к JavaScript Functions and Helpers от PlainJS. Этот сайт содержит объяснения того, как, например, менять свойства стилей HTML-элементов или обрабатывать события клавиатуры. Если вы хотите копнуть глубже, то вы всегда можете прочитать раздел о DOM в книге Выразительный JavaScript.

Инспектор

Для отладки клиентской части JavaScript, мы используем встроенные в браузер инструменты разработчика. Панель инспектора доступна в большинстве браузеров и предоставляет доступ к исходным ресурсам страницы. Вы можете отслеживать выполнение JavaScript, выводить команды отладки в консоль, видеть сетевые запросы и задействованные ресурсы.

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

Инструменты разработчика в Chrome

Отрабатываем основы

На данный момент вам предстоит еще многое узнать о JavaScript. Тем не менее предыдущий раздел содержал горы новой информации. Я думаю, что пришло время сделать перерыв в теории и провести несколько небольших экспериментов. Они помогут закрепить только что изученные понятия.

Эксперимент 1

Для первого эксперимента идите на AirBnB, откройте панель инспектора и перейдите во вкладку Console. В этой вкладе вы можете выполнять JavaScript код на странице. Мы собираемся немного повеселится и совершить несколько манипуляций с элементами на странице. Посмотрим сможете ли вы проделать все описанные ниже манипуляции с DOM.

Airbnb.ru

Я выбрал сайт AirBnB потому что их имена классов в CSS интуитивно понятны и код не обфусцирован никаким компилятором. Не смотря на это вы в праве выбрать любой другой сайт и выполнить задание на нем.

  • Выберите тег заголовка с уникальным именем класса и поменяйте текст
  • Выберите любой элемент на странице и удалите его
  • Выберите любой элемент и измените у него одно CSS свойство
  • Выберите одну определенную секцию (тег section) и переместите ее на 250 пикселей вниз
  • Выберите любой компонент, например панель, и измените его видимость (visibility)
  • Напишите функцию с именем doSomething, которая будет выводить уведомление (alert) “Hello world” и вызовите ее
  • Выберите определенный тег параграфа (p), добавьте обработчик события click на него и вызывайте функцию doSomething каждый раз, когда событие происходит

Если вы застряли, то вернитесь к статье JavaScript Functions and Helpers и освежите знания. В большинстве заданий я основываюсь на этом документе. Ниже приведено возможное решение первого задания в списке:

var header = document.querySelector(‘.text-branding’)
header.innerText = ‘Boop'

Главная цель эксперимента — посмотреть как реально работают те вещи, которые вы узнали о JavaScript и DOM.

Эксперимент 2

JavaScript создан в помощь разработчикам

Используя CodePen, напишите не сложный, но функциональный код JavaScript, применяя манипуляции c DOM и программную логику в функциях. Сфокусируйтесь в этом эксперименте на том, чтобы взять знания из статьи От нуля до героя фронтенда (Часть 1) и объединить их с JavaScript. Вот несколько вдохновляющих примеров:

Больше JavaScript

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

Язык

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

Императивный vs. Декларативный

Есть два типа подхода к тому, как JavaScript взаимодействует в DOM: императивный и декларативный. С одной стороны декларативное программирование сосредоточено на том, что происходит. С другой стороны императивное программирование сосредоточено не только на том, что происходит, но и как.

var hero = document.querySelector('.hero')
hero.addEventListener(‘click’, function() {
var newChild = document.createElement(‘p’)
newChild.appendChild(document.createTextNode(‘Hello world!’))
newChild.setAttribute(‘class’, ‘text’)
newChild.setAttribute(‘data-info’, ‘header’)
hero.appendChild(newChild)
})
}

Это пример императивного программирования, когда мы вручную запрашиваем элемент и вкладываем структуру в DOM. Другими словами концентрируемся на том, как достичь чего-то. Самая большая проблема этого кода — он слишком хрупкий. Если кто-то в процессе работы поменяет имя класса в HTML с hero (герой) на villain (злодей), обработчик событий больше не будет срабатывать, поскольку в DOM нет никакого класса hero.

Декларативное программирование решает эту проблему. Вместо того, чтобы выбрать элемент вы оставляете это на откуп фреймворку или библиотеке, которую вы используете. Это позволяет сосредоточить внимание на том, что делается, вместо того, как это делается. Для получения большей информации прочитайте The State Of JavaScript — A Shift From Imperative To Declarative и Three D’s of Web Development #1: Declarative vs. Imperative.

Это руководство в первую очередь учит вас императивному подходу перед введением декларативного подхода с фреймворками, например Angular, и библиотеками типа React. Я рекомендую обучаться именно в таком порядке потому что это позволит вам увидеть проблемы, которые решает декларативное программирование на JavaScript.

Ajax

В ходе прочтения некоторых из перечисленных статей и учебных пособий вы наверняка не раз сталкивались с упоминанием термина Ajax. Ajax — это технология, позволяющая странице взаимодействовать с сервером при помощи JavaScript.

Ajax делает контент динамическим

Например, когда мы отправляем форму на сайте, значения полей собираются и формируется HTTP запрос, который отправляет данные на сервер. Когда вы постите твит в Твиттер, ваш Твиттер-клиент создает HTTP запрос к серверу API Твиттера и обновляет страницу на основании ответа сервера.

Подробнее об Ajax можно прочитать в What is Ajax. Если вы до сих пор не получили отчетливого представления о AJAX, обязательно посмотрите Explain it like i’m 5, what is Ajax. Но даже если и этого не достаточно, то вы можете почитать главу о HTTP в книге Выразительный JavaScript.

Новые браузеры стандартно используют Fetch для создания HTTP запросов. Вы можете побольше узнать о Fetch в статье, которую написал Dan Walsh. В ней рассказано, как работает Fetch и как его использовать. Вы так же можете найти полифилы для Fetch и документацию к ним.

jQuery

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

Одна из самых популярных таких библиотек — jQuery. Запомните, что jQuery является императивной библиотекой. Она была написана еще до того, как фронтенд системы стали такими сложными как сегодня. Теперь для управления сложными интерфейсами чаще используют декларативные фреймворки и библиотеки наподобие Angular и React. Тем не менее я по-прежнему рекомендую вам изучить jQuery, поскольку вполне вероятно, что вы столкнетесь с ним в своей работе.

Абстрактно говоря, jQuery находится на вершине простых DOM манипуляций

Для изучения основ jQuery, ознакомьтесь с материалами в Учебном центре. Они шаг за шагом проведут вас по таким важным понятиям, как, например, анимация или обработка событий. Если вы хотите больше обучающих материалов на эту тему, то я даю вам ссылки на курс от Codecademy по jQuery.

Имейте в виду, jQuery не всегда подходит для императивного манипулирования DOM. PlainJS и You Might Not Need jQuery — два хороших ресурса, которые покажут вам эквиваленты функций jQuery на чистом JavaScript.

ES5 vs. ES6

Еще одна важная концепция, которую нужно понять, это отношение ECMAScript к JavaScript. Есть два основных направления в JavaScript, c которыми вы можете столкнуться в повседневной работе: ES5 и ES6. ES5 и ES6 это стандарты ECMAScript, которые использует JavaScript. Вы можете думать о них, как о версиях JavaScript. Окончательная спецификация ES5 была выпущена в 2009 и мы пользуемся ею до сих пор.

ES6, так же известный как ES2015, является обновленным стандартом и предусматривает новые конструкции языка JavaScript, например константы, классы и шаблонные строки. Важно отметить, что ES6 привносит новые возможности языка, но по прежнему определяет их семантику с точки зрения ES5. К примеру, классы в ES6 являются лишь “синтаксическим сахаром” для уже существующих в JavaScript прототипных наследований.

Важно знать оба стандарта, ES5 и ES6, поскольку на текущий момент в разработке приложений могут использоваться как один, так и другой. Делюсь хорошими инструкциями по ES6: ES5, ES6, ES2016, ES.Next: What’s going on with JavaScript versioning и Getting Started with ES6 — The Next Version of JavaScript от Dan Wahlin. После их прочтения ознакомьтесь с полным списком отличий ES5 от ES6 в ES6 Features. Если вам все еще не достаточно, то зайдите на этот Github репозиторий с функциями ES6.

Больше практики

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

Эксперимент 3

Flipboard.com

Эксперимент 3 сфокусирован на том, чтобы отточить навыки работы с DOM манипуляциями и jQuery. Для этого эксперимента мы применим более структурированный подход. Мы будем клонировать главную страницу Flipboard, и добавлять интерактив при помощи знаний из руководства по JavaScript.

Во время прохождения курса сосредоточьтесь на понимании того, как сделать сайт интерактивным, когда это действительно нужно и как применять при этом jQuery.

Эксперимент 4

Dieter Rams Clock

Эксперимент 4 объединяет все что вы узнали о HTML и CSS, а так же знания по JavaScript. В рамках этого задания вы создадите часы с собственным дизайном и сделаете их интерактивными при помощи JavaScript. Перед началом я рекомендую прочитать Decoupling Your HTML, CSS, and JavaScript с целью изучения основных соглашений по именованию классов в случаях, когда в разработке участвует JavaScript. Я так же подготовил список примеров на CodePen. Вы можете использовать их как шпаргалки для этого эксперимента. Если нужно больше — поищите по слову clock на CodePen.

Есть два способа выполнения этого задания. Можете начать с проектирования и создания макета на HTML и CSS, а затем добавить JavaScript. Или вы можете сначала написать логику на JavaScript, а затем перейти к разметке и стилям. Вы можете использовать jQuery или чистый JavaScript.

JavaScript-фреймворки

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

Я не буду описывать все JavaScript-фреймворки. Тем не менее вот краткий перечень основных: Angular, React + Flux, Ember, Aurelia, Vue и Meteor. Вам не нужно изучать их все. Выберите один и научитесь работать с ним. Не пытайтесь угнаться за всеми новинками. Вместо этого постарайтесь понять основную философию разработки и принципы, на которых строятся фреймворки.

Архитектурные шаблоны

Прежде чем углубляться в изучение фреймворков, важно понять несколько моделей архитектуры, которые используются в них: модель MVC, модель MVVM и модель MVP. Эти паттерны были спроектированы для создания понятного разделения ответственности между уровнями приложения.

Разделение ответственности это принцип, по которому приложение разделяется на отдельные специфичные области. Например, вместо того, чтобы хранить структуру приложения в HTML, вы можете использовать объект JavaScript — обычно называемый моделью — для хранения структуры.

Чтобы узнать больше об этих моделях, для начала прочитайте о MVC в Chrome Developers. После этого прочитайте Understanding MVC And MVP (For JavaScript And Backbone Developers). Не думайте пока об изучении Backbone, просто пройдитесь по частям, объясняющим MVC и MVP.

Addy Osman так же написал о MVVM в статье Understanding MVVM — A Guide For JavaScript Developers. Чтобы узнать о причинах и истории возникновения MVC прочитайте эссе на GUI Architectures от Martin Fowler. И наконец прочитайте раздел JavaScript MV* Patterns в книге Learning JavaScript Design Patterns. Это фантастическая и совершенно бесплатная книга.

Шаблоны проектирования

JavaScript-фреймворки не изобретают колесо. Большинство из них основано на шаблонах проектирования. Вы можете думать о шаблонах проектирования как о паттернах решении распространенных проблем в сфере разработки.

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

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

AngularJS

AngularJS — это JavaScript-фреймворк с MVC и иногда MVVM. Он поддерживается корпорацией Google и взял сообщество JavaScript штурмом в момент своего выхода в 2010.

AngularJS — то, каким должен быть HTML

Angular является декларативным фреймворком. Одним из самых полезных для меня материалов с точки зрения понимания того, как перейти от императивного к декларативному программированию на JavaScript, оказался How is AngularJS different from jQuery на StackOverflow.

Если вы хотите узнать побольше о работе с Angular, то советую ознакомится с документацией. У них так же есть туториал под названием Angular Cat, который позволит с ходу окунутся в разработку. Более полное и детальное руководство по Angular вы сможете найти в Github репозитории у Tim Jacobi. Кроме того изучите best practice styleguide от John Papa.

React + Flux

Angular решает множество проблем, с которыми сталкивается фронтенд-разработчик в процессе работы над комплексными системами. Другим популярным инструментом является React, представляющий из себя библиотеку для создания пользовательских интерфейсов. Вы можете думать о нем как о V в MVC. Поскольку React это только библиотека, он часто встречается как компонент архитектуры под названием Flux.

JavaScript-библиотека для построения интерфейсов

Facebook создал React и Flux для решения некоторых недостатков MVC и проблем с масштабированием. Посмотрите их широко известную презентацию Hacker Way: Rethinking Web App Development at Facebook. В ней говорится о происхождении и особенностях Flux.

Чтоб начать работу с React и Flux, сперва изучите React. Хорошим учебником для начинающих будет документация React. После этого переходите к React.js Introduction For People Who Know Just Enough jQuery To Get By, чтобы помочь себе отойти от jQuery-мышления.

Когда у вас появится общее представление о React, начинайте изучать Flux. Стоит сперва прочитать официальную документацию Flux. После этого посетите Awesome React — сборник ссылок, которые помогут продвинуться дальше в вашем обучении.

Практика с фреймворками

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

Эксперимент 5

Эксперимент 5 заключается в том чтобы взять и построить заново часть Todo MVC приложения, игнорируя фреймворки. Другими словами, используйте старый добрый JavaScript. Целью этого эксперимента является демонстрация того, как MVC работает без смешения со специфичным синтаксисом фреймворков.

Перед началом посмотрите, как это будет выглядеть в конечном результате TodoMVC. Первым делом начните новый проект локально и создайте три компонента MVC. Поскольку это довольно сложный эксперимент, все исходники к нему вы сможете найти на Github. Не страшно, если у вас не получится повторить проект полностью или на это просто не хватает времени. Скачайте репозиторий и поиграйтесь с разными компонентами MVC до тех пор, пока не поймете их отношения друг с другом.

Эксперимент 6

Эксперимент 6 будет хорошей тренировкой работы с MVC. Понимание MVC является крайне важным при изучении основ JavaScript-фреймворков. В эксперименте 6 следуйте учебнику Scotch.io для создания клона Etsy с использованием Angular.

Build an Etsy Clone with Angular and Stamplay научит вас как создавать веб-приложения на Angular, интерфейсы с API и как структурировать большие проекты. После прохождения всех уроков у вас должны быть ответы на следующие вопросы:

  • Что такое веб-приложение?
  • Как MVC/MVVM взаимодействует с Angular?
  • Что такое API и какие функции выполняет?
  • Как организовать и структурировать большие объемы кода?
  • В чем преимущества разделения вашего интерфейса на компоненты?

Если вы хотите проверить свои силы и построить больше приложений на основе Angular, то попробуйте Build a Real-Time Status Update App with AngularJS & Firebase.

Эксперимент 7

React и Flux- мощная комбинация для построения комплексных приложений

Теперь, когда вы потренировались в применении MVC, пришло время Flux. Эксперимент 7 заключается в создании списка задач с использованием React и Flux. Вы можете найти полный учебный курс на сайте с документацией Facebook’s Flux. Курс шаг за шагом объяснит, как использовать React и как Flux применяется для создания веб-приложений.

После окончания этого курса вы можете перейти на следующий уровень, прочитав учебники How to Build a Todo App Using React, Redux, and Immutable.js и Build a Microblogging App With Flux and React.

Будьте в курсе

Как и остальная часть фронтенда, область JavaScript стремительно меняется. Очень важно всегда быть в курсе происходящего.

Пейзаж JavaScript стремительно меняется

Ниже я привожу список наиболее интересных и информативных сайтов, блогов и форумов.

Примечание переводчика: оставляйте ссылки на хорошие русскоязычные сайты в комментариях или private note.

Учитесь на примерах

Как всегда лучшим способом обучение является обучение на примерах.

Стайлгайды

Стайлгайды для JavaScript представляют собой наборы соглашений в вопросах написания кода и созданы для того, чтобы ваш код легко читался и был прост в плане поддержки.

Базы кода

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

Сворачиваемся

К концу этого руководства вы должны иметь твердые знания основ JavaScript и уметь применять их в своей работе. Помните, это руководство является обобщенным путеводителем. Если вы хотите стать героем фронтенда, то очень важно постоянно практиковать полученные знания. Больше времени уделяйте работе над проектами. Чем больше проектов вы реализуете, чем более вы будете вовлечены в работу, тем быстрее вы сможете овладеть знаниями в совершенстве.

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

Если вы хотите чтобы я подробно на чем-то остановился или у вас появились вопросы, то не стесняйтесь писать мне в Twitter.

P.S. Поделитесь этой статьей с друзьями (нажмите сердечко), если она вам понравилась. Это много значит для меня.


Нашли ошибку? Воспользуйтесь функцией Private notes: выделяете текст с ошибкой, нажимаете на символ замка в появившемся дудле и оставляете свой комментарий. Спасибо!

Перевод статьи From Zero to Front-end Hero (Part 2) by Jonathan Z. White