tgoop.com »
United States »
Frontend Interview - собеседования по Javascript / Html / Css » Telegram Web
Зачем нужен Webpack?
Webpack — это мощный инструмент сборки модулей для современных JavaScript-приложений. Он используется для упаковки и оптимизации всех ресурсов вашего приложения, таких как JavaScript, CSS, изображения и другие файлы, в один или несколько файлов, которые можно эффективно загрузить в браузер.
Основные функции
1. Сборка модулей (Module Bundling)
Webpack анализирует ваше приложение, начиная с одного или нескольких входных файлов (entry points), и строит граф зависимостей всех модулей, используемых в вашем приложении.
Он объединяет эти модули в один или несколько выходных файлов (bundles), которые можно загрузить в браузер.
2. Обработка ресурсов (Asset Management)
Webpack может обрабатывать различные типы файлов, такие как JavaScript, CSS, изображения и шрифты, используя загрузчики (loaders) и плагины (plugins).
Загрузчики позволяют вам преобразовывать файлы перед включением их в сборку. Например, загрузка CSS, преобразование ES6+ кода в ES5 с использованием Babel, оптимизация изображений и т.д.
3. Оптимизация производительности (Performance Optimization)
Webpack предлагает множество встроенных функций для оптимизации выходных файлов, включая минификацию JavaScript и CSS, разделение кода (code splitting), удаление неиспользуемого кода (tree shaking) и др.
4. Горячая перезагрузка (Hot Module Replacement)
Эта функция позволяет обновлять модули приложения в реальном времени без перезагрузки всей страницы. Это значительно ускоряет процесс разработки и тестирования.
Основные компоненты
1. Входные точки (Entry Points)
Входные точки указывают Webpack, с какого файла или файлов начать построение графа зависимостей.
2. Выходные точки (Output)
Выходные точки определяют, где Webpack должен сохранить сгенерированные файлы и как их называть.
3. Загрузчики (Loaders)
Загрузчики используются для обработки различных типов файлов. Они позволяют вам преобразовывать файлы перед их включением в сборку.
👉 @frontendInterview
Webpack — это мощный инструмент сборки модулей для современных JavaScript-приложений. Он используется для упаковки и оптимизации всех ресурсов вашего приложения, таких как JavaScript, CSS, изображения и другие файлы, в один или несколько файлов, которые можно эффективно загрузить в браузер.
Основные функции
1. Сборка модулей (Module Bundling)
Webpack анализирует ваше приложение, начиная с одного или нескольких входных файлов (entry points), и строит граф зависимостей всех модулей, используемых в вашем приложении.
Он объединяет эти модули в один или несколько выходных файлов (bundles), которые можно загрузить в браузер.
2. Обработка ресурсов (Asset Management)
Webpack может обрабатывать различные типы файлов, такие как JavaScript, CSS, изображения и шрифты, используя загрузчики (loaders) и плагины (plugins).
Загрузчики позволяют вам преобразовывать файлы перед включением их в сборку. Например, загрузка CSS, преобразование ES6+ кода в ES5 с использованием Babel, оптимизация изображений и т.д.
3. Оптимизация производительности (Performance Optimization)
Webpack предлагает множество встроенных функций для оптимизации выходных файлов, включая минификацию JavaScript и CSS, разделение кода (code splitting), удаление неиспользуемого кода (tree shaking) и др.
4. Горячая перезагрузка (Hot Module Replacement)
Эта функция позволяет обновлять модули приложения в реальном времени без перезагрузки всей страницы. Это значительно ускоряет процесс разработки и тестирования.
Основные компоненты
1. Входные точки (Entry Points)
Входные точки указывают Webpack, с какого файла или файлов начать построение графа зависимостей.
// webpack.config.js
module.exports = {
entry: './src/index.js',
};
2. Выходные точки (Output)
Выходные точки определяют, где Webpack должен сохранить сгенерированные файлы и как их называть.
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
};
3. Загрузчики (Loaders)
Загрузчики используются для обработки различных типов файлов. Они позволяют вам преобразовывать файлы перед их включением в сборку.
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
},
],
},
};
👉 @frontendInterview
Ум программиста. Как понять и осмыслить любой код
Книга освещает практические основы когнитивистики для программистов. Основные темы: осмысление и развитие чужого и собственного кода, изучение новых языков программирования, мнемонические приемы для программистов, поддержка кода в читаемом состоянии. Объяснено, как снижать когнитивную нагрузку при работе программиста, как делать код логичным и понятным для себя и коллег.
👉 @frontendInterview
Книга освещает практические основы когнитивистики для программистов. Основные темы: осмысление и развитие чужого и собственного кода, изучение новых языков программирования, мнемонические приемы для программистов, поддержка кода в читаемом состоянии. Объяснено, как снижать когнитивную нагрузку при работе программиста, как делать код логичным и понятным для себя и коллег.
👉 @frontendInterview
Count consonants
Напишите функцию, которая принимает строку англоязычного текста и возвращает количество согласных в строке.
Согласные - это все буквы, используемые для написания английского языка, за исключением гласных a, e, i, o, u.
Пример:
👉 @frontendInterview
Напишите функцию, которая принимает строку англоязычного текста и возвращает количество согласных в строке.
Согласные - это все буквы, используемые для написания английского языка, за исключением гласных a, e, i, o, u.
Пример:
consonantCount('') => 0
consonantCount('aaaaa') => 0
consonantCount('XaeiouX') => 2
👉 @frontendInterview
Зачем нужен ref в React?
Основные случаи использования ref:
- Доступ к DOM-элементам:
- Использование в сторонних библиотеках:
- Сохранение состояния вне дерева компонентов:
Примеры использования ref:
Установка фокуса на элемент:
Измерение элемента:
Доступ к методам компонента:
Важно помнить
- Прямое управление DOM может нарушить декларативный подход React, поэтому его следует использовать только тогда, когда это действительно необходимо.
- Когда необходимо использовать сторонние библиотеки, которые требуют прямого доступа к DOM-элементам.
- Состояние приложения и его логика должны по возможности управляться через состояния и пропсы React.
👉 @frontendInterview
ref
(сокращение от reference) используется для доступа к DOM-элементам или компонентам напрямую. Он позволяет взаимодействовать с элементами, которые были созданы в процессе рендеринга, предоставляя механизм для манипуляции с ними, получения их размеров, положения или вызова методов у компонент. Это особенно полезно в ситуациях, когда необходимо выполнить операции, которые не могут быть выполнены исключительно через декларативный подход React.Основные случаи использования ref:
- Доступ к DOM-элементам:
- Использование в сторонних библиотеках:
- Сохранение состояния вне дерева компонентов:
Примеры использования ref:
Установка фокуса на элемент:
import React, { useRef, useEffect } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// Установить фокус на текстовое поле
inputEl.current.focus();
};
return (
<div>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Установить фокус</button>
</div>
);
}
export default TextInputWithFocusButton;
Измерение элемента:
import React, { useRef, useEffect, useState } from 'react';
function MeasureDiv() {
const divRef = useRef(null);
const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
useEffect(() => {
if (divRef.current) {
const { width, height } = divRef.current.getBoundingClientRect();
setDimensions({ width, height });
}
}, []);
return (
<div>
<div ref={divRef} style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>
Измеряемый элемент
</div>
<p>Ширина: {dimensions.width}px, Высота: {dimensions.height}px</p>
</div>
);
}
export default MeasureDiv;
Доступ к методам компонента:
import React, { Component } from 'react';
class CustomComponent extends Component {
customMethod() {
console.log('Метод компонента вызван');
}
render() {
return <div>Custom Component</div>;
}
}
class ParentComponent extends Component {
constructor(props) {
super(props);
this.customComponentRef = React.createRef();
}
handleClick = () => {
this.customComponentRef.current.customMethod();
};
render() {
return (
<div>
<CustomComponent ref={this.customComponentRef} />
<button onClick={this.handleClick}>Вызвать метод компонента</button>
</div>
);
}
}
export default ParentComponent;
Важно помнить
- Прямое управление DOM может нарушить декларативный подход React, поэтому его следует использовать только тогда, когда это действительно необходимо.
- Когда необходимо использовать сторонние библиотеки, которые требуют прямого доступа к DOM-элементам.
- Состояние приложения и его логика должны по возможности управляться через состояния и пропсы React.
ref
следует использовать для случаев, которые не могут быть решены этим способом.👉 @frontendInterview
Дан одномерный массив. Его элементами могут быть значения разных типов, включая: undefined, null, boolean, string, number.
Массив может быть разрежённым (sparse array), то есть включать незаполненные элементы (empty slots).
Например, добавим к массиву array элемент с индексом 15:
Напишите функцию подсчёта незаполненных элементов массива.
В JavaScript массивы — это не отдельный тип данных, а просто объекты. Заполненные слоты массива хранятся под числовыми ключами, а пустые слоты вообще не существуют.
В консоли Chrome Dev Tools пустые слоты отображаются как empty, а в Node.js — empty items. Но это лишь абстрактное представление ситуации, когда поле .length массива не совпадает с ожидаемыми заполненными слотами.
Чтобы проверить наличие значения по ключу, можно использовать оператор in или метод .hasOwnProperty():
То есть, мы можем пройтись по массиву от 0 до length и проверить отсутвие текущего индекса в качестве ключа. Однако есть способ ещё проще: итератор массива и методы, поверх него, используют только существующие ключи:
Таким образом, чтобы найти количество пустых слотов, достаточно от длины массива отнять число заполненных значений:
👉 @frontendInterview
const array = [5, undefined, 0, false, '', null, true, 1]
Массив может быть разрежённым (sparse array), то есть включать незаполненные элементы (empty slots).
Например, добавим к массиву array элемент с индексом 15:
array[15] = 'новый элемент'
console.log(array)
// [ 5, undefined, 0, false, '', null, true, 1, <7 empty items>, 'новый элемент']
Напишите функцию подсчёта незаполненных элементов массива.
В JavaScript массивы — это не отдельный тип данных, а просто объекты. Заполненные слоты массива хранятся под числовыми ключами, а пустые слоты вообще не существуют.
В консоли Chrome Dev Tools пустые слоты отображаются как empty, а в Node.js — empty items. Но это лишь абстрактное представление ситуации, когда поле .length массива не совпадает с ожидаемыми заполненными слотами.
Чтобы проверить наличие значения по ключу, можно использовать оператор in или метод .hasOwnProperty():
const test = new Array(5)
test[2] = 42
2 in test // true
test.hasOwnProperty(2) // true
0 in test // false
test.hasOwnProperty(0) // false
То есть, мы можем пройтись по массиву от 0 до length и проверить отсутвие текущего индекса в качестве ключа. Однако есть способ ещё проще: итератор массива и методы, поверх него, используют только существующие ключи:
const test = new Array(5)
test[2] = 42
test.forEach((value, key) => console.log(`значение по ключу ${key}: ${value}`))
// значение по ключу 2: 42
// консоль вывела значение только один раз
Таким образом, чтобы найти количество пустых слотов, достаточно от длины массива отнять число заполненных значений:
const calcEmpty = items => items.reduce(amount => --amount, items.length)
const test = new Array(5)
test[2] = 42
calcEmpty(test) // 4
test[10] = 2
calcEmpty(test) // 9
👉 @frontendInterview
Оптимизация React-приложений
Веб-приложения сегодня требуют всё большей интерактивности, отзывчивости и быстродействия. В ответ на это команда React постоянно совершенствует инструментарий, позволяющий нам тонко управлять рендерингом и пользовательским опытом. Если вы работали только с классическими методами оптимизации вроде useMemo, useCallback, мемоизации компонент через React.memo и другими известными приёмами, то вас могут заинтересовать следующие хуки:
useTransition - устанавливает приоритеты рендеринга, разделяя обновления на критические и фоновые.
useDeferredValue - откладывает обновление тяжёлых значений, чтобы интерфейс не фризился при вводе данных.
useOptimistic - помогает реализовать оптимистичные обновления "из коробки".
В этой статье мы разберём ключевые идеи каждого из этих хуков и рассмотрим практические примеры, чтобы стало ясно, как и когда их применять.
👉 @frontendInterview
Веб-приложения сегодня требуют всё большей интерактивности, отзывчивости и быстродействия. В ответ на это команда React постоянно совершенствует инструментарий, позволяющий нам тонко управлять рендерингом и пользовательским опытом. Если вы работали только с классическими методами оптимизации вроде useMemo, useCallback, мемоизации компонент через React.memo и другими известными приёмами, то вас могут заинтересовать следующие хуки:
useTransition - устанавливает приоритеты рендеринга, разделяя обновления на критические и фоновые.
useDeferredValue - откладывает обновление тяжёлых значений, чтобы интерфейс не фризился при вводе данных.
useOptimistic - помогает реализовать оптимистичные обновления "из коробки".
В этой статье мы разберём ключевые идеи каждого из этих хуков и рассмотрим практические примеры, чтобы стало ясно, как и когда их применять.
👉 @frontendInterview
Какое свойство CSS позволяет скрыть элемент, но сохранить занимаемое им место на странице?
Anonymous Quiz
15%
display
78%
visibility
4%
position
4%
vision
This media is not supported in your browser
VIEW IN TELEGRAM
В сети поделились гениальным лайфхаком, как превратить свой месячный отпуск в двухмесячный
👉 @frontendInterview
👉 @frontendInterview
Как отрисовать компонент по условию?
В React отрисовка компонентов по условию осуществляется с помощью условных операторов JavaScript внутри JSX. Это позволяет отображать компоненты или элементы только тогда, когда выполняется определенное условие. Рассмотрим несколько способов условной отрисовки компонентов в React.
Использование тернарного оператора:
Тернарный оператор
Пример:
Логическое И (&&)
Можно использовать логический оператор
Пример:
Условный рендеринг с if...else
Для более сложной логики условного рендеринга можно использовать обычные операторы
Пример:
Условный рендеринг с помощью функций
Можно вынести условную логику рендеринга в отдельную функцию для лучшей читаемости и повторного использования.
Пример:
Использование IIFE (немедленно вызываемые функциональные выражения)
Можно использовать IIFE (Immediately Invoked Function Expression) для выполнения более сложной логики рендеринга внутри JSX.
Пример:
👉 @frontendInterview
В React отрисовка компонентов по условию осуществляется с помощью условных операторов JavaScript внутри JSX. Это позволяет отображать компоненты или элементы только тогда, когда выполняется определенное условие. Рассмотрим несколько способов условной отрисовки компонентов в React.
Использование тернарного оператора:
Тернарный оператор
? :
позволяет компактно проверять условие и отрисовывать один из двух компонентов.Пример:
import React from 'react';
const MyComponent = ({ isLoggedIn }) => {
return (
<div>
{isLoggedIn ? <p>Welcome back!</p> : <p>Please log in.</p>}
</div>
);
};
export default MyComponent;
Логическое И (&&)
Можно использовать логический оператор
&&
для отрисовки компонента только тогда, когда условие истинно.Пример:
import React from 'react';
const MyComponent = ({ showDetails }) => {
return (
<div>
<h1>Item</h1>
{showDetails && <p>Here are the details...</p>}
</div>
);
};
export default MyComponent;
Условный рендеринг с if...else
Для более сложной логики условного рендеринга можно использовать обычные операторы
if...else
внутри функции компонента.Пример:
import React from 'react';
const MyComponent = ({ status }) => {
if (status === 'loading') {
return <p>Click Me Load More...</p>;
} else if (status === 'error') {
return <p>Error occurred!</p>;
} else if (status === 'success') {
return <p>Data loaded successfully!</p>;
} else {
return null; // Возвращаем null, чтобы не отрисовывать ничего
}
};
export default MyComponent;
Условный рендеринг с помощью функций
Можно вынести условную логику рендеринга в отдельную функцию для лучшей читаемости и повторного использования.
Пример:
import React from 'react';
const renderContent = (status) => {
switch (status) {
case 'loading':
return <p>Click Me Load More...</p>;
case 'error':
return <p>Error occurred!</p>;
case 'success':
return <p>Data loaded successfully!</p>;
default:
return null;
}
};
const MyComponent = ({ status }) => {
return (
<div>
{renderContent(status)}
</div>
);
};
export default MyComponent;
Использование IIFE (немедленно вызываемые функциональные выражения)
Можно использовать IIFE (Immediately Invoked Function Expression) для выполнения более сложной логики рендеринга внутри JSX.
Пример:
import React from 'react';
const MyComponent = ({ isLoggedIn, userName }) => {
return (
<div>
{(() => {
if (isLoggedIn) {
return <p>Welcome back, {userName}!</p>;
} else {
return <p>Please log in.</p>;
}
})()}
</div>
);
};
export default MyComponent;
👉 @frontendInterview
Production Ready GraphQL
Данная книга содержит полное описании того, что входит в создание GraphQL API: дизайн, архитектура, реализация и даже документации.
Примеры в книге не зависят от языка. Вместо этого они фокусируются на концепциях и шаблонах, которые реализуются независимо от того, как вы создаете сервер GraphQL.
👉 @frontendInterview
Данная книга содержит полное описании того, что входит в создание GraphQL API: дизайн, архитектура, реализация и даже документации.
Примеры в книге не зависят от языка. Вместо этого они фокусируются на концепциях и шаблонах, которые реализуются независимо от того, как вы создаете сервер GraphQL.
👉 @frontendInterview
Break camelCase
Создайте функцию, которая разобьет строку в camelCase на несколько слов, разделенных пробелом
Пример
👉 @frontendInterview
Создайте функцию, которая разобьет строку в camelCase на несколько слов, разделенных пробелом
Пример
"camelCasing" => "camel Casing"
"identifier" => "identifier"
"" => ""
👉 @frontendInterview
Какие методы http запросов знаешь ?
HTTP (HyperText Transfer Protocol) поддерживает множество методов запросов, каждый из которых предназначен для выполнения определенных действий на сервере. Вот основные методы HTTP-запросов, которые широко используются:
GET
Запрашивает данные с сервера.
- Не изменяет состояние сервера (идемпотентный).
- Параметры запроса передаются в URL.
- Кэшируется.
- Можно сохранить в закладках браузера.
POST
Отправляет данные на сервер для создания ресурса или выполнения действия.
- Изменяет состояние сервера.
- Данные передаются в теле запроса.
- Не кэшируется по умолчанию.
PUT
Отправляет данные на сервер для создания или замены ресурса.
- Идемпотентный.
- Данные передаются в теле запроса.
DELETE
Удаляет ресурс на сервере.
- Идемпотентный.
PATCH
Частично обновляет ресурс на сервере.
- Не является идемпотентным, хотя в некоторых случаях может быть.
- Данные передаются в теле запроса.
HEAD
Запрашивает только заголовки ресурса, без тела.
- Идемпотентный.
- Используется для проверки наличия ресурса, размера, даты последнего изменения и т.д.
OPTIONS
Запрашивает поддерживаемые сервером методы для указанного ресурса.
- Идемпотентный.
- Используется для CORS-запросов, чтобы определить разрешенные методы и заголовки.
CONNECT
Устанавливает туннель к серверу, обычно используется для прокси-серверов.
- Не используется в обычных RESTful API.
👉 @frontendInterview
HTTP (HyperText Transfer Protocol) поддерживает множество методов запросов, каждый из которых предназначен для выполнения определенных действий на сервере. Вот основные методы HTTP-запросов, которые широко используются:
GET
Запрашивает данные с сервера.
- Не изменяет состояние сервера (идемпотентный).
- Параметры запроса передаются в URL.
- Кэшируется.
- Можно сохранить в закладках браузера.
GET /api/users?id=123 HTTP/1.1
Host: www.example.com
POST
Отправляет данные на сервер для создания ресурса или выполнения действия.
- Изменяет состояние сервера.
- Данные передаются в теле запроса.
- Не кэшируется по умолчанию.
POST /api/users HTTP/1.1
Host: www.example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}
PUT
Отправляет данные на сервер для создания или замены ресурса.
- Идемпотентный.
- Данные передаются в теле запроса.
PUT /api/users/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}
DELETE
Удаляет ресурс на сервере.
- Идемпотентный.
DELETE /api/users/123 HTTP/1.1
Host: www.example.com
PATCH
Частично обновляет ресурс на сервере.
- Не является идемпотентным, хотя в некоторых случаях может быть.
- Данные передаются в теле запроса.
PATCH /api/users/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json
{
"email": "[email protected]"
}
HEAD
Запрашивает только заголовки ресурса, без тела.
- Идемпотентный.
- Используется для проверки наличия ресурса, размера, даты последнего изменения и т.д.
HEAD /api/users/123 HTTP/1.1
Host: www.example.com
OPTIONS
Запрашивает поддерживаемые сервером методы для указанного ресурса.
- Идемпотентный.
- Используется для CORS-запросов, чтобы определить разрешенные методы и заголовки.
OPTIONS /api/users HTTP/1.1
Host: www.example.com
CONNECT
Устанавливает туннель к серверу, обычно используется для прокси-серверов.
- Не используется в обычных RESTful API.
CONNECT www.example.com:443 HTTP/1.1
Host: www.example.com
👉 @frontendInterview
Как задать начальные стили для элемента в момент его появления на странице?
При вёрстке сайтов бывает нужно привлечь внимание пользователя к появлению элемента на странице. Например, плавно сменить цвет фона блока в момент загрузки сайта. Или сделать открытие диалога плавным и аккуратным. То есть необходимо осуществить переход из начального состояния элемента в основное. При этом сделать это нужно один раз и именно в момент появления элемента на экране.
Чтобы сообщить браузеру, какие должны быть стили у элемента в его начальном состоянии, используется директива @starting-style.
Пример
В момент загрузки страницы .promo-block будет не виден, так как в начальном состоянии opacity равен нулю. После загрузки страницы применятся стили из основного состояния: opacity будет равен единице и .promo-block отобразится на экране.
👉 @frontendInterview
При вёрстке сайтов бывает нужно привлечь внимание пользователя к появлению элемента на странице. Например, плавно сменить цвет фона блока в момент загрузки сайта. Или сделать открытие диалога плавным и аккуратным. То есть необходимо осуществить переход из начального состояния элемента в основное. При этом сделать это нужно один раз и именно в момент появления элемента на экране.
Чтобы сообщить браузеру, какие должны быть стили у элемента в его начальном состоянии, используется директива @starting-style.
Пример
.promo-block {
transition: opacity 0.4s ease-in;
opacity: 1;
}
@starting-style {
.promo-block {
opacity: 0;
}
}
В момент загрузки страницы .promo-block будет не виден, так как в начальном состоянии opacity равен нулю. После загрузки страницы применятся стили из основного состояния: opacity будет равен единице и .promo-block отобразится на экране.
👉 @frontendInterview
Бесплатный практический вебинар: Веб-разработчик: с нуля до мини-игры за 2 часа.
⏰ Когда: 30 января в 19:00 по мск.
Погрузитесь в решение реальной задачи и напишите небольшую игру на HTML, JS и CSS, которая работает прямо в браузере 🎮
Расскажем, что ждут работодатели от джунов, какие есть грейды во фронтенд-разработке и на какую зарплату рассчитывать в перспективе.
Какие JS фреймворки учить: Vue, React, а может, Angular?
Задайте вопросы опытному спикеру, сделайте первый шаг в направлении новой профессии.
🎁 Всем, кто зарегистрировался - гайд «Как заговорить на сленге IT-специалистов», а каждому участнику - карта компетенций начинающего Frontend-разработчика и гайд «Как опубликовать страницу в интернете при помощи GitHub Pages»
⏰ Когда: 30 января в 19:00 по мск.
Погрузитесь в решение реальной задачи и напишите небольшую игру на HTML, JS и CSS, которая работает прямо в браузере 🎮
Расскажем, что ждут работодатели от джунов, какие есть грейды во фронтенд-разработке и на какую зарплату рассчитывать в перспективе.
Какие JS фреймворки учить: Vue, React, а может, Angular?
Задайте вопросы опытному спикеру, сделайте первый шаг в направлении новой профессии.
🎁 Всем, кто зарегистрировался - гайд «Как заговорить на сленге IT-специалистов», а каждому участнику - карта компетенций начинающего Frontend-разработчика и гайд «Как опубликовать страницу в интернете при помощи GitHub Pages»