<?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>Frontend School</title><generator>teletype.in</generator><description><![CDATA[Frontend плюшки]]></description><image><url>https://img1.teletype.in/files/80/32/803245c1-d26e-4fd6-84d8-9f61159fbf18.png</url><title>Frontend School</title><link>https://teletype.in/@frontend_school</link></image><link>https://teletype.in/@frontend_school?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/frontend_school?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/frontend_school?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 25 May 2026 04:55:07 GMT</pubDate><lastBuildDate>Mon, 25 May 2026 04:55:07 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@frontend_school/EoXZxmk7UCK</guid><link>https://teletype.in/@frontend_school/EoXZxmk7UCK?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/EoXZxmk7UCK?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>useEffect vs useLayoutEffect</title><pubDate>Mon, 22 May 2023 21:49:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2e/77/2e77b653-ee45-4ad7-b29f-ecc79d06e8b8.png"></media:content><category>React</category><description><![CDATA[Каждый React-разработчик использует при решении повседневных задач хук useEffect. Однако, как показывает моя практика проведения собеседований, про useLayoutEffect слышали уже не так много людей, а до конца понимают, как именно он работает - ещё меньше. Сегодня, мы разберёмся в различиях между этими двумя хуками, поймём в какой момент жизненного цикла вызывается каждый из них и узнаем, когда лучше использовать useEffect, а когда - useLayoutEffect. Статья подойдёт как опытным, так и начинающим Frontend-разработчикам.]]></description><content:encoded><![CDATA[
  <p id="5xRI">Каждый React-разработчик использует при решении повседневных задач хук useEffect. Однако, как показывает моя практика проведения собеседований, про useLayoutEffect слышали уже не так много людей, а до конца понимают, как именно он работает - ещё меньше. Сегодня, мы разберёмся в различиях между этими двумя хуками, поймём в какой момент жизненного цикла вызывается каждый из них и узнаем, когда лучше использовать useEffect, а когда - useLayoutEffect. Статья подойдёт как опытным, так и начинающим Frontend-разработчикам.</p>
  <p id="mvkO"></p>
  <h2 id="s9Zh">Немного теории</h2>
  <h3 id="aoz6">useEffect</h3>
  <p id="R1NC">Итак, поговорим немного о наших хуках. <br />Как ты наверняка знаешь, хуки эффекта пришли в React после появления функциональных компонентов. Необходимость в них была вызвана тем, что функциональные компоненты не имеют собственного состояния и, что важно, методов жизненного цикла, в отличие от классовых компонентов. То есть, без хуков, функциональные компоненты способны только на рендер JSX. </p>
  <p id="QALK">useEffect - хук эффекта, который аналогичен комбинации <em>componentDidMount, componentDidUpdate </em>и<em> componentWillUnmount. </em>Он принимает в себя два параметра<em> - callback и массив зависимостей. </em>Массив зависимостей представляет из себя набор переменных, на изменение которых подписывается наш хук, и, соответственно, при их изменении вызвается переданный нами callback. Посмотрим за работой хука на примере:<br /></p>
  <pre id="wGum">import React, { useState, useEffect } from &quot;react&quot;;

export const Effect: React.FC = () =&gt; {  
  const [counter, setCounter] = useState(0);
  
  useEffect(() =&gt; {
    console.log(counter);  
  }, [counter]);
  
  const incrementCounter = () =&gt; setCounter(counter + 1);
  
  return (    
    &lt;div&gt;      
      &lt;button onClick={incrementCounter}&gt;INC&lt;/button&gt;    
    &lt;/div&gt;  
  );
};</pre>
  <p id="pze6"><br />В данном примере у нас есть счётчик (переменная <em>counter</em>), функция увеличения счётчика и эффект, который реагирует на это изменение. Что же у нас будет в консоли ?<br />Для начала - наш эффект сработает как <em>componentDidMount </em>и после первого рендера выведет в консоль начальное значение перменной <em>counter</em>, а именно - ноль. Каждое нажатие кнопки будет изменять нашу переменную стейта и эффект будет работать по принципу componentDidUpdate. Важно запомнить, что <em>useEffect </em>работает в <strong>асинхронном </strong>режиме и вызывается <strong>после </strong>того, как в DOM были внесены изменения.<br />С первыми двумя методами мы определились. Но как же вызвать componentWillUnmount ?<br />Для этого, callback который мы передаём в <em>useEffect </em>должен иметь <em>return</em>. Немного изменим наш код:</p>
  <pre id="bk1C">import React, { useState, useEffect } from &quot;react&quot;;

