<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Данила Маврин</title><generator>teletype.in</generator><description><![CDATA[Full-stack JavaScript Developer]]></description><image><url>https://img2.teletype.in/files/d0/ed/d0edfb0e-6064-4c17-8157-1c9765b8d368.png</url><title>Данила Маврин</title><link>https://teletype.in/@shotmeow</link></image><link>https://teletype.in/@shotmeow?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/shotmeow?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/shotmeow?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Apr 2026 14:08:11 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 14:08:11 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@shotmeow/how-browser-draw-pages</guid><link>https://teletype.in/@shotmeow/how-browser-draw-pages?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow</link><comments>https://teletype.in/@shotmeow/how-browser-draw-pages?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow#comments</comments><dc:creator>shotmeow</dc:creator><title>Как браузер рисует страницы</title><pubDate>Mon, 20 Feb 2023 10:10:58 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/cd/27/cd27460d-61fc-4e08-9b54-39d37d57008f.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/16/13/1613aa89-7ca8-4d45-85ed-6bce93e3c984.jpeg"></img>При загрузке сайта, браузер выполняет множество операций, которые так или иначе влияют на отрисовку страницы. Эти операции в целом можно поделить на несколько стадий.]]></description><content:encoded><![CDATA[
  <figure id="8smo" class="m_column">
    <img src="https://img2.teletype.in/files/16/13/1613aa89-7ca8-4d45-85ed-6bce93e3c984.jpeg" width="1200" />
  </figure>
  <p id="HTly">При загрузке сайта, браузер выполняет множество операций, которые так или иначе влияют на отрисовку страницы. Эти операции в целом можно поделить на несколько стадий.</p>
  <ol id="O5sl">
    <li id="gh0D"><em>Загрузка основного ресурса</em></li>
    <li id="uRk0"><em>Получение внешних ресурсов</em></li>
    <li id="V8Wu"><em>Выполнение JavaScript</em></li>
    <li id="tBW0"><em>Построение Render-дерева</em></li>
    <li id="noO9"><em>Расчёт макета (Layout)</em></li>
    <li id="Wiej"><em>Отрисовка документа (Paint)</em></li>
    <li id="m52J"><em>Объединение слоёв (Composite)</em></li>
  </ol>
  <h2 id="AKke">Загрузка основного ресурса</h2>
  <p id="1MnV">Под основным ресурсом подразумевается точка входа в веб-приложение. В большинстве случаев это обычный <code>index.html</code> файл.</p>
  <p id="xXCD">После загрузки изначального ресурса, браузер начинает парсинг <strong>HTML-файла</strong>, выделяя <strong>&quot;токены&quot;</strong>,  которые представляют собой начало тега, конец тега и его содержание. </p>
  <p id="f7SK">Из всего анализа документа, браузер строит так называемое <strong>DOM-дерево</strong>. </p>
  <figure id="hhyq" class="m_column">
    <img src="https://img3.teletype.in/files/e7/59/e7590fbf-5134-4d3b-9a45-ca8a1c5fa48b.jpeg" width="1438" />
    <figcaption>Парсинг HTML в DOM</figcaption>
  </figure>
  <h2 id="B5Ng">Получение внешних ресурсов JavaScript</h2>
  <p id="MNvP">Помимо <strong>HTML </strong>ресурсов, веб-приложение так-же может задействовать внешние ресурсы, например такие, как <strong>CSS </strong>или <strong>JS </strong>файлы, картинки, а так-же аудио-файлы.</p>
  <h3 id="5lmd">Загрузка JavaScript-файлов</h3>
  <p id="VUDh">Как только браузер доходит до инициализации <strong>JavaScript-файлов</strong>, он блокирует парсинг <strong>HTML</strong>. После чего начинается скачивание и выполнение скриптов.</p>
  <figure id="mgi8" class="m_column">
    <img src="https://img3.teletype.in/files/ef/51/ef515d94-78a5-4052-9aab-8f4e8bb40334.jpeg" width="1200" />
    <figcaption>Загрузка скриптов JS во время парсинга HTML файла</figcaption>
  </figure>
  <p id="n7BB">Однако в наше время загрузка скриптов выглядит иначе и браузер, доходя до первого скрипта, начинает искать все остальные скрипты и скачивать их одновременно. Важно подметить, что хоть скрипты загружаются одновременно, запуск всё равно идёт последовательно.</p>
  <figure id="6zEp" class="m_column">
    <img src="https://img2.teletype.in/files/18/c6/18c64147-7c7c-40ef-af6a-f4fbb720f1df.jpeg" width="1200" />
    <figcaption>Одновременная загрузка всех скриптов JS</figcaption>
  </figure>
  <p id="ToYk">Почему же загрузка скриптов JS требует остановки парсинга? Дело в <code>document.write</code>, который работает только на этапе парсинга и модифицирует исходный документ в том месте, где был вызван скрипт и заблокирован парсер.</p>
  <h3 id="HfrG">Атрибуты async и defer</h3>
  <p id="WaKT">Мы можем влиять на порядок загрузки скриптов посредством использования атрибутов <code>async</code> и <code>defer</code>. В случае с <code>async</code>, скрипт будет запрошен сразу и будет блокировать парсинг только на этапе выполнения скрипта. Соответственно остальные асинхронная загрузка скрипта не даёт гарантии, что он загрузится в правильном порядке относительно остальных скриптов.</p>
  <figure id="8rbI" class="m_column">
    <img src="https://img4.teletype.in/files/fb/81/fb81d9bd-1630-4d58-9132-8d60cd6e4b5c.jpeg" width="1200" />
    <figcaption>Загрузка скрипта JS с атрибутом async</figcaption>
  </figure>
  <p id="F6oW">При использовании <code>defer</code>, скрипт выполнится сразу после парсинга страницы, не блокируя его. При чём скрипт будет сохранять порядок выполнения для всех остальных <code>defer</code> скриптов в вызываемой последовательности.</p>
  <p id="alX4">Важные особенности:</p>
  <ul id="3DRA">
    <li id="ivlQ">Каждый предыдущий defer-скрипт будет блокировать следующий. </li>
    <li id="El9X"><code>defer</code> откладывает событие DOMContentLoaded, в отличии от <code>async</code></li>
  </ul>
  <figure id="bRQs" class="m_column">
    <img src="https://img4.teletype.in/files/fe/da/feda262b-e604-4c10-81c9-5db8606ead7c.jpeg" width="1200" />
    <figcaption>Загрузка скрипта JS с атрибутом defer</figcaption>
  </figure>
  <h2 id="xXqH">Получение внешних ресурсов CSS</h2>
  <p id="7rbL">В отличии от получения <strong>JavaScript </strong>ресурсов, стили не блокируют парсинг <strong>HTML-файла</strong>, однако блокируют отрисовку страницы. </p>
  <p id="gWKE">Рекомендуется инициализировать <strong>CSS-файлы</strong> до скриптов, чтобы браузер грузил стили в первую очередь. В противном случае, браузер начнет скачивать стили только после того, как скачает и выполнит <strong>JS-код</strong>, что соответственно отложит отрисовку.</p>
  <figure id="ylZ1" class="m_column">
    <img src="https://img4.teletype.in/files/f3/22/f322b41d-0a19-4ddc-87ca-467fdadc10dc.jpeg" width="1200" />
    <figcaption>Загрузка CSS и JS ресурсов во время парсинга HTML</figcaption>
  </figure>
  <h3 id="tmjW">Создание CSSOM</h3>
  <p id="qchN">После загрузки стилей, браузер строит из полученных ресурсов так называемый <strong>CSSOM </strong><em>(Cascade Style Sheets Object Model)</em>. Это что-то похожее на <strong>DOM</strong>, только для стилей, где для каждого стиля есть соответствующий узел.</p>
  <ul id="LeO8">
    <li id="DV3v"><strong>CSS </strong>- блокирующий обработку ресурс, соответственно <strong>Render Tree</strong> не будет построено без полного построения <strong>CSSOM</strong>.</li>
    <li id="qb4s"><strong>Парсинг CSS</strong>, в отличии от <strong>HTML</strong>, не может работать по частям в силу своих особенностей. Ведь в <strong>HTML-документе</strong> мы можем переопределять и изменять стили, написанные выше. Поэтому, чтобы перейти к следующему шагу, необходимо полностью преобразовать <strong>CSS</strong>.</li>
  </ul>
  <figure id="eUTI" class="m_column">
    <img src="https://img2.teletype.in/files/df/8e/df8e73c8-b2ab-4fec-86f9-1232d6f9a959.jpeg" width="1200" />
    <figcaption>Преобразования CSS кода в CSSOM</figcaption>
  </figure>
  <h2 id="tsY5">Выполнение JS кода</h2>
  <p id="CcGB">После переломного момента, когда <strong>HTML </strong>загружен, преобразован в <strong>DOM</strong>, а <strong>JavaScript </strong>спаршен, генерируется так называемое событие <code>DOMContentLoaded</code>.</p>
  <ul id="Pcq8">
    <li id="tdeY">Остальные ресурсы, такие как картинки, или стили, могут быть ещё не загружены.</li>
  </ul>
  <p id="WnYA">Для любого сценария, задействующего модель <strong>DOM</strong>, рекомендуется сначала дождаться этого события.</p>
  <pre id="YYMl" data-lang="typescript">document.addEventListener(&#x27;DOMContentLoaded&#x27;, () =&gt; {
  // Код, задействующий модель DOM
});</pre>
  <p id="wywW">После завершения загрузки <strong>HTML </strong>со всеми внешними ресурсами <em>(картинки, стили, асинхронный JS и т.д.)</em>, срабатывает событие браузера, под названием load.</p>
  <ul id="QwWW">
    <li id="J21h">Важно то, что событие <code>load</code> наступает у объекта <code>window</code>.</li>
  </ul>
  <pre id="V5xy" data-lang="typescript">window.addEventListener(&#x27;load&#x27;, () =&gt; {
  // Страница полностью загружена
});</pre>
  <figure id="6uwi" class="m_column">
    <img src="https://img1.teletype.in/files/cb/aa/cbaa84ca-11a3-42e5-b3ec-d410c0d8c397.jpeg" width="1200" />
    <figcaption>Особенности срабатывания событий DOMContentLoaded и window.load()</figcaption>
  </figure>
  <p id="k35A">Помимо этого, мы можем явно проследить за состоянием загрузки страницы с помощью свойства <code>document.readyState</code>. Он имеет 3 возможных значения:</p>
  <ul id="VVI4">
    <li id="69dB"><code>&quot;loading&quot;</code> - документ на стадии загрузки</li>
    <li id="MJc7"><code>&quot;interactive&quot;</code> - документ полностью прочитан</li>
    <li id="Vdg0"><code>&quot;complete&quot;</code> - документ полностью прочитан и внешние ресурсы загружены</li>
  </ul>
  <pre id="Awqj" data-lang="typescript">document.addEventListener(&#x27;readystatechange&#x27;, () =&gt; {
 console.log(&#x27;readyState: &#x27;, document.readyState);
});</pre>
  <p id="fqOG">Важное уточнение, что <code>document.readyState</code> станет <code>&quot;interactive&quot;</code> прямо перед событием <code>DOMContentLoaded</code>. Эти две вещи, на самом деле, обозначают одно и то же. Так-же соответствует <code>&quot;complete&quot;</code> для <code>window.onload</code>.</p>
  <figure id="zE5q" class="m_column">
    <img src="https://img1.teletype.in/files/48/0a/480ae123-ac2d-4882-a6e3-04f661941ed2.jpeg" width="1200" />
    <figcaption>Жизненный цикл страницы</figcaption>
  </figure>
  <h2 id="xyhv">Построение Render-дерева</h2>
  <p id="BN5K">После всех вышеизложенных действий, браузер начнет строить так называемое <strong>Render-дерево</strong>. Оно представляет собой сочетание <strong>DOM </strong>и <strong>CSSOM</strong>, однако не все узлы попадут в итоговое рендер дерево. </p>
  <p id="MnN4">В него не попадут узлы со свойством <code>display: none</code>, однако узлы со стилями <code>opacity: 0</code> или <code>visibility: hidden</code> включены будут. Так-же в него не попадут теги, не содержащие визуальной информации, такие как <code>&lt;head /&gt;</code></p>
  <figure id="SeZo" class="m_column">
    <img src="https://img2.teletype.in/files/d7/81/d7816ce3-cfa8-4f75-889f-f943894ed096.jpeg" width="1455" />
    <figcaption>Объединение DOM с CSSOM</figcaption>
  </figure>
  <h2 id="q3sP">Расчёт макета (Layout)</h2>
  <p id="MIyV">После создания <strong>Render-дерева</strong>, браузер начинает позиционировать элементы на странице. Для этого он раcсчитывает размеры и положение каждого элемента рекурсивно. Расчёт начинается от корневого элемента <strong>Render-дерева</strong>, размер которого равен размеру <code>viewport&#x27;а</code>.</p>
  <p id="14ck"><strong>Layout </strong>также может быть глобальным, когда требуется расcчитать положение render объектов всего дерева, и инкрементальный, когда требуется рассчитать только часть дерева.</p>
  <figure id="ERkc" class="m_column">
    <img src="https://img4.teletype.in/files/39/18/3918d05d-b5a7-4a99-9518-110de6b976c1.jpeg" width="1406" />
    <figcaption>Расчёт макета относительно HTML и CSS кода</figcaption>
  </figure>
  <h2 id="AOE5">Отрисовка (Paint)</h2>
  <p id="FQ0u">Во время этого этапа, браузер наполняет пиксели на экрана цветами в зависимости от контента.</p>
  <p id="YZ7V">Также, как и расчёт макета, отрисовка бывает глобальной и инкрементальной. Чтобы понять, какую часть viewport&#x27;а нужно перерисовать, браузер делить его ан прямоугольные блоки. Если изменения ограничены одним участком, то перерисуется только он.</p>
  <h2 id="6UVf">Объединение слоев (compose)</h2>
  <p id="KEAS">Два предыдущих этапа используют <strong>CPU</strong>, поэтому они относительно медленные. Перерисовывать все элементы достаточно затратно, поэтому появился композитинг.</p>
  <p id="g6GT">Композитинг - это разделение содержимого страницы на «слои», которые браузер будет перерисовывать. Эти слои друг от друга не зависят, из-за чего изменение элемента в одном слое не затрагивает элементы из других слоёв, и перерисовывать их становится не нужно. А итоговое изображение является объединением всех этих слоев в единой целое, причем данная операция выполняется уже на <strong>GPU</strong>, а она заточена на такие операции, так что выполнение происходит очень быстро.</p>
  <p id="cvpr">Для выделения слоя используются следующие триггеры:</p>
  <ul id="UCwg">
    <li id="EZ0q"><em>СSS-свойства Perspective или 3D Transform;</em></li>
    <li id="0hUo"><em>CSS Opacity animation;</em></li>
    <li id="dUqf"><em>CSS Transform animation;</em></li>
    <li id="eNti"><em>Некоторые CSS-фильтры;</em></li>
    <li id="adv6"><em>Элементы &lt;video /&gt; с ускоренным видео-декодингом</em></li>
    <li id="JJSw"><em>&lt;canvas /&gt; с 3D или ускоренным 2D контекстом </em></li>
  </ul>
  <figure id="ORO4" class="m_column">
    <img src="https://img4.teletype.in/files/f0/45/f045287f-873b-43b8-ab6e-520c74448d8b.png" width="1867" />
    <figcaption>Представление слоёв страницы https://ya.ru/</figcaption>
  </figure>
  <h2 id="Tjzb">Заключение</h2>
  <p id="D0Kb">Какие же итоги мы можем подвести? Браузер получает <strong>HTML</strong>, затем движок читает его и преобразовывает в <strong>DOM</strong>. После этого он пытается применить к <strong>DOM-дереву</strong> стили, образуя в следствии <strong>Render-дерево</strong>, с помощью которого браузер превращает древовидную структуру в пиксели и делит её на слои.</p>
  <p id="jcp4">На картинке ниже кратко описан весь процесс загрузки страницы в браузере. Она также содержит <strong>JavaScript</strong>, так как в нынешних реалиях редко встречаются статичные страницы, и пользователь постоянно взаимодействует с ней при помощи <strong>JS</strong>.</p>
  <figure id="XH6Y" class="m_column">
    <img src="https://img3.teletype.in/files/65/97/6597362d-1653-4f00-ba6f-5cc510dc7747.jpeg" width="1455" />
    <figcaption>Процесс загрузки страницы</figcaption>
  </figure>
  <p id="jWQ4">Благодаря этой статье вы получили базовые знания, которые, надеюсь, помогут вам на пути к оптимизации клиентской скорости загрузки и производительности веб-приложения в целом.</p>
  <p id="jDoC"><strong>Остались вопросы или есть, чем поделиться? Пиши в комментариях</strong></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@shotmeow/roadmap</guid><link>https://teletype.in/@shotmeow/roadmap?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow</link><comments>https://teletype.in/@shotmeow/roadmap?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow#comments</comments><dc:creator>shotmeow</dc:creator><title>Что должен уметь Frontend разработчик в 2023 году (+Roadmap)</title><pubDate>Tue, 07 Feb 2023 09:26:31 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b6/5b/b65b769c-8399-41c8-8199-f1bf39cf44db.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/87/60/8760bc70-a68c-4567-b370-e79a120826ce.jpeg"></img>С каждым годом войти в IT становится всё труднее. За счёт высоких зарплат, комфортного образа жизни, амбиций, потребности в специалистах, сейчас чуть ли не каждый второй хочет стать программистом. За счёт этих факторов, рынок труда в IT перенасыщается, из-за чего потребности в навыках специалистов тоже выросли. Теперь от разработчиков даже требуют уметь программировать, я знаю, это ужасно...]]></description><content:encoded><![CDATA[
  <figure id="C1W7" class="m_column">
    <img src="https://img1.teletype.in/files/87/60/8760bc70-a68c-4567-b370-e79a120826ce.jpeg" width="1200" />
  </figure>
  <h2 id="1Fac">Ситуация на рынке IT</h2>
  <p id="ELMr">С каждым годом войти в IT становится всё труднее. За счёт высоких зарплат, комфортного образа жизни, амбиций, потребности в специалистах, сейчас чуть ли не каждый второй хочет стать программистом. За счёт этих факторов, рынок труда в IT перенасыщается, из-за чего потребности в навыках специалистов тоже выросли. Теперь от разработчиков даже требуют уметь программировать, я знаю, это ужасно...</p>
  <p id="jFj1">Это не говорит о том, что сейчас в IT идти смысла нету, этот факт лишь говорит о том, что повысилась конкуренция. Я лично считаю, что такая ситуация наоборот благосклонно влияет на весь мир в целом, так как конкуренция порождает прогресс. А для вас это дополнительный стимул стать еще более востребованным специалистом и сильной личностью.</p>
  <h2 id="5R2H">Как развиваться (Roadmap)</h2>
  <p id="PLa2">Чтобы стать фронтенд-разработчиком, нужно всегда быть в курсе новейших технологий и постоянно развиваться, как и в любом направлении информационных технологий. </p>
  <p id="bUJo">В связи с быстрыми темпами развития IT-технологий, каждый год появляется что-то новое, а что-то наоборот укрепляет свои позиции. В этой статье я подготовил для вас дорожную карту для развития себя, как разработчика интерфейсов. Сведения я собрал со многих источников, курсов и моих личных убеждений и опыта, как трудоустроенного Frontend разработчика.</p>
  <figure id="MaxN" class="m_original">
    <img src="https://img1.teletype.in/files/cc/68/cc687cbd-18a1-47d0-99c6-1f10dc52ee29.jpeg" width="2969" />
  </figure>
  <h3 id="HW9f">Beginner (Новичок)</h3>
  <p id="7Gi3">Сейчас мы говорим о человеке, который только начинает вливаться в IT индустрию, а конкретнее в разработку интерфейсов.</p>
  <p id="tlB4">Здесь важно выделить, что эти знания - максимальная база. Вы навряд-ли сможете трудоустроиться с этими знаниями, но это даст толчок в развитии.</p>
  <p id="AhfT">По моему опыту, новичок, как минимум, должен быть знаком со следующим перечнем технологий:</p>
  <ol id="hZeW">
    <li id="D4lh">Что такое <strong>TCP/IP</strong>, из каких уровней состоят и какие протоколы содержит. (В частности <strong>Ethernet</strong>, <strong>IP</strong>, <strong>UDP</strong>, <strong>TCP</strong>, <strong>HTTP1/2/3</strong>)</li>
    <li id="MfM4">Что такое <strong>HTML</strong>. Базовые элементы разметки. Семантика SEO-оптимизация и доступность.</li>
    <li id="cDcm">Что такое <strong>CSS</strong>. Базовые свойства стилизации. Позиционирование элементов макета. <strong>Flexbox</strong>. <strong>Grid</strong>. Адаптивность посредством составления <strong>@media</strong> запросов. Анимации и трансформации. Псевдоэлементы и псевдоклассы. <strong><a href="https://ru.bem.info/" target="_blank">Методология БЭМ</a></strong>.</li>
    <li id="AFXb">Основы языка программирования <strong>JavaScript</strong>. Типы данных. Циклы, Условия, Работа с объектами. Функции. Прототипы и наследование. Работа с объектами. Методы массивов.</li>
    <li id="frZ0">Выбрать редактор кода. Я лично из своего опыта рекомендую <strong><a href="https://code.visualstudio.com/" target="_blank">Visual Studio Code</a></strong> или <strong><a href="https://www.jetbrains.com/ru-ru/webstorm/" target="_blank">WebStorm</a> </strong>(платный).</li>
  </ol>
  <h3 id="0ciP">Trainee (Стажёр)</h3>
  <p id="932x">Если вы знакомы с понятиями описанными выше, вы можете переходить к следующему этапу - <strong>Trainee</strong>. </p>
  <p id="9YJV">Изучив технологии, описанные в данном разделе, вы уже имеете какой-никакой вес в IT мире и даже сможете устроиться на стажировку в IT-компанию.</p>
  <p id="3QSI">Стажёр должен быть знаком со следующим перечнем технологий:</p>
  <ol id="q3Q5">
    <li id="Vb3w">Уметь работать с браузерным окружением и <strong>DOM </strong>(Document Object Model). <strong>Браузерные события</strong>. <strong>Обработка ошибок</strong> (Try/Catch). <strong>Пользовательские ошибки</strong>. <strong>ООП</strong>. <strong>Модульная система</strong>. <strong>Экспорт и импорт</strong>. <strong>Динамические импорты</strong>. <strong>Web API</strong>.</li>
    <li id="jcvp">Что делает <strong>JavaScript </strong>- асинхронным. Что такое <strong>Event Loop</strong>. <strong>Микро и макро задачи</strong>. Промисы. <strong>Fetch API</strong>. Синтаксический сахар - <strong>Async </strong>и <strong>Await</strong>.</li>
    <li id="2Q9m">Что такое <strong>DNS-зоны</strong> и домены. <strong>Cross-Origin Resource Sharing</strong> (CORS). <strong>Preflight Requests</strong>. <strong>No-CORS mode</strong>. <strong>Request &amp; Response Headers</strong>.</li>
    <li id="hkUW">Что такое линтеры. Настройка <strong><a href="https://eslint.org/" target="_blank">ESLint</a> </strong>и подключение плагинов. Настройка <strong><a href="https://prettier.io/" target="_blank">Prettier</a> </strong>и <strong><a href="https://stylelint.io/" target="_blank">Stylelint</a></strong>. <strong>Pre-commit Check</strong>.</li>
    <li id="bTrL">Как работает система управления версиями (<strong><a href="https://git-scm.com/" target="_blank">Git</a></strong>). Регистрация на <strong><a href="https://github.com/" target="_blank">GitHub</a></strong>. <strong>Коммиты</strong>. <strong>Репозитории</strong>. <strong>Форки</strong>. <strong>Merge Requests</strong>. <strong>Checkout</strong>. <strong>Ветки</strong>. </li>
    <li id="83nK">Что такое <strong><a href="https://nodejs.org/en/" target="_blank">Node.js</a></strong>. Как работает менеджер пакетов <strong><a href="https://www.npmjs.com/" target="_blank">Npm</a></strong>. <strong>package.json</strong> и <strong>package-lock.json</strong>. <strong>npm install</strong>, <strong>npm uninstall</strong>. <strong>Dependencies </strong>&amp; <strong>Development Dependenices</strong>. Создание своего пакета.</li>
    <li id="crqV">Что такое препроцессор. <a href="https://sass-lang.com/" target="_blank"><strong>SASS</strong> и <strong>SCSS</strong></a>. <strong>Переменные</strong>. <strong>Импорты</strong>. <strong>Вложенность</strong>. <strong>Модули</strong>. <strong>Миксины</strong>.</li>
  </ol>
  <h3 id="IpEC">Junior (Младший разработчик)</h3>
  <p id="EPwF">Изучив следующий перечень технологий, по моему опыту, вы уже можете стать младшим разработчиком в IT-компании:</p>
  <ol id="GH4U">
    <li id="3jde">Что такое сборщик модулей. <strong><a href="https://babeljs.io/" target="_blank">Babel</a></strong>. Настройка <strong><a href="https://webpack.js.org/" target="_blank">Webpack</a></strong>. <strong>Правила</strong>. <strong>Модули</strong>. <strong>Плагины</strong>. <strong>DevServer</strong>. Переход к <strong><a href="https://vitejs.dev/" target="_blank">Vite</a></strong>.</li>
    <li id="tFJw">Что такое <strong><a href="https://reactjs.org/" target="_blank">React</a> </strong>и какие проблемы он решает. <strong>Жизненный цикл компонентов</strong>. Особенности виртуального <strong>DOM-дерева</strong>. <strong>React </strong>компоненты. Базовые хуки и разработка собственных. <strong><a href="https://reactjs.org/docs/portals.html" target="_blank">React Portals</a></strong>. <strong><a href="https://reactjs.org/docs/refs-and-the-dom.html" target="_blank">React Refs</a></strong>. <strong>JSX </strong>синтаксис. <strong>Props &amp; State</strong>.</li>
    <li id="sOma">Особенности <strong>FLUX </strong>архитектуры. <strong>Reducers</strong>. <strong>Actions</strong>. Хук <strong>useContext</strong>. <strong>Redux </strong>и <strong>Redux Toolkit</strong>. <strong>Redux Thunk</strong>. <strong>RTK Query</strong>. (По желанию можно изучить MobX и/или Zustand)</li>
    <li id="bTOC">Что такое <strong>роут</strong>. Из чего состоит объект <strong>Location</strong>. Как манипулировать историей сессии через <strong>History</strong>. Библиотека <strong><a href="https://reactrouter.com/en/main" target="_blank">React Router</a></strong>.</li>
    <li id="A1u3">Как повысить эффективность стилизации. Что такое <strong><a href="https://postcss.org/" target="_blank">PostCSS</a></strong>. Плагин <strong><a href="https://github.com/css-modules/css-modules" target="_blank">CSS Modules</a></strong>. Библиотека <strong><a href="https://tailwindcss.com/" target="_blank">TailwindCSS</a></strong>. Что такое <strong>UI библиотека</strong>. <strong><a href="https://mui.com/" target="_blank">MUI</a></strong>. <strong><a href="https://ant.design/" target="_blank">Ant Design</a></strong>.</li>
    <li id="ce8C">Что такое <strong>VPS/VDS</strong>. Базовые команды терминала <strong>Linux </strong>систем. Права доступа. <strong>Ununtu</strong>. <strong>Nginx</strong>. Базовая настрока веб-сервера. <strong>SSH</strong>. Ассиметричное шифрование. </li>
    <li id="x1L1">Что такое <strong>CI/CD</strong>. <strong>Интеграция</strong>. <strong>Доставка</strong>. <strong>Развертывание</strong>. <strong>Структура и настройка</strong>. <strong>Пайплайны</strong>. <strong>Артефакты</strong>. <strong>Этапы</strong>. <strong>Переменные</strong>.</li>
  </ol>
  <h3 id="bd69">Middle (Средний специалист)</h3>
  <p id="Jg0z">Если вы изучили все предыдущие темы, по моему мнению, вы уже можете называть себя <strong>Junior Front-end Developer</strong>. Но на этом останавливаться рано. </p>
  <p id="3BzL">Чтобы вырасти до <strong>Middle Front-end разработчика</strong>, вам необходимо изучить следующий перечень технологий:</p>
  <ol id="cW1t">
    <li id="907G">Что такое <strong><a href="https://www.typescriptlang.org/" target="_blank">TypeScript</a> </strong>и какие проблемы он решает. <strong>Интерфейсы</strong>. <strong>Типы</strong>. <strong>Дженерики</strong>. <strong>Enum</strong>. Интеграция с технологиями. Типизация <strong>React-приложения</strong>. </li>
    <li id="3bnv">Что такое <strong>авторизация</strong>? <strong>Идентификация</strong>. <strong>Аутентификация</strong>. Методы аутентификации. <strong>Bearer Token</strong>. <strong>JWT</strong>. Защита роутов. <strong>Протокол OAuth</strong>. Интеграция с сервисами.</li>
    <li id="m0oA">Что такое <strong>оффлайн</strong>. Как работают <strong>Web &amp; Service Workers</strong>. Регистрация сервисов. Жизненный цикл <strong>Service Worker&#x27;ов</strong>. <strong>Cache API</strong>. Методы <strong>Cache API</strong>. Как кэшировать выборку запросов. </li>
    <li id="1zFm">Что такое <strong>PWA </strong>(Progressive Web Application). <strong>Надежность</strong>. <strong>Быстрота</strong>. <strong>Привлекательность</strong>. <strong>Favicon</strong>. Настройка <strong>Manifest&#x27;а</strong>. </li>
    <li id="dsjI">Как настроить доступность приложения. Что такое <strong>Screen Readers</strong> и <strong>Voice Over</strong>. Доступность с клавиатуры. Библиотека <strong><a href="https://github.com/focus-trap/focus-trap" target="_blank">Focus Trap</a></strong>. Семантика. Анализ доступности через <strong>Lighthouse</strong>.</li>
    <li id="VmD2">Как локализировать приложение. Объект <strong>navigator</strong>. <strong><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl" target="_blank">Intl</a></strong>. Плюрализация и Интернационализация. Библиотека <strong><a href="https://www.i18next.com/" target="_blank">l18next</a></strong>. <strong><a href="https://localazy.com/" target="_blank">Localazy</a></strong>.</li>
    <li id="DxxJ">Что такое <strong><a href="https://nextjs.org/" target="_blank">Next.js</a></strong> и какие проблемы он решает. Что такое <strong>SSG</strong>, <strong>SSR</strong>, <strong>ISR </strong>и в чем между ними разница. <a href="https://nextjs.org/docs/routing/introduction" target="_blank">Роутинг <strong>Next.js</strong> приложения</a>. <a href="https://nextjs.org/learn/seo/improve" target="_blank">Оптимизация</a>. <strong><a href="https://nextjs.org/learn/seo/introduction-to-seo" target="_blank">SEO</a></strong>. </li>
    <li id="rGls">Почему тормозят сайты. Основные метрики <strong>Web Vitals</strong>. Анализ производительности. Методы оптимизации. <strong>Tree</strong> <strong>Shaking</strong>. <strong>React.lazy </strong>и <strong>React.Suspense</strong>. Как браузер рисует страницы. <strong>Layout</strong>. <strong>Paint</strong>. <strong>Compose</strong>. <strong>Rendering Pipeline</strong>. Парсинг <strong>HTML </strong>и <strong>CSS</strong>. Объединение <strong>DOM </strong>и <strong>CSSOM</strong>. Render-дерево. Мемоизация. <strong><a href="https://reactjs.org/docs/hooks-reference.html#usememo" target="_blank">useMemo</a> </strong>и <strong><a href="https://reactjs.org/docs/hooks-reference.html#usecallback" target="_blank">useCallback</a></strong>. Оптимизация изображений. <strong>Houdini Paint API</strong>. </li>
    <li id="PRFa">Из чего состоит тестирование приложений. Мониторинг ошибок. <strong><a href="https://sentry.io/" target="_blank">Sentry </a></strong>Service. Что такое <strong>E2E</strong>, <strong>Unit </strong>и <strong>интеграционное тестирование</strong>. Пирамида тестирования. Библиотека <strong><a href="https://jestjs.io/" target="_blank">Jest</a></strong>. Таймеры <strong>Jest</strong>. <strong>Мок-функции</strong>. <strong>TDD</strong>. Тестирование React-приложения через <strong><a href="https://testing-library.com/docs/react-testing-library/intro/" target="_blank">React Testing Library</a></strong>. Методы поиска элементов на странице. Тестирование событий. E2E тестирование с помощью <strong><a href="https://www.cypress.io/" target="_blank">Cypress</a></strong>.</li>
  </ol>
  <h3 id="fHVJ">Senior (Старший разработчик)</h3>
  <p id="hXev">Ну и перейдём к последнему этапу. Изучив все вышеперечисленные технологии, вы уже закрепились, как уверенный разработчик интерфейсов, однако расти можно бесконечно долго. Ниже я перечислил актуальные на данный момент технологии для вашего развития:</p>
  <pre id="r56s">GraphQL, Apollo, PostgreSQL, Fastify, Vue, Angular, Svelte, Remix, Astro, React Native, Relay Modern, Redux Saga, Web 3.0</pre>
  <p id="hGz3">Это лишь часть того, что вы можете изучить и это лишь то, что относится к Front-end разработке. После изучения всех вышеописанных технологий, вы можете идти в Full-stack разработку или же в другую специализацию в целом. Главное, чтобы вам нравилось то, чем вы занимаетесь.</p>
  <h2 id="axrk">Заключение</h2>
  <p id="8Bo4">Как вы поняли по этой статье, путь в IT совсем не легкий и требует много времени. Этот путь отнюдь не простой и быстрый. Скорость развития зависит напрямую от вас и вашего стремления. В моём окружении есть мидлы, которым по 18-19 лет. Вы должны посвятить этому свою жизнь. Сделать работу частью себя. Вы должны получать кайф от своей работы. В любом случае, попробовать стоит, возможно в этом вы найдёте себя.</p>
  <p id="4gxE"><strong>Пишите ваше мнение и вопросы в комментариях.</strong></p>
  <p id="zWoJ"></p>
  <p id="GQGH">Полезные материалы:</p>
  <ol id="c8gd">
    <li id="9Jqm"><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/CORS" target="_blank">Cross-Origin Resource Sharing (CORS)</a></li>
    <li id="pZDe"><a href="https://medium.com/@twanttobealighi/всё-что-нужно-знать-про-http-75567dad34c" target="_blank">Всё что нужно знать про HTTP</a></li>
    <li id="RDL2"><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/Methods" target="_blank">Методы HTTP запроса</a></li>
    <li id="QrsE"><a href="https://developer.mozilla.org/ru/docs/conflicting/Learn/JavaScript/Asynchronous/Introducing" target="_blank">Основные понятия асинхронного программирования</a></li>
    <li id="bhOQ"><a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise" target="_blank">Promise</a></li>
    <li id="w9WX"><a href="https://habr.com/ru/post/439746/" target="_blank">Разбираемся с промисами в JavaScript</a></li>
    <li id="gZMl"><a href="https://www.sitepen.com/blog/typescript-cheat-sheet" target="_blank">Шпаргалка по TypeScript</a></li>
    <li id="BPyq"><a href="https://habr.com/ru/company/dododev/blog/520046/" target="_blank">Тонкости авторизации: обзор технологии OAuth 2.0</a></li>
    <li id="gUf5"><a href="https://facebook.github.io/flux/docs/overview/" target="_blank">Документация FLUX</a></li>
    <li id="FquU"><a href="https://code.tutsplus.com/ru/tutorials/getting-started-with-the-flux-architecture-in-react--cms-28906" target="_blank">Изучаем архитектуру FLUX в React</a></li>
    <li id="prcA"><a href="https://reactdev.ru/libs/redux-toolkit/" target="_blank">Документация Redux Toolkit на русском</a></li>
    <li id="PPbw"><a href="https://doka.guide/css/media/" target="_blank">Про @media</a></li>
    <li id="PPEH"><a href="https://itchief.ru/html-and-css/viewport-meta-tag" target="_blank">Как работает viewport</a></li>
    <li id="nGG4"><a href="https://ishadeed.com/article/defensive-css/" target="_blank">Defensive CSS</a></li>
    <li id="SllO"><a href="https://developer.mozilla.org/ru/docs/Web/HTML/Element/picture" target="_blank">Элемент &lt;picture&gt;</a></li>
    <li id="DJ8h"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API" target="_blank">Web Workers API</a></li>
    <li id="Ah1S"><a href="https://developer.mozilla.org/ru/docs/Web/API/Service_Worker_API" target="_blank">Service Worker API</a></li>
    <li id="8reX"><a href="https://developers.google.com/codelabs/pwa-training/pwa03--going-offline?hl=ru" target="_blank">Переход в автономный режим (оффлайн)</a></li>
    <li id="m7Bp"><a href="https://developer.mozilla.org/ru/docs/Web/API/Cache" target="_blank">Cache API</a></li>
    <li id="IVOs"><a href="https://vc.ru/design/137715-kak-sdelat-nochnoy-rezhim-v-react-prilozheniyah" target="_blank">Ночной режим в React-приложениях</a></li>
    <li id="EPbA"><a href="https://web.dev/maskable-icon/" target="_blank">Улучшение иконок в PWA</a></li>
    <li id="fG2I"><a href="https://scandiweb.com/blog/learn-all-about-progressive-web-apps/" target="_blank">Complete Guide to PWA</a></li>
    <li id="FEBt"><a href="https://dynomapper.com/blog/27-accessibility-testing/246-top-25-awesome-accessibility-testing-tools-for-websites" target="_blank">Инструменты тестирования доступности</a></li>
    <li id="zaEe"><a href="https://dev.to/steveblue/the-state-of-web-components-in-2022-1ip3" target="_blank">Состояния компонентов в React</a></li>
    <li id="N4nx"><a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Intl" target="_blank">Intl</a></li>
    <li id="WLdD"><a href="https://localazy.com/blog/automated-localization-gitlab-cicd-localazy" target="_blank">GitLab CI/CD with Localazy</a></li>
    <li id="EsAd"><a href="https://medium.com/@danduan/translating-react-apps-using-i18next-d2f78bc87314" target="_blank">Перевод React-приложения с i18next</a></li>
    <li id="fRXJ"><a href="https://web.dev/learn-core-web-vitals/" target="_blank">Core Web Vitals</a></li>
    <li id="qqH6"><a href="https://habr.com/ru/company/timeweb/blog/714280/" target="_blank">Рекомендации по метрикам Web Vitals</a></li>
    <li id="51Nz"><a href="https://medium.com/masmovil-engineering/layers-layers-layers-be-careful-6838d59c07fa" target="_blank">Про слои</a></li>
    <li id="Lqpj"><a href="https://blog.openreplay.com/3-ways-to-implement-skeleton-components-in-react/" target="_blank">3 способа реализации компонентов-скелетонов в React</a></li>
    <li id="W8yJ"><a href="https://webformyself.com/pomoshh-brauzeram-v-optimizacii-s-pomoshhyu-svojstva-css-contain/" target="_blank">Оптимизация и CSS Contain</a></li>
    <li id="IVJi"><a href="https://developer.mozilla.org/ru/docs/Web/CSS/perspective" target="_blank">CSS Perspective</a></li>
    <li id="qwf4"><a href="https://ru.reactjs.org/docs/strict-mode.html" target="_blank">React Strict Mode</a></li>
    <li id="5FVf"><a href="https://overreacted.io/before-you-memo/" target="_blank">Статья про memo()</a></li>
    <li id="ZVfV"><a href="https://habr.com/ru/company/ruvds/blog/417075/" target="_blank">API CSS Paint</a></li>
    <li id="fchu"><a href="https://habr.com/ru/post/594303/" target="_blank">Создание кастомизируемого Dropdown для React и TypeScript</a></li>
    <li id="kBIW"><a href="https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/error" target="_blank">Типы ошибок</a></li>
    <li id="CTWc"><a href="https://reactjs.org/docs/error-boundaries.html" target="_blank">React Error Boundaries</a></li>
    <li id="Tncz"><a href="https://ru.reactjs.org/docs/testing.html" target="_blank">Тестирование React-приложения</a></li>
    <li id="KnlT"><a href="https://habr.com/ru/post/511676/" target="_blank">Отслеживание ошибок в приложении React с помощью Sentry</a></li>
    <li id="H2IU"><a href="https://jestjs.io/docs/getting-started" target="_blank">Документация Jest</a></li>
    <li id="pjof"><a href="https://ru.reactjs.org/docs/testing-recipes.html" target="_blank">Рецепты тестирования React</a></li>
    <li id="Iy04"><a href="https://www.robinwieruch.de/react-testing-library/" target="_blank">Статья про React Testing Library (RTL)</a></li>
    <li id="3xAv"><a href="https://habr.com/ru/company/jugru/blog/714656/" target="_blank">Перформанс веб-приложений</a></li>
    <li id="t6uP"><a href="https://habr.com/ru/post/653533/" target="_blank">Статья про Web 3.0</a></li>
  </ol>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@shotmeow/typescript</guid><link>https://teletype.in/@shotmeow/typescript?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow</link><comments>https://teletype.in/@shotmeow/typescript?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=shotmeow#comments</comments><dc:creator>shotmeow</dc:creator><title>TypeScript для начинающих: преимущества языка и первый код</title><pubDate>Thu, 02 Feb 2023 20:06:45 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/83/69/83697cb8-482a-4b7f-83b2-5c72afecd363.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/db/c3/dbc3b5e2-de6a-4194-afa5-e41f542e4d3b.jpeg"></img>TypeScript — то же самое, что и JavaScript, но переменные не могут менять типы.]]></description><content:encoded><![CDATA[
  <figure id="5mwD" class="m_column">
    <img src="https://img2.teletype.in/files/db/c3/dbc3b5e2-de6a-4194-afa5-e41f542e4d3b.jpeg" width="1200" />
  </figure>
  <p id="Z3bO"><strong>TypeScript</strong> — то же самое, что и <strong>JavaScript</strong>, но переменные не могут менять типы.</p>
  <ul id="ABE8">
    <li id="mYB2">Цель создания <strong>TypeScript </strong>— сделать <strong>JavaScript </strong>лучше. <strong>TypeScript </strong>добавляет в <strong>JavaScript </strong>типы, позволяя явно задавать их для всех структур данных. Это увеличивает читаемость кода и уменьшает количество ошибок в финальной сборке приложения.</li>
    <li id="V49b">Еще у <strong>TypeScript </strong>есть компилятор (транспайлер), который проверяет код на ошибки и помогает их исправить до выхода в продакшен.</li>
    <li id="SvQC"><strong>TypeScript </strong>использует последние возможности <strong>JavaScript</strong>, которые поддерживают не все браузеры. Но при этом в <strong>TypeScript </strong>можно безопасно использовать весь потенциал <strong>JavaScript</strong>, не переживая за совместимость: в результате код будет скомпилирован в максимально совместимый со всеми браузерами <strong>JavaScript</strong>.</li>
    <li id="CC7M"><strong>TypeScript </strong>легко начать применять в существующем проекте на <strong>JavaScript</strong>, постепенно обновляя старый код. Это позволяет легко перенести код на <strong>TypeScript</strong>, не уходя в затяжной рефакторинг. Такая опция критически важна в продуктовых командах, которые постоянно балансируют между выпуском новых фич и рефакторингом старого кода.</li>
  </ul>
  <p id="7Jkx">С момента разработки <strong>TypeScript </strong>активно развивался, сегодня это один из самых популярных языков программирования. По данным опроса сообщества <a href="https://stackoverflow.com/" target="_blank">StackOverflow </a>в 2022 году, <strong>TypeScript </strong>занимает 3 место в рейтинге самых любимых языков программирований.</p>
  <figure id="RPnx" class="m_column" data-caption-align="center">
    <img src="https://lh3.googleusercontent.com/HMx_QIM2YEZZxvalcBPvsygtFCRkDPC9SjOcB34rGSTciZ15f4Mw1a_Atfu2eF-OH7YA5I2aY0BsIEBXmA09EC2T0bEvi0Gvqv7LXlH_HwuMO67peDLw0tImlOKwrCP0bG6kR5stR_wubWK9b1tG5xI" width="1600" />
    <figcaption>Stack Overflow Developer Survey 2022 - Рейтинг самых любимых языков программирования</figcaption>
  </figure>
  <p id="TmsX">В этой небольшой статье я хотел бы изложить основные особенности и преимущества <strong>TypeScript</strong>. </p>
  <h2 id="e6Wx"></h2>
  <h2 id="NeLr">Как установить и настроить TypeScript</h2>
  <p id="o3Ob">Часто, фреймворки уже имеют поддержку шаблона на базе <strong>TypeScript</strong>, однако бывают случаи, когда мы начинаем разработку с чистого листа, в таком случае вам понадобится <a href="https://nodejs.org/en/" target="_blank">Node.js</a>. После чего вам необходимо установить соответствующий npm пакет с помощью команды:</p>
  <pre id="duZt" data-lang="bash">npm install -g typescript</pre>
  <p id="P8SI">Дальше для компиляции кода на языке <strong>TypeScript </strong>в <strong>JavaScript </strong>необходимо использовать префикс <em>tsc</em>, например:</p>
  <pre id="WU8h" data-lang="bash">tsc my-first-typescript-app.ts</pre>
  <p id="ChkW">После чего код из файла <em>my-first-typescript-app.ts</em> компилируется в файл формата <strong>JavaScript</strong>. Важно, что любой код <strong>TypeScript </strong>в любом случае компилируется в <strong>JavaScript</strong>.</p>
  <p id="uieL"></p>
  <h2 id="B6P0">Как работает TypeScript</h2>
  <h3 id="5Xsx">Типы переменных</h3>
  <p id="uBbO">При объявлении переменной можно явно указать её тип. В ином случае <strong>TypeScript </strong>сам узнает тип из значения.</p>
  <pre id="im1r" data-lang="typescript">const value: string = &quot;Данила вещает...&quot;;
