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

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

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

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

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

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

// или

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

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

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

</content></entry></feed>