export const Effect: React.FC = () =&gt; {  
  const [counter, setCounter] = useState(0);
  
  useEffect(() =&gt; {
    console.log(&quot;componentDidMount/Update&quot;, counter);
    
    return () =&gt; console.log(&quot;componentWillUnmount&quot;, counter);  
  }, [counter]);
  
  const incrementCounter = () =&gt; setCounter(counter + 1);
  
  return (    
    &lt;div&gt;      
      &lt;button onClick={incrementCounter}&gt;INC&lt;/button&gt;    
    &lt;/div&gt;  
  );
};</pre>
  <p id="UKTZ">Что же произойдет, если мы запустим этот компонент и нажмём кнопку ?<br />Сначала - произойдет рендер компонента, после чего, <em>useEffect </em>сработает как <em>componentDidMount </em>и выведет в консоль &quot;componentDidMount/Update 0&quot;.<br />После нажатия на кнопку, произойдет размонтирование компонента и выполнится callback, который мы описали в return, то есть, наш эффект сработает как <em>componentWillUnmount </em>и выведет в консоль &quot;componentWillUnmount 0&quot;. Почему именно ноль ? Потому внесение изменений в состояние компонента происходит после его размонтирования.<br />Ну и наконец, после обновления нашего компонента мы в консоли увидим запись - &quot;componentDidMount/Update 1&quot;</p>
  <p id="dhYI"></p>
  <h3 id="Ht3s">useLayoutEffect</h3>
  <p id="6oTF">С работой <em>useEffect </em>разобрались, теперь перейдём к <em>useLayoutEffect</em>.<br />У него есть всего два отличия от useEffect:</p>
  <p id="OpZW">1) Синхронное выполнение <br />2) Выполнение хука происходит ДО рендера</p>
  <p id="mYj5">В принципе, это всё, что нам нужно знать про useLayoutEffect из теории, рассказывать про него больше нечего. Однако, самое интересное будет на практике.</p>
  <p id="19EO"></p>
  <h2 id="8gHN">Когда и что использовать?</h2>
  <p id="ApHj">Итак, теперь посмотрим наглядно, когда лучше использовать <em>useEffect</em>, а когда - <em>useLayoutEffect</em>.<br />Самый главный, на мой вгляд профит, можно получить от <em>useLayoutEffect </em>в том случае, когда нам необходимо вычислить и установить какие-нибудь стартовые параметры для компонентов, которые мы хотим отрендерить.  Посмотрим на пример:</p>
  <pre id="MP8s">export const Effect: React.FC = () =&gt; {  
  const [bgColor, setBgColor] = useState(&quot;red&quot;);
  
  useEffect(() =&gt; {    
    setBgColor(&quot;blue&quot;);  
  }, []);
  
  return (    
    &lt;div style={{ width: &quot;200px&quot;, height: &quot;200px&quot;, background: bgColor }}&gt;
    &lt;/div&gt;  
  );
};</pre>
  <p id="ExNf"><br />Вроде бы всё просто, мы хотим, чтобы наш блок при рендере был синего цвета. И действительно, если запустить этот код - блок будет синим, однако, если внимательно посмотреть на блок во время рефреша страницы, то мы увидим кратковременное мигание блока с красного на синий цвет. Это обусловлено тем, что <em>useEffect </em>вызывается после первичного рендера. Этого можно избежать, заменив в данном примере <em>useEffect </em>на <em>useLayoutEffect</em>.<br /><br />В реальных кейсах, актуальным будет скролл до какого-либо элемента, который можно осуществить до рендера, добавление анимаций к компонентам и вычисление различных пропсов. <br /><br />useEffect же лучше использовать для различных манипуляций, которые не требуют срочного вмешательства в структуру DOM - к примеру, сетевых запросов, логирования, сложных вычислений, необходимых для обновления компонента и т.д.</p>
  <p id="Z1NE"></p>
  <h2 id="3yGo">Заключение</h2>
  <p id="b3qy">Мы выяснили, что useLayoutEffect - неплохое средство оптимизации компонента. С помощью него можно предотвратить лишний update компонента, предварительно произвести вычисления или засетить нужные значения в state. </p>
  <p id="oU8v">Я советую взять этот хук в свой арсенал, поскольку возможность синхронных манипуляций нативными средствами React может быть очень полезным, а, иногда, единственным решением кейсов, которые на реальных проектах могут встречаться достаточно часто.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/A9fAxr-cjr7</guid><link>https://teletype.in/@frontend_school/A9fAxr-cjr7?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/A9fAxr-cjr7?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Сложные типы данных. Стек и очередь.</title><pubDate>Mon, 15 May 2023 21:33:53 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/0c/c1/0cc1474f-0a7b-447e-b906-cd892fc6f215.png"></media:content><category>JS | TS</category><description><![CDATA[<img src="https://img3.teletype.in/files/2b/e5/2be583f1-6529-442d-b840-c9b5f52ac259.png"></img>Как известно, каждый хороший программист должен знать алгоритмы и различные типы и структуры данных, которые широко используются в мире разработки. Данная статья нацелена на опытных разработчиков, задачи которых выходят за рамки перекрашивания кнопочек и передвижения блоков на странице. Сегодня, мы поговорим о возможных реализациях стека и очереди, об их необходимости в целом, ну и конечно, всё это с большим количеством примеров кода и интересными фактами.]]></description><content:encoded><![CDATA[
  <p id="ISdg">Как известно, каждый хороший программист должен знать алгоритмы и различные типы и структуры данных, которые широко используются в мире разработки. Данная статья нацелена на опытных разработчиков, задачи которых выходят за рамки перекрашивания кнопочек и передвижения блоков на странице. Сегодня, мы поговорим о возможных реализациях стека и очереди, об их необходимости в целом, ну и конечно, всё это с большим количеством примеров кода и интересными фактами.</p>
  <h2 id="MAIb">Стек</h2>
  <p id="NpzH"><br /><strong>Стек </strong>- коллекция элементов, работающая по принципу LIFO (Last-In First-Out). Самой простым примером стека, который позволит тебе понять логику его работы является... корзина для белья! Да, та самая, в которую ты каждый вечер кидаешь свою одежду. </p>
  <figure id="aHzJ" class="m_column">
    <img src="https://img3.teletype.in/files/2b/e5/2be583f1-6529-442d-b840-c9b5f52ac259.png" width="1200" />
  </figure>
  <p id="Vh9V">Принцип стека достаточно прост - мы имеем прямой доступ только к <em>последнему добавленному элементу (Майка 6). </em>Продолжая говорить метафорами - дотянуться до самой нижней майки ты можешь только тогда, когда достанешь все остальные. <br />Соответственно, для реализации стека нам необходимо только два метода - push (кинуть майку наверх корзины) и pop (достать верхнюю майку). Вот пример реализации класса Stack на Typescript:</p>
  <pre id="we7A">export class Stack&lt;T&gt; { 
  private items: Array&lt;T&gt;

  getCount() { 
    return this.items.length 
  }
  
  push(elem: T) { 
    this.items.push(elem) 
  }

  pop() { 
    if (this.items.length) { 
      return this.items.pop() 
    } else { 
      throw new Error(&#x27;Empty stack!&#x27;) 
    } 
  }

  constructor() { 
    this.items = [] 
  } 
}</pre>
  <p id="y57I">Да, многие скажут, что это не стек в чистом виде. В некотором плане, мы ограничены возможностями Javascript при разработке таких структур. В других языках, в которых есть возможность работать с памятью напрямую - мы бы не использовали массивы для имитации стека. К примеру, в C++ каждый элемент представлял бы собой объект, имеющий два поля: value - непосредственно, данные, и <em>next </em>- ссылка на следующий в стеке элемент. Это позволяло бы классу Stack не хранить данные внутри экземпляра, достаточно было бы хранить ссылку на верхний элемент стэка. Для сильно придирчивых - в конце статьи оставлю ссылку на реализации стэка, очереди и других структур в чистом (насколько это мне позволит JS) виде.</p>
  <p id="U0xX"></p>
  <h2 id="WAj0">Очередь</h2>
  <p id="7pOF"><br />Теперь поговорим об очередях. Общая суть - тот же стек, только принцип FIFO (First-In First-Out). То есть, мы теперь имеем доступ не к верхнему элементу, а к нижнему. Пример - очередь в магазине. Ты подошел на кассу первый - из магазина выйдешь тоже первый. Элемент имеет такую же структуру, что и в стеке, но оглавление указывает на начало списка. Упрощенную реализацию с помощью массивов приведу здесь, для истинных программистов - ссылка будет в конце статьи.</p>
  <pre id="v7h4">export class Queue&lt;T&gt; { 
  private items: Array&lt;T&gt;

  getCount() { 
    return this.items.length 
  }
  
  push(elem: T) { 
    this.items.push(elem) 
  }

  pop() { 
    if (this.items.length) { 
      this.items.reverse()
      const popElem = this.items.pop() 
      this.items.reverse()
      
      return popElem
    } else { 
      throw new Error(&#x27;Empty queue!&#x27;) 
    } 
  }

  constructor() { 
    this.items = [] 
  } 
}</pre>
  <p id="fxba">В упрощенной реализации единственная разница со стеком будет в строчках с reverse(). Она обусловленна тем, что доставать элемент нам нужно с низа, а не с верха, как в стеке. Реализация для гуру будет отличаться более существенно и есть поле для дебатов.<br />Подходов к реализации достаточно много. Самым простым путём является хранение двух указтелей - на начало и конец очереди. Это облегчит реализации <em>push </em>и <em>pop </em>методов. Однако, она идёт в разрез с определением очереди - доступ должен быть только к первому элементу. </p>
  <p id="HrOj">Есть варианты с рекурсивными добавлением и извлечением элементов, однако, сложность функций будет заметно хромать.</p>
  <p id="5P5F"></p>
  <h2 id="Ohdq">На практике</h2>
  <p id="AzJN"><br />Теперь поговорим немного о практическом применении во Frontend. </p>
  <p id="mJj0">Возможно, писать руками тебе эти структуры и не придется, однако, знать о них очень и очень важно, поскольку, весь JS работает на стеках и очередях (вспомни Event Loop). Очередь микрозадач, стек вызовов - реально представляют из себя <strong>ОЧЕРЕДЬ </strong>и <strong>СТЕК </strong>соответственно, а не просто названы так для красоты. В реальных же кейсах, это может пригодиться, если ты будешь писать собственный wrapper для API вызовов, и тебе придется самостоятельно организовывать кастомную асинхронную структуру вызовов методов API. Случай достаточно нетривиальный, однако, имеет место быть. В рядовых задачах, связанных с интерфейсами и шаблонной логикой работы с API ты, скорее всего, не столкнёшься с такими кейсами.</p>
  <p id="8ULs"></p>
  <h2 id="bkHg">Заключение</h2>
  <p id="u58z">В этой статье мы познакомились с самыми основными из сложных структур данных, а именно с очередью и стеком. В дальнейшем, мы будем изучать более интересные и запутанные структуры. </p>
  <p id="MNKQ">Для трушных кодеров - <a href="https://codesandbox.io/s/stack-queue-3fu24l?file=/src/index.ts" target="_blank">ссылка </a>на песочницу с примерами реализации.<br /><br />Ставь реакцию, подписывайся на канал, зови друзей - дальше будет еще интереснее!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/1PybCsy0Dmm</guid><link>https://teletype.in/@frontend_school/1PybCsy0Dmm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/1PybCsy0Dmm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>5 вопросов работодателю</title><pubDate>Fri, 12 May 2023 22:01:50 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ab/ad/abad0e0d-96c3-414e-b767-cd20086b8a00.png"></media:content><category>Собеседования</category><description><![CDATA[<img src="https://img2.teletype.in/files/92/f6/92f67bb8-6a5e-4952-bcd7-9e7b6c92d539.jpeg"></img>В одной из предыдущих статей мы рассматривали 10 интересных вопросов на собеседовании React-разработчика. Сегодня я решил пойти немного в другую сторону. В конце собеседования (независимо от качества его прохождения кандидатом), интервьюер дает возможность кандидату задать интересующие его вопросы. Эти вопросы могут быть любыми - о внутренней структуре, о методологиях разработки, об общем моральном состоянии команды и др. Однако, в большинстве случаев, после технической части разработчик не успевает перестроить свой мозг и начинает в панике думать: &quot;Блин, если не спрошу, подумают, что мне всё равно, а если спрошу какой-нибудь бред, то подумают, что я дебил не очень опытный специалист...&quot; и так далее. Поэтому, я решил составить топ...]]></description><content:encoded><![CDATA[
  <p id="pn5A">В одной из предыдущих статей мы рассматривали 10 интересных вопросов на собеседовании React-разработчика. Сегодня я решил пойти немного в другую сторону. В конце собеседования (независимо от качества его прохождения кандидатом), интервьюер дает возможность кандидату задать интересующие его вопросы. Эти вопросы могут быть любыми - о внутренней структуре, о методологиях разработки, об общем моральном состоянии команды и др. Однако, в большинстве случаев, после технической части разработчик не успевает перестроить свой мозг и начинает в панике думать: &quot;Блин, если не спрошу, подумают, что мне всё равно, а если спрошу какой-нибудь бред, то подумают, что я <s>дебил </s>не очень опытный специалист...&quot; и так далее.<br />Поэтому, я решил составить топ из 5 вопросов, которые я сам часто задавал своим интервьюерам, чтобы на своём техническом собеседовании ты знал, о чем можно спросить и какую информацию получить.</p>
  <figure id="jGJR" class="m_original">
    <img src="https://img2.teletype.in/files/92/f6/92f67bb8-6a5e-4952-bcd7-9e7b6c92d539.jpeg" width="500" />
  </figure>
  <h2 id="K7Xv">1. Попросить обратную связь</h2>
  <p id="cWCQ">Почему то, очень многие рзаработчики вообще не интересуются мнением интервьюера о себе с технической стороны:</p>
  <ul id="SRda">
    <li id="LpUG">Я же получил оффер, зачем мне знать, где я накосячил</li>
    <li id="zcBs">Я же не получил оффер, мне всё равно, что он обо мне думает</li>
  </ul>
  <p id="titd">Однако, очень важно, независимо от хода собеседования попросить фидбэк. Этой просьбой можно закрыть сразу несколько целей и пренебрегать такой возможностью не стоит. К примеру, интервьюер по результатам собеседования не уверен в вас и любой фактор может повлиять на его решение. Если этим фактором будет твоя просьба об обратной связи, он может сделать вывод, что ты - человек, который стремится к знаниям, хочет знать о своих пробелах и заполнить их, и, возможно, твоё трудолюбие <s>(или его видимость)</s> сыграет в сторону принятия твоей кандидатуры.</p>
  <p id="ancd">Так же, помимо влияния на интервьюера и демонстрации своих положительных софт-скиллов, сама по себе обратная связь полезна по вышеуказанным причинам - ты сможешь увидеть мнение о своих знаниях со стороны и подтянуть слабые моменты, на которые тебе укажут.</p>
  <p id="saJ7">Из личного опыта - я стараюсь раз в 2-3 месяца ходить на собеседование в более или менее солидную компанию, не с целью найти местечко потеплее, а именно для того, чтобы попросить обратную связь и подтягивать образовавшиеся пробелы. Это дейтсвительно очень крутой опыт, ведь программирование - это не только про код, теорию никто не отменял!</p>
  <p id="pOVl">Ну и естественно, грамотно составляй свою просьбу. Не надо говорить что-то такое: &quot;Ну чё, как я тебе ? Хорош ? Техлидом берете на 600к в месяц с <s>блэкджеком и коллегами-девушками</s> квартальной премией ?&quot;. Старайся просить об этом ненавязчиво, однако, дай понять, что тебе это важно. Хорошим вариантом будет: &quot;Хотел бы уточнить, могу ли я, независимо от результатов нашего общения получить от тебя фидбэк? Было бы очень круто узнать твоё мнение о моих скиллах!&quot;, или так: &quot;Могу ли я рассчитывать на обратную связь при любом твоем решении по моей кандидатуре? Я всегда стараюсь работать над собой, и мне было бы очень полезно твое мнение!&quot;</p>
  <p id="6wtC"></p>
  <h2 id="TLuq">2. Узнай подробнее об условиях работы</h2>
  <p id="8GQg">Очень часто слышал от неопытных разработчиков рассказы про то, что их, якобы, обманули и взяли на работу не в штат, а на проект. То есть, человек получает оффер, счатливый, работает полгода, пилит проект, сдаёт его, PM на демо показывает MVP-версию и сообщает всем, что начальство довольно, всё прошло круто и т.д., разработчик рассчитывает на премию... а его просто увольняют. Вернее, даже не увольняют, а говорят ему спасибо и вежливо с ним прощаются.</p>
  <p id="7IIP">Странная ситуация?<br />Абсолютно нет!</p>
  <p id="ZUPb">Очень часто, разработчиков нанимают на конкретный проект. Их не берут в штат, а устраивают на определнный срок (обычно - предполагаемая длительность проекта + 1 месяц на форс-мажоры), после чего, договор не расторгается, а просто истекает. Поэтому, перед тем как устраиваться на работу очень важно уточнить, на каких условиях ты устраиваешься. Разумеется, лучше всего это сделать ещё ДО технического собеседования, т.к. HR обычно знает, на какую позицию ищут кандидата, но если вдруг ты этого не сделал - не стесняйся спросить это после интервью.</p>
  <p id="huEy"></p>
  <h2 id="IgdP">3. Уточни про методологии разработки</h2>
  <p id="CgaE">Если ты уже достаточно крепкий разработчик и хочешь устраиваться в биг-тех (или что то около лежащее), то обязательно спроси у интервьюера о процессах в команде. Скорее всего, тебя будет собеседовать опытный разработчик, с достаточным стажем в компании, поэтому он сможет развернуто тебе ответить. Заранее скажу, абсолютно нет смысла спрашивать это у HR, потому что они, в данном случае, либо не ответят, либо отбрехаются заученными словами, по типу: &quot;Всё по Scrum&#x27;у, двухнедельные спринты, демо, митинги, ретро, интро, аутро, приквел, сиквел&quot; и т.д.</p>
  <p id="wCW0">Так же, особое внимание надо уделять тому, КАК интервьюер тебе отвечает. Если он без проблем рассказывает о процессах, не путает названия, точно знает когда в его команде проходит тот или иной созвон, знает всё про структуру команд и взаимоотношения между их членами - то ты действительно идёшь туда, куда надо. Если же отвечает неохотно, либо часто сбивается и путает термины и даты, то, скорее всего, компания не работает по данным методологиям, но очень этого хочет. Тут уже - на твой страх и риск. С одной стороны - ты придешь в команду, в которой нет отлаженных процессов и перед каждым демо во всех чатах будет много паники, никто не будет знать что кому делать и т.д. С другой стороны - если в команде есть возможность проявлять инициативу (об этом кстати тоже спросим позже), то для тебя это поле возможностей - пришел, увидел, победил. Выстрой процессы, расскажи ребятам, как надо работать правильно, следи за соблюдением всех правил - если все сделаешь как надо, то тебя ждёт блестящая и стремительная карьера в этой компании.</p>
  <p id="kOr1"></p>
  <h2 id="q4xr">4. Уточни, как относятся к нововведениям</h2>
  <p id="782Y">Это уже больше психологический аспект. Разумеется, в командах с отлаженными процессами любые новшества - камень в огород текущих процессов. Многие будут на инновационные идеи смотреть с неохотой, многие сразу же воспримут крайне негативно. Однако, узнать о возможностях всё равно необходимо.</p>
  <p id="1bc3">Конечно, инициатива наказуема, все так говорят, однако, в большинстве случаев, если в команде вводить процессы/фичи/библиотеки понемногу, это не будет получать негативную реакцию. Если тебе дают возможность обсуждать какие то идеи, новинки и внедрять их - ты будешь чувствовать себя действительно важным для команды, а это, в свою очередь, хорошая страховка от выгорания.</p>
  <p id="RZxo"></p>
  <h2 id="Wrlu">5. Спроси про целевую отрасль компании</h2>
  <p id="PdYd">Возможно, не совсем правильно сформулировал заголовок, просто прочитай и ты всё поймешь.</p>
  <p id="eH2V">Обязательно нужно уточнить, над чем работает компания, чем она занимается, как зарабатывает. Опять же, из личного опыта.</p>
  <p id="bnbx">Я устраивался в, как мне казалось, крутую компанию: корпоративный сайт, неплохая зарплата, хорошо составленная вакансия (к слову, Middle React разработчик, з/п 80.000 рублей на 2019 г.). Собеседование я прошел весьма успешно, и, буквально через 3-4 дня я уже вышел на работу. Тут же мне подкинули весьма интересный проект на React, однако, почти не дали в него погрузиться и сразу же начали спамить рельными задачами. И не такими, чтобы узнать проект, а-ля &quot;перекрась кнопку&quot;, &quot;подвинь блок&quot;, &quot;уменьши padding&quot; и т.д. А реальными сложными тасками, связанными с логикой работы Redux-хранилища. Плюсом, поставили за мной ментора, который оказался достаточно токсичным человеком и не особо любил погружать новичков в проект. </p>
  <p id="BhBV">Буквально через пару недель, данный персонаж пошел к начальству и сказал, что я очень сильно туплю и не могу втянуться в проект. После чего моя работа стала адом. Весь прикол был в том, что компания по своей сути являлась Digital-агентством, которое живёт за счёт <strong>огромного </strong>количества мелких заказов. После того, как меня с позором выгнали с проекта на React (напомню, вакансия была - Middle React разработчик), мне каждый день начали подсовывать мелкие задачи на мелких проектах на Bitrix, WordPress и т.д. Изменить меню, подвинуть кнопку, перекрасить блок - все эти задачки приходилось делать каждый день по нескольку штук на нескольких разных проектах. За неделю проектов могло быть больше 10 (!!!). Надолго я в этой компании не задержался.</p>
  <p id="7Ypt">Поэтому, уточняй заранее формат работы. Если тебе нравится каждый день ковыряться в мелких проектах и держать в голове кучу информации - Welcome в Digital-компании, если же ищешь что-то более серьёзное - тогда ищи компании, которые занимаются разработкой собственных продуктов.</p>
  <p id="4Pxg"></p>
  <h2 id="aWFU">Итог</h2>
  <p id="zEEG">Не стесняйся задавать вопросы своему интервьюеру или будущему работодателю. Проявляя интерес, ты показываешь, что тебе не безралична данная вакансия и действительно нацелен стать частью команды. Однако, не старайся спрашивать, когда вопросы закончились. Мысли по типу &quot;Блин, я так мало спросил, спрошу ещё что-нибудь&quot; обычно порождают всяких бред. Старайся не задать вопрос для галочки, а получить действительно полезную информацию. Твоя цель - понять, насколько тебе подходит данное место для начала или продолжения твоей карьеры.</p>
  <p id="AMQ0">Если понравилась статья - ставь лайк, подписывайся, зови друзей, для меня это очень важно! Дальше будут еще более интересные статьи!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/Xvc2H7__r9o</guid><link>https://teletype.in/@frontend_school/Xvc2H7__r9o?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/Xvc2H7__r9o?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Основы HTML | Часть 2</title><pubDate>Tue, 09 May 2023 20:50:20 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1f/65/1f65eeba-e389-4bb3-bb6a-87f81ff43268.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/36/33/3633b38c-8ead-4561-b761-8ca0f43a0815.png"></img>В продолжении первой части данной статьи (https://teletype.in/@frontend_team/B_xm6TOEwxc), сегодня ты узнаешь про семантику HTML-тэгов и различные подходы к вёрстке веб-страниц. Данная статья является продолжением обучающего материала по HTML, однако, легко читается как самостоятельный материал. Если вдруг тебе будет непонятен материал, изложенный здесь - советую обратиться к первой части данной статьи по ссылке выше.]]></description><content:encoded><![CDATA[
  <p id="w1Zx">В продолжении первой части данной статьи (<a href="https://teletype.in/@frontend_team/B_xm6TOEwxc" target="_blank">https://teletype.in/@frontend_team/B_xm6TOEwxc</a>), сегодня ты узнаешь про семантику HTML-тэгов и различные подходы к вёрстке веб-страниц. Данная статья является продолжением обучающего материала по HTML, однако, легко читается как самостоятельный материал. Если вдруг тебе будет непонятен материал, изложенный здесь - советую обратиться к первой части данной статьи по ссылке выше.</p>
  <p id="u8sC"></p>
  <h2 id="l8ac">Семантика</h2>
  <p id="UhxF">Итак, семантика. Что же это ?<br />Семантика - смысловая нагрузка отдельной языковой единицы. Ранее, это понятие было актуально исключительно для лингвистики, но теперь - применимо и в сфере Frontend-разработки. Самое интересное, что в HTML семантика имеет тот же смысл, только в качестве языковой единицы выступает отдельно взятый тэг. Как и всегда, рассмотрим на примере:</p>
  <pre id="JrlL">&lt;html&gt; 
  &lt;head&gt;   
    &lt;title&gt;
      My first page
    &lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt; 
    &lt;div&gt; 
      &lt;div class=&quot;text&quot;&gt;Hello, world!&lt;/div&gt;
              
      &lt;div class=&quot;button&quot;&gt;SignIn&lt;/div&gt; 
    &lt;/div&gt; 
  &lt;/body&gt;
&lt;/head&gt;</pre>
  <p id="sqXp">Казалось бы, а что здесь не так ? У нас есть текст и кнопка, всё же замечательно!<br />Но нет. Дело в том, что данный фрагмент кода не является семантически правильным.</p>
  <p id="BGsq">Скорее всего, если ты достаточно любопытный, ты уже посмотрел, какие вообще бывают HTML-тэги и сколько их всего. Даже если не смотрел - отвечу: их больше сотни. Сто разных HTML-тэгов !!! <br />А раз нам предоставили такое разнообразие - то, наверное, для этого есть причина... И она кроется, опять же, в семантике. Забегая вперёд скажу - многие из этих тэгов ты вообще не будешь использовать, или будешь, но крайне редко. Однако, необходимо понимать, что у каждого из них есть своя специфическая роль и нельзя всю веб-страницу собирать из одного единственного тэга.</p>
  <p id="QVKk">Всё дело в том, что любой браузер воспринимает и обрабатывает HTML-тэги по разному. Тэг - это инструкция, как браузер должен работать с его содержимым. Именно по этому, приведенный выше фрагмент разметки является невалидным. Мы пытаемся сделать всё с помощью <em>div, </em>что является неверным подходом.</p>
  <p id="Rs4G">Возникает логичный вопрос: а как же тогда правильно ?</p>
  <p id="BoAq"></p>
  <h2 id="LvMC">Пишем семантический код</h2>
  <p id="gqwL">Давай вернемся к нашему примеру и посмотрим, что же у нас должно быть на нашей страничке:</p>
  <figure id="m560" class="m_column">
    <img src="https://img4.teletype.in/files/36/33/3633b38c-8ead-4561-b761-8ca0f43a0815.png" width="877" />
  </figure>
  <p id="hcSe">И именно здесь заключается наша ошибка. Текст и кнопка должны быть обернуты в соответствующие тэги:</p>
  <ul id="ixfn">
    <li id="ZCWn">&lt;p&gt; - параграф (абзац), служит для отображения одного абзаца текста. </li>
    <li id="oMeq">&lt;button&gt; - кликабельная кнопка, необходима, как ни странно, для добавления кнопки на веб-страничку. </li>
    <li id="bajJ">&lt;div&gt; - блочный элемент, элемент-контейнер для контента в вёрстке. </li>
  </ul>
  <p id="dpTq">То есть, наш код после всех исправлений будет выглядеть примерно вот так:</p>
  <pre id="Cd5l">&lt;html&gt; 
  &lt;head&gt;   
    &lt;title&gt;
      My first page
    &lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt; 
    &lt;div&gt; 
      &lt;p class=&quot;text&quot;&gt;Hello, world!&lt;/p&gt;
              
      &lt;button class=&quot;button&quot;&gt;SignIn&lt;/button&gt; 
    &lt;/div&gt; 
  &lt;/body&gt;
&lt;/head&gt;</pre>
  <p id="gP3j"></p>
  <h2 id="zKTs">Зачем это нужно ?</h2>
  <p id="XznW">Справедливый вопрос.<br />В программировании есть такой важный принцип, который применим в любой области - принцип KISS (Keep It Simple, Stupid), что в переводе означает &quot;делай это проще, идиот&quot;. Данный принцип говорит нам о том, что для любой задачи необходимо выбирать самое простое и лаконичное решение. </p>
  <p id="eFs1">Тогда зачем нам 100 с лишним HTML-тэгов ?<br />Ответ прост - потому что это самое простое решение проблемы. А проблема в следующем - браузер должен по разному отображать и обрабатывать содержимое каждого тэга. Даже если это не видно, даже если это не оказывает влияния на вёрстку - каждый тэг нужен для конкретной задачи и для каждого тэга у браузера свой алгоритм обработки содержимого.</p>
  <p id="U16s">К примеру, к уже знакомому нам тэгу <em>&lt;p&gt; браузер </em>автоматически добавляет отступы сверху и снизу (margin-top и margin-bottom) высотой в 1em, только если ты не укажешь ему этого не делать.</p>
  <p id="CVsG">К тэгу &lt;button&gt; браузер автоматически добавит целую кучу стилей и сам отобразит содержимое, как кнопку:</p>
  <pre id="BZaM">&lt;button&gt;Кликни меня!&lt;/button&gt;</pre>
  <figure id="pxEk" class="m_original">
    <img src="https://img2.teletype.in/files/1c/b3/1cb33877-b1c5-47e1-a2ea-22594142cb3a.png" width="143" />
  </figure>
  <p id="U2F9">И это без всяких CSS-стилей!</p>
  <p id="NThq">Так же, существуют менее заметные, но не менее важные функциональные аспекты семантических тэгов:</p>
  <ol id="AnNz">
    <li id="qP8E"><strong>Корректная обработка сайта роботами.</strong><br />Поисковые роботы автоматически понимают, что в тэге &lt;nav&gt; у нас располагается навигация сайта, и, поэтому, могут корректно и красиво это обрабатывать в виде меню прямо на странице поиска.</li>
    <li id="1ddG"><strong>Адаптивность сайта для людей с ограниченными возможностями.</strong><br />Человек, к примеру, с плохим зрением часто при веб-серфинге пользуется голосовыми помощниками, которые так же &quot;смотрят&quot; на семантику и определяют, что находится у человека под курсором в данный момент.</li>
    <li id="ckA0"><strong>Организация кода.</strong><br />Ну и конечно же, чистый код - наше всё. Код, в котором каждый тэг отвечает за определённый контент легче читать и поддерживать, поэтому настоящие трушные разработчики всегда уделяют этому внимание.</li>
  </ol>
  <p id="gGvf"></p>
  <h2 id="o0o9">Итог</h2>
  <p id="u4Sj">В этой статье ты познакомился с семантическими тэгами и теперь, в следующий раз, будешь писать более красивый, аккуратный и семантически валидный код. Как бы ни казалось, что статья необязательная для изучения, однако, многие разработчики, которые доросли до уровня Middle и даже Middle+ не всегда пользуются семантикой. Гораздо чаще на неё забивают, хотя это один из важнейших аспектов в вёрстке в наше время. </p>
  <p id="7B5l">Надеюсь, статья была тебе полезна, подписывайся на канал, ставь лайки - это ускоряет выход следующей статьи и мотивирует меня!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/0AjdDCHN6Zq</guid><link>https://teletype.in/@frontend_school/0AjdDCHN6Zq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/0AjdDCHN6Zq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>10 вопросов на собеседовании React</title><pubDate>Fri, 05 May 2023 10:59:56 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ef/9d/ef9d0e42-adb4-4868-a247-ef703d85c5a3.png"></media:content><category>React</category><description><![CDATA[Недавно, один разрботчик собрал в репозитории 500 вопросов на собеседовании по React (https://github.com/sudheerj/reactjs-interview-questions). Некоторые из них мне показались весьма занятными, а для некоторых, как я считаю, места в современном мире веб-разработки уже нет. В этой статье разберём 10 самых интересных из них, узнаем правильные ответы, а так же, я поделюсь личным мнением о каждом из них]]></description><content:encoded><![CDATA[
  <p id="Lv1w">Недавно, один разработчик собрал в репозитории 500 вопросов на собеседовании по React (<a href="https://github.com/sudheerj/reactjs-interview-questions" target="_blank">https://github.com/sudheerj/reactjs-interview-questions</a>). Некоторые из них мне показались весьма занятными, а для некоторых, как я считаю, места в современном мире веб-разработки уже нет. В этой статье разберём 10 самых интересных из них, узнаем правильные ответы, а так же, я поделюсь личным мнением о каждом из них</p>
  <p id="8Qiv"></p>
  <h2 id="rtz2">1. Что такое стэйт и пропс в React ?</h2>
  <p id="2iRz"><strong>Стэйт (state) </strong>- это объект, который хранит информацию о текущем состоянии компонента. В нём может быть заключена любая информация, которую разработчик хочет использовать для корректной работы компонента. Любое изменение стэйта влечет за собой ререндер компонента.<br /><br /><strong>Пропс (props)</strong> - по своей сущности, это любой параметр, с которым может быть вызван компонент. Существуют зарезервированные пропсы (children) и пользовательские пропсы - любое значение, которое разработчик передает в компонент.</p>
  <p id="Pogd">Я считаю, что данный вопрос актуален <strong>ТОЛЬКО </strong>для собеседования разработчиков уровня Junior. Любой разработчик у которого есть хотя бы месяц опыта работы на коммерции с React.js легко объяснит эти два термина, поэтому, нет смысла спрашивать такие примитивные вещи у более опытных кандидатов.</p>
  <p id="9rpl"></p>
  <h2 id="5CXu">2. Зачем использовать callback в setState() ?</h2>
  <p id="Bv0V">Использование callback в setState() позволяет обращаться к актуальному состоянию стэйта при его обновлении. Данный код не сработает так, как нужно, пока мы не будем использовать callback:</p>
  <pre id="trbI">// Прибавить число 6 к переменной стэйта

const add = () =&gt; {
  setState(counter + 1)
  setState(counter + 2)
  setState(counter + 3)
}  // не сработает, всегда будет прибавляться 3 ввиду асинхронности setState

const add = () =&gt; {
  setState(counter =&gt; counter + 1)
  setState(counter =&gt; counter + 2)
  setState(counter =&gt; counter + 3)
} // будет работать корректно</pre>
  <p id="yzN6">Конечно, пример в реальных кейсах не встречается, однако, он прекрасно демонстрирует использование коллбэк-функций в setState.</p>
  <p id="NwW2"></p>
  <p id="kmD9">На моей практике, не так много разработчиков уделяют должное внимание данному подходу. Лично встречал ребят, которые оценивали себя как Middle/Middle+ разработчики и не знали о данном подходе. Хороший вопрос, однако, лучше всего его задавать на примере задачи (к примеру, код выше можно преобразовать в задачку и попросить кандидата исправить его).</p>
  <p id="79wA"></p>
  <h2 id="cxjB">3.  Что такое VDOM ?</h2>
  <p id="rVtE">VDOM (Virtual Document Object Model) - основная сущность, с которой работает React. VDOM является полной копией DOM-дерева и необходим для того, чтобы проверять необходимость изменения реального DOM. Так как рендер - самая затратная операция для браузера, концепция React с использованием VDOM для регистрации изменения существенно ускоряет работу веб-приложения.</p>
  <p id="GvwY">Данный вопрос очень и очень актуален, т.к. существует огромное количество разработчиков-практиков - ребят, которые неплохо пишут код, но абсолютно не знают, как он работает &quot;под капотом&quot;. В общих чертах, любой джун должен уметь объяснить, что такое VDOM и для чего он нужен. Более глубокие познания в данном вопросе можно начинать требовать с кандидатов уровня Middle/Middle+.</p>
  <p id="L6Fj"></p>
  <h2 id="VIOa">4. Что такое HOC (High-Order Components) ?</h2>
  <p id="8KT5">HOC - это компонент высшего порядка, целью которого является использование специального пропа <strong>children </strong>и манипуляция с ним. Данный тип компонента в основном используется для добавления какой-нибудь кастомной логики к дочерним компонентам. Любой Provider из популярных библиотек (redux, react-context, styled-components и др.) является HOC. </p>
  <p id="iQAR">Соглашусь, что данный вопрос имеет место быть в собеседовании, однако, требовать полного и академичного ответа на него не стоит. Я бы лично перефразировал данный вопрос в нечто такое: &quot;Приведи пример любого High Order Components&quot;. Если кандидат способен без долгих раздумий ответить, значит он точно знает и использует данный подход для организации своих компонентов.</p>
  <p id="6BxD"></p>
  <h2 id="vCcT">5. Почему React использует className, а не class?</h2>
  <p id="d2kd">Так как JSX является расширением Javascript, а в Javascript есть ключевое слово <em>class, </em>разработчики данного синтаксиса решили использовать<em> className.</em></p>
  <p id="HLjj">Не вижу особого смысла в данном вопросе. Максимум, что он сможет показать, так это уровень саморазвития и/или любопытства разработчика. Если он знает про такие мелочи, значит человек действительно или любознателен от природы, или горит своим делом настолько, что хочет знать всё и обо всём.</p>
  <p id="jLH0"></p>
  <h2 id="fyGy">6. Что такое key в React ?</h2>
  <p id="9AUL">key - специальный проп, добавляемый к компоненту, который служит его уникальным идентификатором в процессе пересчёта (Reconciliation). Основные требования к <em>key</em>: уникальность и стабильность, иначе говоря, <em>key </em>не должен меняться в зависимости от перерендера компонента.</p>
  <p id="ujRS">Важный вопрос. В зависимости от уровня кандидата этот кейс можно расширить дополнительными вопросами: </p>
  <ul id="rGOm">
    <li id="ZbHq">можно ли использовать Index в качестве key ?</li>
    <li id="RKlv">как React проставляет key по дефолту ?</li>
    <li id="hq7w">существует ли случай, когда key нужен ВНЕ циклического рендера ?</li>
  </ul>
  <p id="GCyO">Данный вопрос раскроет уровень понимания кандидатом общего механизма работы React и является одним из основных, которые задаю на собеседованиях я сам.</p>
  <p id="x3tr"></p>
  <h2 id="MFqk">7. Что может вызвать rerender компонента ?</h2>
  <p id="CXFj">Для ререндера компонента в React существует всего 4 причины:</p>
  <ol id="kxTZ">
    <li id="X4VV">Изменение стэйта</li>
    <li id="3t4h">Изменение пропсов</li>
    <li id="VP5O">Ререндер родителя</li>
    <li id="rq0q">forceUpdate</li>
  </ol>
  <p id="BXEN">К данному вопросу моё отношение 50/50. С одной стороны - важно понимать, что кандидат знает, почему компонент может перерендериться. С другой стороны - формулировка достаточно простая и актуальна только для кандидатов уровня Junior/Junior+, для более опытных ребят это будет слишком просто.</p>
  <p id="fAHf"></p>
  <h2 id="k4sm">8. Как использовать &lt;label&gt; в React ?</h2>
  <p id="pdKd">Синтаксис <em>label </em>в JSXотличается от аналогичного синтаксиса в HTML ввиду того, что &quot;for&quot; является ключевым словом в Javascript, поэтому необходимо использовать htmlFor.</p>
  <p id="ouJa">Данный вопрос - лучший аналог вопроса №5. Если кандидат знает про такие нюансы использования тэгов в JSX, значит он как минимум сталкивался с такими кейсами и понимает, почему &quot;for&quot; не работает для &lt;label&gt; в JSX. Вопрос не является основным, но задать его после определения термина JSX будет неплохой добивкой для блока.</p>
  <p id="qwdb"></p>
  <h2 id="haBc">9. Что такое renderProp в React ?</h2>
  <p id="TeR6">renderProp - механизм делегирования логики рендера родительскому компоненту. Данный подход позволяет не описывать логику работы тупых компонентов в отдельном файле, а вынести её в компонент-родитель.</p>
  <pre id="PALP">&lt;DataProvider render={(data) =&gt; &lt;h1&gt;{&#x60;Hello ${data.target}&#x60;}&lt;/h1&gt;} /&gt;</pre>
  <p id="HlAL">Вопрос неплохой, однако, я бы дополнил его вопросом о плюсах и минусах данного подхода. Если кандидат способен конструктивно изложить свои мысли по поводу использования данного механизма, к примеру, почему он старается избегать данных кейсов - значит перед нами весьма и весьма перспективный разработчик.</p>
  <p id="iJUd"></p>
  <h2 id="4LoI">10. Почему нельзя изменять пропсы из дочернего компонента?</h2>
  <p id="weUw">Ввиду философии React, пропсы должны быть <em>иммутабельными. </em>Простыми словами, дочерний компонент не имеет возможности воздействовать на родительских путём прямого изменения его состояния. Если вдруг это всё таки необходимо - хорошим решением является дополнительный проп-callback, который выполняет определённую логику изменения пропсов, <strong>заложенную родительским компонентом.</strong></p>
  <p id="0sje">Вопрос нацелен так же на понимание философии React. Одним из основных принципов является Top-Down - пропсы регулируют поведение дочернего компонента, а не дочерний компонент диктует поведение пропсов. Вопрос может быть задан кандидатам любого уровня, а развернутость ответа укажет на уровень кандидата.</p>
  <p id="QxoL"></p>
  <h2 id="4hc3">Заключение</h2>
  <p id="Sewh">Я разобрал для тебя вопросы, которые мне показались наиболее интересными из списка. В следующей статье на эту тему мы продолжит разбирать вопросы с собесов и пообщаемся на тему дополнительных библиотек в React, таких как React Router, Redux и др.<br />Подписывайся на канал, ставь лайки - так статьи будут выходить ещё чаще!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/iedCUvVmKcQ</guid><link>https://teletype.in/@frontend_school/iedCUvVmKcQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/iedCUvVmKcQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Основы Javascript. Часть 2</title><pubDate>Tue, 02 May 2023 21:24:05 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/64/aa/64aa0204-c293-44ab-8611-65a3914dcb05.png"></media:content><category>JS | TS</category><description><![CDATA[<img src="https://img1.teletype.in/files/8d/a1/8da12779-f1de-4b3f-8398-878677e0dc5a.png"></img>В продолжении цикла статей про основы Javacript, мы поговорим о ссылочных типах данных, методах работы с ними и косвенно затронем тему наследования. Не пугайся страшных слов, все будет изложено максимально последовательно и просто! ]]></description><content:encoded><![CDATA[
  <p id="fQ8z">В продолжении цикла статей про основы Javacript, мы поговорим о ссылочных типах данных, методах работы с ними и косвенно затронем тему наследования. Не пугайся страшных слов, все будет изложено максимально последовательно и просто! </p>
  <h2 id="VIh2">Ссылочные типы</h2>
  <p id="Fcll">Немного освежим в памяти основное отличие ссылочных типов от примитивных - при создание переменной ссылочного типа невозможно заранее знать, какой объем памяти ей потребуется для хранения данных. В связи с этим, ссылочные типы данных имеют некоторые особенности при работе с ними. В частности - когда мы будем говорить о сравнении объектов (которые являются ни чем иным, как ссылочным типом данных), об их присваивании другим переменным и изменении значений нам нужно иметь ввиду, что на самом деле, в переменной находятся не сами данные, а <strong><em>ссылка </em></strong>на ячейку памяти с данными. Проще всего посмотреть это на примере:</p>
  <pre id="6k0f">const object1 = { name: &#x27;Alex&#x27; }</pre>
  <figure id="g2y6" class="m_column">
    <img src="https://img1.teletype.in/files/8d/a1/8da12779-f1de-4b3f-8398-878677e0dc5a.png" width="972" />
  </figure>
  <p id="ngo6">То есть, когда мы обращаемся к переменной, мы получаем адрес ячейки памяти с данными и идём непосредственно к этой ячейке, после чего получаем возможность работать с ее содержимым.</p>
  <p id="W5O1">Интересные вещи начинаются, когда мы пытаемся каким-либо образом манипулировать нашей переменной. К примеру, нам понадобился второй объект, который является копией первого. Вроде бы все достаточно просто:</p>
  <pre id="D4di">const object1 = { name: &#x27;Alex&#x27; }
const object2 = object1</pre>
  <p id="fFf4">Всё, круто, получилось... хотел бы я сказать, но нет. </p>
  <p id="9XSA">Следует понимать, что в коде выше, в переменную <em>object2 </em>мы скопировали не сам объект, а <strong>ссылку </strong>на ячейку памяти. Следовательно - ситуация теперь такая:</p>
  <figure id="TdDO" class="m_column">
    <img src="https://img1.teletype.in/files/8e/e5/8ee50570-c51c-4818-bff8-6b66a74f19f7.png" width="955" />
  </figure>
  <p id="0a6G">&quot;Ну и пофиг, данные то одинаковые&quot; - первая мысль... Но не все так просто. Самое интересное будет, если мы попытаемся изменить <em>object2. </em>Я думаю, ты уже догадался, что произойдет:</p>
  <pre id="aH5e">const object1 = { name: &#x27;Alex&#x27; }
const object2 = object1

object2.name = &#x27;John&#x27; // вроде бы ок
console.log(object1.name) // будет выведено &#x27;John&#x27;</pre>
  <p id="nD7d">Да, когда мы поменяем поле <em>name </em>в первом объекте - оно изменится и во втором. Произойдет это из-за того, что обе переменные хранят в себе <strong>ссылку на один и тот же объект</strong>.</p>
  <p id="TvL8">Несмотря на, казалось бы, сложное поведение, такой подход к организации механизма хранения ссылочных типов может быть очень полезным. В частности, он позволяет реализовывать прототипное наследование - паттерн, на котором держится весь Javascript. Мы обязательно поговорим об этом подробнее в следующих уроках, скорее всего, будет отдельная статья на эту тему. Сейчас скажу простым языком - наследование ссылочных типов данных производится путем добавления к ним специально поля &#x27;Prototype&#x27;, которое, по своей сути, является ссылкой на объект-родитель и позволяет использовать его поля и методы.</p>
  <p id="a3BK">Кстати о полях и методах, думаю об этом мы поговорим сейчас.</p>
  <p id="63Tn"></p>
  <h2 id="Opmc">Поля (свойства)</h2>
  <p id="5Fqp">Любой ссылочный тип данных может иметь собственные поля и методы. В коде выше мы уже объявляли поле &#x27;name&#x27; у наших объектов. Из этих примеров можно вывести достаточно простое определение: поля (свойства) объекта - это пара &quot;ключ-значение&quot;, которая может хранить в себе некий набор данных. Поля в свою очередь так же могут быть как объектами, так и примитивами. К примеру, давай создадим объект, который может охарактеризовать человека:</p>
  <pre id="NJUL">const people = {
  name: &#x27;Alex&#x27;,
  age: 23,
  city: {
    name: &#x27;Moscow&#x27;,
    postalCode: &#x27;101000&#x27;,
  }
}</pre>
  <p id="uUx1">Что мы здесь видим ?</p>
  <p id="mOns">У нас есть объект, который описывает человека с помощью полей с необходимой информацией: первые два - примитивы, возраст и имя человека, однако третий является объектом, у которого так же есть два поля - название и индекс города, в котором человек проживает. Вложенность объектов - ещё один замечательный механизм, который позволяет описывать сложные структуры данных, такие как, например деревья, матрицы и т.д.</p>
  <p id="OBDZ"></p>
  <h2 id="ICZi">Методы</h2>
  <p id="yB1o">Помимо полей, объекты также могут иметь методы. Пока что, мы не будем писать кастомные методы, поговорим об уже существующих. </p>
  <p id="vop9">Обратимся к структуре выше:</p>
  <pre id="RpGX">const people = {
  name: &#x27;Alex&#x27;,
  age: 23,
  city: {
    name: &#x27;Moscow&#x27;,
    postalCode: &#x27;101000&#x27;,
  }
}</pre>
  <p id="k7FS">Предположим, что такие данные нам приходят с сервера, то есть мы самостоятельно не заполняем объект, его заполняет какой-то умный дядя-бэкендер и отправляет нам. Как мы можем убедиться, что поле &#x27;city&#x27; существует у объекта? Для этого есть дефолтный метод <em><strong>hasOwnProperty. </strong></em>Методы вызываются от самих объектов через точку как обычная функция:</p>
  <pre id="fR1J">people.hasOwnProperty(&#x27;name&#x27;) // true</pre>
  <p id="ZmFJ">Что мы сделали ?<br />Простым языком - спросили у нашего объекта, имеет ли он свойство &#x27;<em>name</em>&#x27;, на что функция нам ответила <em>true</em>. </p>
  <p id="74nI"></p>
  <h2 id="eu9E">Примеры ссылочных типов</h2>
  <p id="QpAh">Помимо объектов, о которых мы уже достаточно поговорили, Javascript предоставляет огромное множество других ссылочных типов (которые, кстати, в любом случае наследуются от объекта).<br />Немного посмотрим на самые распространённые из них.</p>
  <h3 id="YwBI">Array</h3>
  <p id="X2cR">Массивы - основа языка Javascript. Они позволяют хранить перечисляемые однотипные элементы. Например:</p>
  <pre id="khAk">const myArr = [&#x27;zero&#x27;, &#x27;one&#x27;, &#x27;two&#x27;, &#x27;three&#x27;]</pre>
  <p id="V7DH">Каждый элемент массива имеет свой индекс, нумерация которых начинается, естественно с нуля. Например, чтобы получить доступ к элементу &#x27;one&#x27;, мы будем использовать следующую конструкцию:</p>
  <pre id="a0kL">myArr[1] // &#x27;one&#x27;</pre>
  <p id="aVD2">Индекс выбранного элемента указывается в квадратных скобках сразу после имени переменной.</p>
  <p id="82Wi"><em>Интересный факт: к полю обычного объекта так же можно обращаться через квадратные скобки. Для примера с Алексом из Москвы справедлива такая запись:</em></p>
  <pre id="ZpsH">people[&#x27;name&#x27;] == people.name // двойное равно используется для сравнения </pre>
  <p id="VJ1M"></p>
  <h3 id="KduU">Date</h3>
  <p id="sZKR">Ещё один ссылочный тип данных - дата. Для создания даты мы будем использовать следующий вариант записи:</p>
  <pre id="R8hm">const currentDate = new Date()
console.log(currentDate) // Date Wed May 03 2023 02:16:17 GMT+0500 </pre>
  <p id="wQh4">Да, всё верно, на момент написания этой статьи у меня уже 2 часа ночи. Думаю, это заслуживает лайка и реакции на статью) Не забудь поделиться с друзьями, если тебе понравился материал.</p>
  <p id="yBkN">Так же, помимо указанных выше типов существуют еще такие штуки как Map, Set, File, ArrayBuffer, Promise и другие ссылочные типы. Их очень много, каждый используется для конкретной задачи. Мы обязательно встретим их и обсудим более подробно.</p>
  <p id="H2tH"></p>
  <h2 id="oXdK">Заключение</h2>
  <p id="vOqp">В этой статье ты научился работать с ссылочными типами данных, понял, как они хранятся в памяти и как передаются значения. Хорошим опытом для закрепления материала будет попытка поиграться с различными объектами - создавай их, изменяй, пробуй использовать различные методы, описывай в них всё, что видишь вокруг себя:</p>
  <ul id="17P0">
    <li id="b2he">компьютер - марка, модель, цена</li>
    <li id="ya0o">стол - материал, форма, количество ножек</li>
    <li id="x7jo">погода - температура, скорость ветра, направление, осадки</li>
  </ul>
  <p id="C5an">Это очень круто поможет тебе закрепить материал данной статьи.</p>
  <p id="N0Iz">Подписывайся, ставь лайки и реакции, рекомендуй канал своим друзьям - это все очень мотивирует меня писать как можно больше, чаще и интереснее!<br />До скорых встреч, успехов!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/react_start</guid><link>https://teletype.in/@frontend_school/react_start?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/react_start?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Знакомство с React.js</title><pubDate>Mon, 01 May 2023 20:37:27 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/09/f0/09f0b0ec-c91b-4027-bf9f-83147eba4b55.png"></media:content><category>React</category><description><![CDATA[<img src="https://img4.teletype.in/files/7b/f0/7bf0f7c6-4e42-445a-a69a-5579c75cdd77.png"></img>Вот наконец-то мы и добрались до серьезных разговоров. React.js - популярнейшая библиотека для разработки веб-приложений. В последнее время стало каноном использовать React для всего, что хочет в интернет: от сайтов-визиток до полноценной экосистемы с множеством виджетов и микроприложений. С этой статьи мы начнем длинный (я надеюсь, бесконечный) цикл статей про React.js, в котором ты сможешь с нуля познакомиться с данной библиотекой, а в будущем - следить за новыми фишками и подходами в мире React.js. ]]></description><content:encoded><![CDATA[
  <p id="nnKV">Вот наконец-то мы и добрались до серьезных разговоров. React.js - популярнейшая библиотека для разработки веб-приложений. В последнее время стало каноном использовать React для всего, что хочет в интернет: от сайтов-визиток до полноценной экосистемы с множеством виджетов и микроприложений. С этой статьи мы начнем длинный (я надеюсь, бесконечный) цикл статей про React.js, в котором ты сможешь с нуля познакомиться с данной библиотекой, а в будущем - следить за новыми фишками и подходами в мире React.js. </p>
  <p id="VcQ2"></p>
  <h2 id="oms4">Подготовка</h2>
  <p id="e3vV">Я не буду начинать с рассказа про React, как, зачем и где его применять - это всё можно найти в первых двух ссылках в выдаче Google. Мы будем действовать максимально прямолинейно - создадим приложение, разберёмся, что к чему, и будем писать много-много кода.</p>
  <p id="qZyc">Сама статья предполагает, что ты уже знаком с Javascript, умеешь верстать с помощью HTML/CSS и готов погружаться в мир серьезной веб-разработки.</p>
  <p id="peNl">Что нам нужно для начала:</p>
  <ul id="0OKK">
    <li id="5QYA">Установленный Node.js (среда выполнения JavaScript-кода, можно скачать <a href="https://nodejs.org/ru" target="_blank">тут</a>)</li>
    <li id="dWWZ">Редактор кода (рекомендую Visual Studio Code - <a href="https://code.visualstudio.com/" target="_blank">клик</a>)</li>
    <li id="a0Ma">Эта статья и час свободного времени</li>
  </ul>
  <p id="n2Rq">Если всё это есть на твоём компьютере - мы можем начинать!</p>
  <p id="acox"></p>
  <h2 id="Yf3Z">Создание приложения</h2>
  <p id="H3ZS">Для начала, убедимся, что у тебя всё готово для работы. Откроем VS Code, внутри, в терминале введем команду</p>
  <pre id="fxBI">node -v</pre>
  <p id="tU6y">Если нет никакой ошибки, а в консоли ты видишь номер версии Node.js - то проверяем так же и npm (менеджер пакетов):</p>
  <pre id="clYS">npm -v</pre>
  <p id="HQk3">Аналогично - если видем циферки, значит всё круто, можем создавать наше приложение.</p>
  <p id="W9OZ">Для создания приложения воспользуемся известным бойлерплейтом (стартовым шаблоном) <em>create-react-app</em>. Этот шаблон позволяет быстро и без лишних настроек перейти непосредственно к написанию приложения. Итак, находясь в нашей папке (которую ты предварительно создал для своего первого проекта), в терминале мы пишем следующую команду:</p>
  <pre id="WxGy">npx create-react-app first-app</pre>
  <p id="wImi">Вкратце о команде:</p>
  <ul id="IGc8">
    <li id="slAx">npx - утилита для запуска npm-пакетов</li>
    <li id="qk9i">create-react-app - пакет, реализующий стартовый шаблон React.js</li>
    <li id="dlYQ">first-app - имя твоего приложения (можешь выбрать любое)</li>
  </ul>
  <p id="Oody">После установки приложения, у тебя появится папка с твоим проектом, примерно следующей структуры:</p>
  <figure id="r37Z" class="m_original">
    <img src="https://img4.teletype.in/files/7b/f0/7bf0f7c6-4e42-445a-a69a-5579c75cdd77.png" width="363" />
  </figure>
  <p id="0nwC">Чуть ниже по статье мы рассмотрим все файлы и папки, уберем все ненужное и напишем самостоятельно первое приложение, а пока что, давай наконец запустим наш сервер разработки и посмотрим, что получится. Открываем в консоли папку с нашим приложением и пишем:</p>
  <pre id="h6JB">npm start</pre>
  <p id="7F0w">Данная команда запускает Node.js сервер, на котором будет разворачиваться твоё приложение. После запуска - заходим на <a href="http://localhost:3000" target="_blank">http://localhost:3000</a> и видим стартовую страницу <em>create-react-app</em>:</p>
  <figure id="4Fsr" class="m_column">
    <img src="https://img3.teletype.in/files/64/f7/64f7f7cd-017c-4656-8479-7afeaa0ae771.png" width="1364" />
  </figure>
  <p id="BNUe">Окей, с этим разобрались. Теперь, давай посмотрим, что у нас есть в папке проекта.</p>
  <p id="tDOJ"></p>
  <h2 id="HFDK">Структура папок</h2>
  <h3 id="YZ68">node_modules</h3>
  <p id="sU0I">Самая первая и самая большая папка - это <em>node_modules.</em> На ней мы пока что не будем заострять внимание, скажу лишь, что это системная папка, в которой хранятся все используемые пакеты и модули для работы React-приложения.</p>
  <p id="vEzT"></p>
  <h3 id="mpcA">public</h3>
  <p id="v5wQ">Далее - папка public. В этой папке у нас лежат ресурсы нашего приложения. </p>
  <ul id="vZ5S">
    <li id="Y5Zr">favicon.ico - фавиконка для веб-странички</li>
    <li id="DM64">index.html - непосредственно, веб-страница, в которую React.js будет рендерить наше приложение.</li>
    <li id="zOzN">manifest.json - общая конфигурация твоего сайта. Там можно хранить разную информацию об авторе, версии, теме, ресурсах и т.д. Подробнее про манифесты можно прочитать <a href="https://developer.mozilla.org/ru/docs/Mozilla/Add-ons/WebExtensions/manifest.json" target="_blank">тут</a>, мы не будем сильно заострять на этом внимание (пока что).</li>
    <li id="aq1r">robots.txt - так же, системный файл, необходимый для корректной индексации твоего сайта роботами.</li>
  </ul>
  <p id="DtSA">Также, в этой папке <s>можно</s> нужно хранить статические ресурсы, такие как изображения, видео, документы, которые используются твоим приложением.</p>
  <p id="Ss20"></p>
  <h3 id="KzMe">src</h3>
  <p id="2DKw">Это - самая главная и интересная папка. В ней находится точка входа в React-приложение и все его компоненты. Именно в этой папке ты будешь работать большую часть времени. Давай для начала приведём ее в надлежащий вид:</p>
  <figure id="J8dc" class="m_original">
    <img src="https://img4.teletype.in/files/b5/db/b5db3cd9-2d8f-4148-bc8c-aa1d4357d4a5.png" width="367" />
  </figure>
  <p id="Yinz">На данном этапе, нам не нужны тесты, веб-воркеры и отдельные CSS-модули. Оставляем только <em>index.js </em>- точка входа в приложение, App.js - главный компонент твоего приложения и index.css - глобальный файл стилей. Так же добавляем две новые папки: components - для хранения наших компонентов, pages - для хранения страниц. К этим папкам мы обязательно вернемся в следующих уроках, на данном этапе они нам не понадобятся. <br /></p>
  <h2 id="XkGT">Hello, World!</h2>
  <p id="f5cu">Теперь, для того чтобы наше приложение не падало с ошибкой - уберем все лишнее.</p>
  <p id="fW0S"><strong><em>index.js:</em></strong></p>
  <pre id="SXxE">import React from &quot;react&quot;;
import ReactDOM from &quot;react-dom/client&quot;;
import App from &quot;./App&quot;;

import &quot;./index.css&quot;;

const root = ReactDOM.createRoot(document.getElementById(&quot;root&quot;));

root.render(  
  &lt;React.StrictMode&gt;    
    &lt;App /&gt;  
  &lt;/React.StrictMode&gt;
);</pre>
  <p id="r6j9"></p>
  <p id="i2rr"><strong><em>App.js:</em></strong></p>
  <pre id="ZOeT">const App = () =&gt; {  
  return &lt;div className=&quot;App&quot;&gt;&lt;/div&gt;;
}

export default App;</pre>
  <p id="zjvL"></p>
  <p id="0ehF">index.css пока можно оставить пустым.</p>
  <p id="ldlS"></p>
  <p id="rEwc">Сейчас, если ты откроешь браузер - ты увидишь пустой белый экран. Давай это исправим, и, по классике, напишем &quot;Hello, World!&quot; посередине нашей страницы.</p>
  <p id="9MGJ">Для этого, в файле <strong>App.js</strong> нам надо добавить контейнер для нашей фразы и вписать её внутрь:</p>
  <p id="EEtj"><strong><em>App.js</em></strong></p>
  <pre id="Wh2G">const App = () =&gt; {  
  return (
    &lt;div className=&quot;App&quot;&gt;
       &lt;div className=&quot;container&quot;&gt;Hello, World!&lt;/div&gt;
    &lt;/div&gt;  
  );
};

export default App;</pre>
  <p id="NEIf">Обрати внимание, в синтаксисе JSX (расширение синтаксиса JavaScript для работы со стеком HTML/CSS/JavaScript в одном файле) имена классов для элементов обозначаются словом &quot;<strong>className</strong>&quot;.</p>
  <p id="Hq2h">Так же, в наш пустой <strong><em>index.css</em></strong> добавим стили для контейнера:</p>
  <pre id="jB7p">* {  
  margin: 0;  
  padding: 0;
}

.container {  
  width: 100vw;  
  height: 100vh;
  
  background: black;
  
  color: #efab2b;  
  font-size: 5rem;
  
  display: flex;  
  align-items: center;  
  justify-content: center;
}</pre>
  <p id="LyWt"></p>
  <p id="28d6">Результат на экране:</p>
  <figure id="WIq0" class="m_column">
    <img src="https://img2.teletype.in/files/10/5d/105d0e32-5eea-4a1b-a378-70b228242b8c.png" width="838" />
  </figure>
  <p id="n4Dg"></p>
  <h2 id="IIJ5">Итог</h2>
  <p id="qiNw">В этой статье мы с тобой развернули сервер разработки и написали наше первое приложение на React.js. Неплохой результат для небольшой статьи. </p>
  <p id="VXQ0">В следующих статьях мы глубже познакомимся с экосистемой React.js, научимся использовать композицию компонентов для создания удобного и красивого интерфейса и для правильно организации кода, начнём понимать философию React.js и продолжим совершенствовать наше приложение.</p>
  <p id="Xl3e">Подписывайся на канал, чтобы не пропускать выход новый статей, ставь лайки, зови друзей - давай создавать комьюнити вместе!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/-W0GlbdIRSL</guid><link>https://teletype.in/@frontend_school/-W0GlbdIRSL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/-W0GlbdIRSL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Малоизвестные но полезные CSS-свойства</title><pubDate>Fri, 28 Apr 2023 20:46:49 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/eb/c8/ebc8c7f7-d717-4e9a-bde3-cb7d7abe1acc.png"></media:content><category>HTML &amp;amp; CSS</category><description><![CDATA[<img src="https://img2.teletype.in/files/11/01/1101d9c3-fb12-4bc4-9ccd-707234510c2a.png"></img>Ранее, в цикле статей про CSS, я рассказывал про редкие псевдоклассы, о которых знают не так много разработчиков. Сегодня Мы поговорим на тему редких, но очень полезных CSS-свойств, которые помогут решить вроде бы тривиальные задачи достаточно изящными способами. Данная статья будет полезна как опытным разработчикам, так и начинающим, которые хотят сразу же брать в руки мощные инструменты.]]></description><content:encoded><![CDATA[
  <p id="vhdt">Ранее, в цикле статей про CSS, я рассказывал про редкие псевдоклассы, о которых знают не так много разработчиков. Сегодня Мы поговорим на тему редких, но очень полезных CSS-свойств, которые помогут решить вроде бы тривиальные задачи достаточно изящными способами. Данная статья будет полезна как опытным разработчикам, так и начинающим, которые хотят сразу же брать в руки мощные инструменты.</p>
  <h2 id="jSyq">isolation</h2>
  <p id="RNlp">Для того, чтобы ты понял необходимость использования данного свойства, для начала, я коротко расскажу про такую штуку в CSS, как контекст наложения (stacking context). Не путать с &quot;this&quot; в Javascript, это разные вещи!<br />Итак, в CSS существует определённый набор свойств, который создаёт для элемента собственную вычислительную обёртку - контекст. Простым языком - для всех дочерних элементов данное свойство будет иметь не глобальное значение, а вложенное. <br />Допустим, у нас есть элемент с &quot;z-index: 1&quot;. Добавим ему ребенка с большим индексом:</p>
  <pre id="0FtG">.block1 { 
  width: 200px; 
  height: 200px;
  background: red;
  position: relative;
  z-index: 1;
}
.child1 { 
  width: 100px; 
  height: 100px;
  background: blue;
  position: relative;
  z-index: 9999;
}</pre>
  <p id="klgK">В данном случае, истинный &quot;z-index&quot; у дочернего элемента будет равен 1.9999<br />То есть вычисление будет производиться относительно родителя с данным свойством. Иначе говоря - block1 создал свой собственный <strong>stacking context</strong>.</p>
  <p id="0s3u">Кроме &quot;z-index&quot; собственный контекст создают свойства &quot;position&quot;, &quot;opacity&quot;, &quot;animation&quot;, &quot;transform&quot; и др.</p>
  <p id="ubMw">А что если, нам позарез надо создать у элемента контекст наложения, но для свойства, которое его по дефолту не создаёт ? Тут нам на помощь и приходит свойство <strong>&quot;isolation&quot;.</strong></p>
  <p id="Xxxl">Используя данное свойство, можно указать элементу принудительно создать <strong>stacking context</strong>. Это может очень помочь в том случае, когда ты уже настолько запутался в огромных значениях &quot;z-index&quot; у своих элементов, что хочется их организовать более рационально. Порядок действий будет следующим:</p>
  <p id="HuNY">1) Найти родительский элемент, для которого структура будет слишком запутанная</p>
  <p id="dRfj">2) Создать wrapper для него, с недвусмысленным названием &quot;stacking-context-1&quot;</p>
  <p id="QoVl">3) Применить isolation: isolate.</p>
  <p id="DxEy">4) Получить готовый контейнер с <strong>отдельным </strong>контекстом</p>
  <p id="dNZj"></p>
  <h2 id="GSKp">will-change</h2>
  <p id="FwyX">Как часто у тебя бывал такой кейс: </p>
  <p id="iZZC">Дизайнер просит сделать тебя <s>офигенную, красивую</s> тяжелую и долгую анимацию для какого нибудь блока, которая должна срабатывать только при выполнении какого-нибудь условия (к примеру, появления элемента в области видимости). Ты берешься, делаешь эту анимацию, выставляешь штук 20 промежуточных точек, вычисляемые положения и прочие изыски твоих алгоритмических познаний... вроде бы всё круто, но как только начинаешь тестить, то ловишь странную задержку, между срабатыванием условия и запуском анимации.<br />В поисках спрятанного delay, ты проводишь остаток рабочего дня и половину вечера, и... ничего не находишь. </p>
  <p id="LBSW">На самом деле, браузер пытается вычислить все свойства твоей анимации &quot;на лету&quot;. То есть, любая промежуточная точка в анимации вычисляется только в тот момент, когда она действительно необходима. В том случае, если вычислений много или они достаточно массивные - ты можешь ловить freeze или даже полное зависание страницы.<br />Для оптимизации данного кейса и придумали свойство <strong>&quot;will-change&quot;.</strong></p>
  <p id="DuKL">Это свойство как бы говорит браузеру, чтобы он вычислил все нужные значения <strong>заранее, </strong>а при срабатывании условия - просто воспроизвел их.</p>
  <p id="fVdm">Однако, использовать данное свойство нужно с осторожностью, так как если на странице будет переизбыток &quot;will-change&quot; - тогда ты можешь ждать очень-очень долго самого первого рендера. В большинстве случаев, рациональным подходом будет являться обычная оптимизация кодовой базы анимаций.</p>
  <p id="swHN"></p>
  <h2 id="bzjC">accent-color</h2>
  <p id="SHdb">Посмотри на эту картинку:</p>
  <figure id="L2ep" class="m_original">
    <img src="https://img2.teletype.in/files/11/01/1101d9c3-fb12-4bc4-9ccd-707234510c2a.png" width="638" />
  </figure>
  <p id="n5LI">Обычный стандартный чекбокс. Как известно, элементы взаимодействия с пользователем (input, select, option, textarea) очень привередливые к стилям.<br />Предположим, тебе нужно изменить цвет галочки с синей на золотистую. Неопытный разработчик сразу начнёт это делать через псевдоэлементы, &quot;display: none&quot; и прочие радости верстальщика. Но ты же читаешь этот канал. Ты умнее. Ты просто воспользуешься свойством <strong>accent-color </strong>и решишь проблему за секунду:</p>
  <pre id="fDH6">input[type=&quot;checkbox&quot;] { 
  accent-color: #fcc050;
}</pre>
  <figure id="J5YL" class="m_original">
    <img src="https://img4.teletype.in/files/74/12/74124ef1-ebf6-4fcc-b723-65c94f34ab27.png" width="438" />
  </figure>
  <p id="XYAM">Если ты думаешь, что про это свойство знают все - ты заблуждаешься. Вот как на простой вопрос отвечают на StackOverflow:</p>
  <figure id="u3ak" class="m_original">
    <img src="https://img1.teletype.in/files/89/94/89946b2b-03e8-4fec-a3a9-c90f84ecd55e.png" width="572" />
  </figure>
  <p id="6S4L">... а ниже строк 56 великолепного кода на CSS. <br /><br />Читать эту статью или писать кучу CSS ? Решай сам.</p>
  <p id="pi3q"></p>
  <h2 id="PuFi">shape</h2>
  <p id="5q6K">Закончим эту статью очень интересной группой свойств. </p>
  <figure id="XAoE" class="m_original">
    <img src="https://img2.teletype.in/files/50/3a/503a2915-331e-4ea4-ae7b-faa712800476.png" width="628" />
  </figure>
  <p id="39Va">Ты думаешь, я руками проставлял margin для каждого из этих параграфов?<br />Нет!<br />Для создания геометрических фигур в CSS достаточно использовать CSS Shapes. </p>
  <p id="VHGZ">Данное свойство накладывает небольшие ограничения на целевой элемент - он обязательно должен быть с фиксированными размерами, а так же - быть обтекаемым (float). Не слишком высокая цена, не правда ли ?<br />С помощью <strong>shapes </strong>можно создавать различные геометрические фигуры без объемной кодовой базы и изображений. Однако, для того чтобы закрасить созданную нами фигуру - нам необходимо использовать shape в комбинации с clip-path. Пример - закрашенный градиентом треугольник:</p>
  <pre id="762W">.circle { 
  float: left; 
  height: 200px; 
  width: 200px; 
  shape-outside: polygon(0 0, 0 300px, 200px 300px);  
  clip-path: polygon(0 0, 0 300px, 200px 300px);   
  background: linear-gradient(to top right, #86F7CC, #67D7F5); 
}</pre>
  <figure id="Lu4J" class="m_original">
    <img src="https://img2.teletype.in/files/54/84/5484b5b0-fbd5-40d0-a48e-ca92e618d520.png" width="720" />
  </figure>
  <p id="IrP8"></p>
  <p id="fTxq">На этом от меня - всё. Ставь лайк на эту статью, это очень мотивирует меня!<br />Буду стараться писать качественный материал как можно чаще<br />Подписывайся на канал и следи за самой актуальной и интересной информацией в мире Frontend</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/c3dkCrVQpDT</guid><link>https://teletype.in/@frontend_school/c3dkCrVQpDT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/c3dkCrVQpDT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Малоизвестные псевдоклассы</title><pubDate>Wed, 19 Apr 2023 21:38:19 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/43/0d/430d62b0-70b6-47f4-8a58-3a900574f7e2.png"></media:content><category>HTML &amp;amp; CSS</category><description><![CDATA[<img src="https://img3.teletype.in/files/a0/2e/a02e9b49-4809-40b0-bcc9-bffc0b0938da.png"></img>В продолжение последней статьи по теме псевдоэлементов и псевдоклассов в  CSS, мы рассмотрим редко используемые, но очень полезные псевдоклассы. Ты,  скорее всего, слышал про них, но очень мало разработчиков добавили их в свой инструментарий. Подписывайся, чтобы не пропустить новые интересные статьи.]]></description><content:encoded><![CDATA[
  <p id="DS1s">В продолжение последней статьи по теме псевдоэлементов и псевдоклассов в  CSS, мы рассмотрим редко используемые, но очень полезные псевдоклассы. Ты,  скорее всего, слышал про них, но очень мало разработчиков добавили их в свой инструментарий. Подписывайся, чтобы не пропустить новые интересные статьи.</p>
  <p id="tGgj"></p>
  <h2 id="pafM">:required</h2>
  <p id="m0NO">Псевдокласс <em>:required </em>позволяет найти любые <em>input</em> на странице, которые имеют атрибут &quot;required&quot;. Это может быть полезно, когда поле, которое перед отправкой формы должно быть заполнено, нам необходимо стилизовать. Как всегда - посмотрим на примере:</p>
  <pre id="toDg">// style.css
input:required { 
  border-color: red; 
  line-height: 30px;
}</pre>
  <pre id="fE72">// index.html
&lt;input value=&quot;text1&quot; id=&quot;text1&quot; /&gt; 
&lt;input value=&quot;text2&quot; id=&quot;text2&quot; required/&gt; 
&lt;input value=&quot;text3&quot; id=&quot;text3&quot; /&gt; 
&lt;input value=&quot;text4&quot; id=&quot;text4&quot; required/&gt; 
&lt;input value=&quot;text5&quot; id=&quot;text5&quot; /&gt;</pre>
  <p id="mSkK"></p>
  <figure id="fbbU" class="m_original">
    <img src="https://img3.teletype.in/files/a0/2e/a02e9b49-4809-40b0-bcc9-bffc0b0938da.png" width="410" />
  </figure>
  <h2 id="CKb8">:optional</h2>
  <p id="trod">Псевдокласс с обратным действием для <em>:required </em>- позволяет стилизовать необязательные к заполнению поля. В дополнение к предыдущему примеру в файле <em>style.css </em>допишем следующее:</p>
  <pre id="Hbut">input:optional { 
  border-color: blue; 
  border-radius: 5px; 
  line-height: 50px;
}</pre>
  <figure id="ltCL" class="m_original">
    <img src="https://img4.teletype.in/files/39/7c/397c1a86-a7ac-4b7e-96f5-bbda9e81fdd1.png" width="328" />
  </figure>
  <p id="2YBM">Лично я за свою карьеру разработчика встречал кейсы, когда мне бы это понадобилось, от силы пару раз, но тем не менее, знать про такую возможность должен каждый хороший разработчик.</p>
  <p id="lNl8"></p>
  <h2 id="JlJ0">:only-of-type</h2>
  <p id="bWl9">Достаточно интересный псевдокласс. Сходу даже тяжело придумать реальную ситуацию, когда бы он мог пригодиться. Данный селектор позволяет выбрать все элементы которые являются единственными потомками своего родителя. В данном случае, проще показать, чем рассказать:</p>
  <pre id="I28j">// index.html
&lt;div class=&quot;container&quot;&gt; 
  &lt;p&gt;Я - текст №1&lt;/p&gt; 
  &lt;p&gt;Я - текст №2&lt;/p&gt;
  &lt;b&gt;Я - единственный жирный текст&lt;/b&gt;
  &lt;p&gt;Я - текст №3&lt;/p&gt;
  &lt;p&gt;Я - текст №4&lt;/p&gt;
&lt;/div&gt;</pre>
  <pre id="9IXj">// style.css
p { 
  color: blue;
}
.container:only-of-type { 
  color: red;
}</pre>
  <figure id="iNy7" class="m_original">
    <img src="https://img4.teletype.in/files/7a/6f/7a6f330d-ae61-49c5-94e6-af95107e02d7.png" width="422" />
  </figure>
  <p id="ukSv">В данном случае, тэг &lt;b&gt; является единственным потомком данного типа у .container, поэтому к нему применяется правило. Стоит заметить, что если внутри контейнера мы добавим, к примеру, один единственный тэг &lt;span&gt; - то его к нему так же применится данное правило.</p>
  <p id="ANvs"></p>
  <h2 id="diWT">:target</h2>
  <p id="rXOZ">Очень классная штука, лично пользовался ей много раз. Скорее всего, ты видел, как при скроллинге на якорь на странице, к блоку, на котором установлен якорь применяется анимация лёгкой подсветки. Покажу тебе такой кейс, и, конечно, оставлю код:</p>
  <figure id="FzJl" class="m_original">
    <img src="https://img3.teletype.in/files/e7/db/e7db6fa5-98c5-4951-8ae1-0d5f87b53d75.gif" width="704" />
  </figure>
  <pre id="ONWX">// style.css

.container:target {
 animation: 1s ease changeColor;
}
@keyframes changeColor {
 from {
   background: blue; 
 } 
 to { 
   background: red; 
 }
}</pre>
  <pre id="vypL">// index.html

&lt;div class=&quot;container&quot;&gt; 
  &lt;a href=&quot;#targetElem&quot;&gt;
    &lt;button&gt; Кликни на меня &lt;/button&gt; 
  &lt;/a&gt; 
&lt;/div&gt; 
&lt;div class=&quot;container&quot;&gt;&lt;/div&gt; 
&lt;div class=&quot;container&quot;&gt;&lt;/div&gt; 
&lt;div class=&quot;container&quot; id=&quot;targetElem&quot;&gt; 
  Посмотри, как я меняю цвет, когда ты нажал на кнопку 
&lt;/div&gt; 
&lt;div class=&quot;container&quot;&gt;&lt;/div&gt;</pre>
  <p id="xxLK">В данном кейсе, селектор &quot;:target&quot; срабатывает, когда в URL появляется хэш-якорь &quot;#targetElem&quot;. Как только это происходит - запускается анимация смены цвета фона. Ты можешь поиграть со стилями, добавить более приятные цвета, плавный скролл и - вуаля - получается крутой визуальный эффект!<br />Так же, помимо визуальных эффектов, можно использовать свойство &quot;display&quot;, для того, чтобы показывать элемент только тогда, когда пользователь явно к нему перешел, к примеру, в популярном на лендингах блоке &quot;Вопрос-Ответ&quot;.</p>
  <p id="jkPT"></p>
  <h2 id="r2qs">:is()</h2>
  <p id="JQdr">И последний на сегодня псевдокласс, который позволяет оптимизировать CSS-код, сделать его более читабельным и минимизированным. Данный селектор является функцией, которая принимает как аргумент список других селекторов, и применяет правило к любому из них, который можно выбрать в данный момент. </p>
  <p id="1pvC">Применяется, в основном, для оптимизации.</p>
  <p id="VOZF">К примеру, данный код:</p>
  <pre id="VZke">.container0 p:hover {
  color: white;
}
.container1 p:hover {
  color: white;
}
.container2 p:hover {
  color: white;
}</pre>
  <p id="laLX">эквивалентен следующему:</p>
  <pre id="plsL">:is(.container0, .container1, .container2) p:hover { 
  color: white;
}</pre>
  <p id="CSS4"></p>
  <p id="vUHA">Псевдоклассы в этой статье - лишь малая часть от всех, которые существуют. Списки всех доступных псевдоклассов можно найти в открытой документации по CSS, которая так же досутпна на русском языке.<br /><br />Надеюсь, ты возьмешь на вооружение данные возможности, подпишешься и будешь с интересом читать новые статьи от меня!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@frontend_school/B_xm6TOEwxc</guid><link>https://teletype.in/@frontend_school/B_xm6TOEwxc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school</link><comments>https://teletype.in/@frontend_school/B_xm6TOEwxc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=frontend_school#comments</comments><dc:creator>frontend_school</dc:creator><title>Основы HTML | Часть 1</title><pubDate>Tue, 18 Apr 2023 22:10:08 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/07/6b/076b9746-1771-4f84-98fc-d22e28e23238.png"></media:content><category>HTML &amp;amp; CSS</category><description><![CDATA[<img src="https://img2.teletype.in/files/94/18/94181972-0018-4741-857b-4819ec1d21d0.jpeg"></img>Эта статья ориентирована на тех, кто твёрдо решил стать Frontend-разработчиком и влиться в IT-тусовку. Мы начнём с самого главного, а именно - с HTML. Данная статья является первой в цикле статей про HTML, поэтому, советую подписаться, чтобы не пропускать выходы следующий частей )]]></description><content:encoded><![CDATA[
  <p id="zPUe">Эта статья ориентирована на тех, кто твёрдо решил стать Frontend-разработчиком и влиться в IT-тусовку. Мы начнём с самого главного, а именно - с HTML. Данная статья является первой в цикле статей про HTML, поэтому, советую подписаться, чтобы не пропускать выходы следующий частей )</p>
  <p id="zfAT"></p>
  <h3 id="bvX9">HTML-программистам</h3>
  <figure id="oB2l" class="m_column">
    <img src="https://img2.teletype.in/files/94/18/94181972-0018-4741-857b-4819ec1d21d0.jpeg" width="1200" />
  </figure>
  <p id="0Evy">Для тех, кто думает, что выучив HTML вы станете крутым программистом - к сожалению, это не так. HTML - не язык программирования, однако, он играет ключевую роль во всей WEB-разработке.</p>
  <p id="gk6g">HTML - это язык разметки гипертекста. Простым языком, это определённый синтаксис, набор правил, следуя которым браузер отображает текст так, как это необходимо разработчику. В этом языке нет переменных, нет условий, нет циклов, нет абсолютно ничего общего с программированием. Однако, освоив этот язык, ты положишь начало своей карьере в мире Frontend-разработки.</p>
  <h3 id="tFuH">Тэги</h3>
  <p id="G6Hj">Единственная сущность HTML - это тэг. Тэг - отдельное правило, которое диктует браузеру как отобразить его содержимое. Тэг всегда описывается внутри треугольных скобок (&lt; &gt;) и большинство тегов необходимо закрывать (&lt;/&gt;). Начнем сразу с примеров:</p>
  <p id="ms06">1) Для отображения текста, используется параграф - тэг <em>&lt;p&gt;:</em></p>
  <pre id="gi3F">&lt;p&gt;
  Здесь будет текст
&lt;/p&gt;</pre>
  <p id="IWfT">Данная конструкция как будто говорит браузеру: &quot;Внутри меня находится обычный текст, отобрази его&quot;. </p>
  <p id="NEcE">2) Для создания блока используется блочный тэг - <em>&lt;div&gt;:</em></p>
  <pre id="44kc">&lt;div&gt; 
  &lt;p&gt;
    Здесь текст
  &lt;/p&gt;
&lt;/div&gt;</pre>
  <p id="ucHM">Блоки служат для разделения сущностей на странице. Для разработчика блок - это строительный кирпичик, из которого он будет создавать всю страницу. Он может придумать абсолютно любой подход к организации этих блоков - этот процесс называется <em>&quot;вёрстка&quot;. </em>Для наглядности, разделим сайт &quot;teletype.in&quot; на блоки:</p>
  <figure id="MBo7" class="m_column">
    <img src="https://img4.teletype.in/files/35/29/3529a733-8ecd-4382-a682-76ff3239b191.png" width="1900" />
  </figure>
  <p id="GjE0">Каждая рамка является отдельным блоком, который логически разделяет содержимое страницы.</p>
  <p id="6AqD">3) Для отрисовки изображений используется тэг <em>&lt;img&gt;</em>:</p>
  <pre id="SVAb">&lt;img src=&quot;/image.jpg&quot;&gt;</pre>
  <p id="GhkQ">И этот тэг немного отличается от тех, которые мы встречали ранее. <br />Во-первых - его не обязательно закрывать. Таких тэгов немного, но они есть, среди них - <em>&lt;img&gt;, &lt;p&gt;, &lt;br&gt;, &lt;link&gt;</em> и др. Во-вторых, у тэга появился <em>атрибут &quot;</em>src&quot;, в который мы передаем путь к файлу изображения.</p>
  <p id="HyQk">Список всех HTML-тэгов очень длинный, да и многие из них используются крайне редко. На практике, применяется, скорее всего, процентов 20 от всего многообразия тэгов, поэтому важно запомнить их, а по поводу остальных - достаточно будет просто знать про их существование.</p>
  <h3 id="q0g3">Атрибуты</h3>
  <p id="KHnX">Атрибут - это свойство тэга, иными словами - определённый набор параметров, который передает браузеру дополнительную информацию для отображения тэга. В примере выше - мы говорим браузеру с помощью атрибута &quot;src&quot;, откуда он должен взять картинку, которую мы хотим отрисовать.</p>
  <p id="64Nk">Атрибутов так же, как и тэгов - очень много. Мы не будем их затрагивать в этой статье, корректнее будет изучать их по мере появления на практике.</p>
  <p id="L4we"></p>
  <h3 id="q9i9">Пишем первую страничку</h3>
  <p id="q3A6">Итак, приведённой выше информации нам более чем достаточно, чтобы написать нашу первую HTML-страничку.</p>
  <p id="5c8m">Создавай файл с названием &quot;index.html&quot;, открывай свой любимый текстовый редактор (могу порекомендовать Visual Studio Code или Sublime, но хватит даже обычного &quot;Блокнот&quot;), мы начинаем )</p>
  <p id="rRge">Для начала, мы должны дать браузеру понять, что будем работать с HTML, поэтому, пишем следующих код:</p>
  <pre id="FyII">&lt;html&gt;
  &lt;head&gt;
  
  &lt;/head&gt;
  &lt;body&gt;

  &lt;/body&gt;
&lt;/head&gt;</pre>
  <p id="GmBu">Давай разберём, что же тут написано:<br />1) &lt;html&gt;&lt;/html&gt; - основной контейнер всей веб-страницы.<br />2) &lt;head&gt;&lt;/head&gt; - контейнер для тэгов, содержащих системную информацию. Она почти никогда не отображается напрямую на странице и служит для подключения различных вспомогательных модулей, таких как таблицы стилей или JS-скрипты.<br />3) &lt;body&gt;&lt;/body&gt; - контейнер для содержимого нашей страницы.</p>
  <p id="iTwx">Теперь, нам надо как-нибудь назвать нашу страничку и добавить на неё блок с текстом. Для этого нам нужно сделать две вещи:</p>
  <p id="XAKY">1) Внутри тэга &lt;head&gt;&lt;/head&gt;, пишем следующее:</p>
  <pre id="2GH1">&lt;title&gt;My first page&lt;/title&gt;</pre>
  <p id="51Lt">2) Внутри тэга &lt;body&gt;&lt;/body&gt; пишем:</p>
  <pre id="gC0l">&lt;div&gt;
  &lt;p&gt;
  Hello, world!
  &lt;/p&gt;
&lt;/div&gt;</pre>
  <p id="UJMx"></p>
  <p id="v2zl">Код целиком:<br /></p>
  <pre id="rL3V">&lt;html&gt;
  &lt;head&gt;
  &lt;title&gt;My first page&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;div&gt;
    &lt;p&gt;
      Hello, world!
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;/body&gt;
&lt;/head&gt;</pre>
  <p id="C53l">Вот и всё!<br />Теперь, если ты откроешь наш index.html с помощью браузера, ты увидишь, что страничка называется &quot;My first page&quot; и внутри, на белом фоне с тобой здоровается новый Frontend-разработчик !!!</p>
  <figure id="2fTN" class="m_original">
    <img src="https://img4.teletype.in/files/7e/66/7e66e65f-72e9-48a8-b81f-3c7f7cf1bff9.png" width="461" />
  </figure>
  <p id="KF12">Я надеюсь, эта статья была интересной, в следующих частях мы более подробно поговорим о подходах к вёрстке, о семантике тэгов и ещё о многих интересных мелочах.</p>
  <p id="sgGn"><strong>Подписывайся и следи за выходом статей!</strong></p>

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