Изучение web-разработки

Интуитивно, у веб технологий достаточно большой потенциал для образовательных целей. Но Когда я последний раз пытался объяснить азы веб-разработки на примере простой статичной страницы, то сразу обрушил на ученика огромное количество информации. Что такое NodeJS (а значит и JS), как работает управление пакетами и какой менеджер выбрать, package.json и зависимости, базовый фреймворк, SSG-генератор, как это всё запустить и потом удивиться, что примитивная страница с текстом Hello заняла столько времени и 200МБ дискового пространства.

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

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

В начале был DOM

Как правило, в учебниках по веб-разработке первым шагом идёт знакомство с HTML. Но это всего лишь язык разметки, который браузером трансформируется в DOM. Точно также в DOM трансформируется и другой веб-столп - CSS или язык векторной графики SVG. Виртуальный DOM создают и всевозможные веб-фреймворки (React, Vue, Angular и т.п.). Можно написать веб-приложение, практически не используя ничего из этого, но не обойтись без DOM.

Другое преимущество DOM заключается в том, что эта концепция вездесуща. В дальнейшем ученик найдёт её в мобильных (UIKit) и настольных (XAML) приложениях. Практически любой пользовательский интерфейс, например Scene Collection в инструменте 3D моделирования Blender - это такая же навигация по дереву DOM.

DOM расшифровывается как Document Object Model, то есть это модель объектов документа. И его объяснение можно выгодно начать с понятия документа. Мы берём некоторый условный документ, пусть он наглядно будет в форме книги, открываем его и с высокой степенью вероятности видим большие главы. Внутри глав могут быть разделы, внутри разделов - параграфы, таблицы и иллюстрации.

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

Браузер как среда разработки

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

Мы привыкли к тому, что открывая браузер мы вводим адрес сайта. Это даёт нам возможность получить документ, который создан другими людьми. Но давайте попробуем создать свой документ и для этого введём в адресной строке data:text/plain,Hello. В результате мы увидим страницу с текстом Hello. Префиксом data: мы указали, что будем работать с указанными данными, text/plain говорит о типе наших данных как простом тексте, а после запятой идёт сам текст.

Можно попробовать и другой вариант data:text/html,<html contenteditable>. В этом случаем мы сделали себе небольшой редактор, в котором можно писать текст. Может иметь смысл набросать некоторый текст, потом нажать F12, найти какой-то элемент и назначить ему стили (скажем font-size, font-weight, font-family, color). Нажав Ctrl+S мы сможем его сохранить. Таким нехитрым образом мы получили полнотекстовый редактор с очень богатыми возможностями, о которых будет известно далее.

Подводя итог под демонстрацией этих двух типов можно подчеркнуть обилие всевозможных типов документов в Интернете и HTML всё не ограничивается.

Дальше есть как минимум два варианта развития событий, котоые имеет смысл рассмотреть и оценить: SVG-трек и HTML-трек.

SVG-трек

Если начать изучение с SVG то можно продемонстрировать как выразительность с точки зрения языков разметки (XML, пространства имён и т.п.), так и визуальную выразительность, поскольку SVG является языком векторной графики.

Отправной точкой может стать адрес data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"/>. Здесь кроется определённый вызов, поскольку в SVG есть пространства имён, которые необходимо указывать. Но с другой стороны это создаёт определённые преимущества, поскольку даёт фундаментальное понимание. Можно отложить объяснение до материалов ниже, где будут рассмотрены конкретные графические элементы.

Теперь можно перейти в консоль (F12) и начать процесс знакомства с DOM через написание кода. Пока это будет короткий черновой вариант. Потом стоит подумать над чем-то визуально более впечатляющим. Может заложить основы простой игры.

Варианты:

// Здесь можно рассказать про документ и его корневой элемент, а также показать в консоли, что
// возвращает document, document.constructor, document.documentElement и
// document.documentElement.constructor. А также как это соотносится с svg+xml в адресе.
let root = document.documentElement;

// Объясняти создание и добавление элемента в DOM. Показать на закладке Elements получившуюся стуктуру.
let c1 = document.createElement("circle");
c1.setAttribute("r", 50);
root.appendChild(c1);

// Объяснить, как влияют пространства имён, почему браузер не расползнал circle.
let c2 = document.createElementNS(root.namespaceURI, "circle");
c2.setAttribute("r", 50);
root.appendChild(c2);

// Просто немного декорируем элемент
c2.setAttribute("cx", 100);
c2.setAttribute("cy", 100);
c2.style.fill = "red";

// Добавляем к элементу анимацию, показываем как изменилось дерево DOM.
let a = document.createElementNS(root.namespaceURI, "animate");
a.setAttribute("attributeName", "r");
a.setAttribute("repeatCount", "indefinite");
a.setAttribute("dur", "3s");
a.setAttribute("values", "50;0;50");
c2.appendChild(a);
a.beginElement();

// Что подчеркнуть дерево, можно создать ещё одну анимацию. Возможно, через клонирование.
// Или потом вывести на использование функций для избавления от дублирования кода.
let a2 = document.createElementNS(root.namespaceURI, "animate");
a2.setAttribute("attributeName", "cx");
a2.setAttribute("repeatCount", "indefinite");
a2.setAttribute("dur", "3s");
a2.setAttribute("values", "100;200;100");
c2.appendChild(a2);
a2.beginElement();

// Переход к интерактиву
c2.onclick = () => console.warn("click");

// Переход к композитным элементам для повторного использования.

Дальнейшее сравнение SVG и Canvas может помочь продемонстрировать разницу между императивным и декларативным подходами. А шейдеры показать параметрические подходы.

HTML-трек

3D-трек

Workers

Для того, чтобы научиться работать в клиент-серверной архитектуре, совершенно не обязательно погружаться в NodeJS или вообще в серверную разработку. Вполне достаточно использовать service workers. Перехват событий fetch в последних позволит эмулировать серверные ответы. Что хорошо и для объяснений концепций тестирования.

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

Деплоймент

Продемонстрировать, как простой сайт может быть размещён на Cloudflare/Netlify/Vercel и т.п.