const value = &quot;Данила вещает...&quot;;</pre>
  <h3 id="4XSJ"></h3>
  <h3 id="D6ZN">Массивы</h3>
  <p id="Jv9U">Так же, как и для переменных, <strong>TypeScript </strong>позволяет объявить типы для массивов.</p>
  <pre id="Ieha" data-lang="typescript">const array: string[] = [&#x27;A&#x27;, &#x27;B&#x27;, &#x27;C&#x27;]</pre>
  <h3 id="PSkg"></h3>
  <h3 id="coGa">Объекты</h3>
  <p id="gWZM"><strong>TypeScript </strong>может вывести тип объекта из значений его полей.</p>
  <pre id="8y9v" data-lang="typescript">const user: {
  id: number;
  name: string;
  role: &#x27;student&#x27; | &#x27;teacher&#x27;;
  password: string;
} = {
  id: 1,
  name: &#x27;Данила&#x27;,
  role: &#x27;teacher&#x27;,
  password: &#x27;Frontend&#x27;
}</pre>
  <h3 id="T2qA"></h3>
  <h3 id="9keZ">Типы и интерфейсы</h3>
  <p id="Cx4v">В TypeScript мы можем выносить типизацию отдельно с помощью <strong>type </strong>и <strong>interface</strong></p>
  <pre id="sXT3" data-lang="typescript">type RoleType = &#x27;student&#x27; | &#x27;teacher&#x27;;

interface UserType {
  id: number;
  name: string;
  role: RoleType;
  password: string;
}

const user: UserType = {
  id: 1,
  name: &#x27;Данила&#x27;,
  role: &#x27;teacher&#x27;,
  password: &#x27;Frontend&#x27;
}</pre>
  <h3 id="iFbN"></h3>
  <h3 id="rzkM">Функции</h3>
  <p id="CgiM"><strong>TypeScript </strong>умеет типизировать передаваемые в функцию значения, а так же ответ функции.</p>
  <pre id="Wxza" data-lang="typescript">const multiplication = (a: number, b: number): number =&gt; {
  return a * b;
}</pre>
  <h3 id="WtTU"></h3>
  <h3 id="zul1">Дженерики</h3>
  <p id="QQkv"><strong>Generics</strong>, или же обобщенные типы, полезны в случаях, когда может работать с разными типами. Таким образом тип можно будет задать позднее, во время вызова функции.</p>
  <pre id="LxBO" data-lang="typescript">const convert = &lt;T&gt;(value: T): Array&lt;T&gt; =&gt; {
  return [value];
}

convert&lt;string&gt;(&#x27;Данила вещает...&#x27;); // [ &#x27;Данила вещает...&#x27; ]
// За место T в функции convert подставился тип &#x27;string&#x27;</pre>
  <h3 id="9SIU"></h3>
  <h3 id="GSO3">Enum</h3>
  <p id="x9sT"><strong>Enum </strong>в <strong>TypeScript</strong>, это что-то на подобии объекта с константами. В нем мы можем хранить элементы по образу ключ - значение. Если значение мы не зададим, к ключу будет привязан его индекс</p>
  <pre id="UJW0" data-lang="typescript">enum Roles {
  Student, // 0
  Teacher, // 1
}

// или

enum Roles {
  Student = &#x27;student&#x27;, // &#x27;student&#x27;
  Teacher = &#x27;teacher&#x27; // &#x27;teacher&#x27;
}

interface UserType {
  id: number;
  name: string;
  role: Roles;
  password: string;
}

const user: UserType {
  id: 1,
  name: &#x27;Данила&#x27;,
  role: Roles.Student, // &#x27;student&#x27;
  password: &#x27;Frontend&#x27;
}</pre>
  <p id="xlVs"></p>
  <h3 id="XXUW">Завершение</h3>
  <p id="5tz9">На самом деле это почти исчерпывающая информация по TypeScript. Не так и сложно, правда? Суть в том, что это база, которую даёт нам сам язык, однако типы расширяют прочие, поддерживаемые технологии. </p>
  <p id="bpHb">TypeScript - активно развивающийся и популярный язык программирования, который стоил и стоит внимания в 2023 году. </p>
  <p id="M6wI">В будущих статьях я покажу вам Best Practices, как правильно типизировать различные элементы на React, Redux Toolkit, NestJS и прочих поддерживаемых технологиях. </p>
  <p id="3G81">Спасибо за просмотр🥴</p>

]]></content:encoded></item></channel></rss>