Собеседование фронтенд разработчика. ТОП вопросов по HTTP и CORS
2 года назад·3 мин. на чтение
На собеседованиях на позицию фронтенд разработчика часто задают базовые вопросы, связанные с работой браузера и HTTP протокола.
В этой статье разберем одни из самых популярных вопросов, которые вероятнее всего спросят на frontend интервью.
Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом.
HTTP/2 добавил мультиплексирование сообщений через простое соединение, помогающее держать соединение теплым и более эффективным.
В этой статье рассмотрели топ вопросов на позицию frontend developer, связанных с HTTP протоколом и CORS.
Что такое CORS?
CORS (Cross-Origin Resource Sharing) - механизм, который дает возможность клиенту (агенту) получать разрешение на доступ к ресурсам сервера на домене, который отличается о того, который использует сайт. Механизм использует дополнительные HTTP-заголовки. Если источник документа, с которого происходит запрос на ресурс, отличается от ресурса протоколом, доменом или портом, то считается, что агент делает запрос с другого источника. Т.е. происходит cross-origin HTTP request.Для чего нужен CORS?
Браузеры ограничивают запросы с другого источника (cross-origin запросы) в целях безопасности. Такие запросы могут совершать, например, сторонние скрипты, подключенные на сайт. Такие API как Fetch или XMLHttpRequest следуют политике одного источника (same-origin policy). Таким образом, при использовании web-приложением этого API, существует ограничение: домен запрошенных HTTP-ресурсов и домен web-приложения должен быть одним и тем же. Для снятия этого ограничения нужно использовать CORS-заголовки. Следующие вопросы связаны с работой HTTP протокола. Ответы на эти вопросы важно знать. Крупные компании часто задают эти вопросы на собеседованиях на позицию фронтенд разработчика.Какие существуют HTTP методы?
Эти методы указывают действие, которое должно быть выполнено для указанного ресурса. Также эти методы иногда называют HTTP глаголами. Эти методы отличаются семантикой.Метод | Описание |
---|---|
GET | извлечение (чтение) данных ресурса |
POST | для отправки данных к указанному ресурсу; для изменения состояния и/или побочные эффекты |
PUT | для замены данных ресурса данными из запроса |
PATCH | для частичного изменения ресурса |
DELETE | для удаления ресурса |
HEAD | запрос ресурса, но в отличие от GET, без тела ответа |
CONNECT | устанавливает туннель к серверу |
OPTIONS | для описания параметров соединения с указанным ресурсом |
TRACE | для вызова тестового сообщения |
Из чего состоит HTTP-запрос?
- HTTP-метод - глагол (например,
GET
,POST
) или существительное (например,OPTIONS
,HEAD
), которое определяет действие, которое хочет выполнить клиент. - Путь к ресурсу:
- протокол (
http://
) - домен (
example.com
) - TCP порт (
80
)
- протокол (
- Версия HTTP-протокола.
- Заголовки (опционально). Предоставляют дополнительную информацию для сервера.
- Тело запроса (опционально). Некоторые методы (например,
POST
), могут содержать данные об отправляемом ресурсе.
Что такое HTTP cookie?
HTTP cookie (куки) - это небольшой фрагмент данных, который отправляется сервером в браузер пользователя. Далее браузер может сохранить cookie и отправлять обратно серверу с каждым запросом. Такой механизм позволяет узнать, с одного и того же браузера были отправлены запросы или нет. Это используется, например, для аутентификации пользователя. Сам протокол HTTP не хранит состояние, механизм cookie позволяет добавить в него состояние.Для чего используют HTTP cookie?
Cookie используются, главным образом, для:- Управления сеансом (логины, корзины для виртуальных покупок)
- Персонализации (запоминать предпочтения пользователя)
- Мониторинга (отслеживания поведения пользователя)
Set-Cookie
. Cookie обычно запоминаются браузером и отправляются в HTTP заголовке с каждым последующим запросом к серверу, который сохранил эти cookie
.
Cookie можно настраивать, задав срок действия или срок его существования. Также можно указать ограничения на путь и домен. Если флаг HttpOnly
не установлен, то доступ к существующим cookies можно получить через JavaScript.
Что такое HTTP?
Протокол передачи гипертекста (Hypertext Transfer Protocol, HTTP). Это протокол прикладного уровня для передачи гипертекстовых документов, таких как HTML. Он создан для связи между веб-браузерами и веб-серверами. Протокол следует классической клиент-серверной модели. Клиент открывает соединение для создания запроса, а затем ждет ответа. HTTP - это протокол без сохранения состояния, т.е. сервер не сохраняет никаких данных (состояние) между двумя парами "запрос-ответ". Несмотря на то, что HTTP основан на TCP/IP, он также может использовать любой другой протокол транспортного уровня с гарантированной доставкой.Особенности протокола HTTP
Простота. HTTP удобен и прост для восприятия человеком. HTTP сообщения легко читать и тестировать. Расширяемость. За счет HTTP-заголовков можно легко его расширить, добавив новую функциональность на основе соглашений между клиентом и сервером. Нет состояния, но есть сессия. Между разными запросами не существует связи. Однако, cookie позволяют использовать сессии для идентификации пользователей. Соединение управляется на транспортном уровне. Протокол требует надёжность и отсутствие потерянных сообщений. Подходящим транспортным протоколом является TCP.Отличия HTTP/1.0, HTTP/1.1, HTTP/2
HTTP/1.0 открывал TCP-соединение для каждого обмена запросом/ответом. Открытие соединения требует нескольких обменов сообщениями, и потому это медленный процесс. HTTP/1.1 предоставил конвейерную обработку (которую оказалось трудно реализовать) и устойчивые соединения: лежащее в основе TCP соединение можно частично контролировать через заголовок Connection.Импорт и экспорт React компонентов
2 года назад·4 мин. на чтение
Как импортировать и экспортировать React компоненты
Содержание туториала по React
Магия компонентов заключается в возможности их повторного использования: вы можете создавать компоненты, состоящие из других компонентов. Но по мере того, как вы вкладываете все больше и больше компонентов, часто имеет смысл начать разбивать их на разные файлы. Это позволяет легко сканировать файлы и повторно использовать компоненты в большем количестве мест.
Здесь и
Когда вы пишете импорт по умолчанию, вы можете указать любое имя после импорта. Например, вместо этого вы можете написать
Затем импортируйте
Файл корневого компонента
В части "Пишем первый React компонент" мы создали компонентProfile
и компонент Gallery
, который его отображает:
В настоящее время они находятся в корневом файле компонента, который в этом примере называетсяfunction Profile() { return <img src="https://example.com/userpic.jpg" alt="User Name" />; } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
App.js
. В Create React App ваше приложение находится в src/App.js
. Однако в зависимости от вашей настройки ваш корневой компонент может находиться в другом файле. Если вы используете фреймворк с файловой маршрутизацией, например Next.js, ваш корневой компонент будет разным для каждой страницы.
Экспорт и импорт компонента
Что, если в будущем вы захотите изменить посадочную страницу и разместить там список научных книг? Или разместить все профили в другом месте? Имеет смысл переместитьGallery
и Profile
из корневого файла компонента. Это сделает их более модульными и позволит повторно использовать их в других файлах. Вы можете переместить компонент в три шага:
- Создайте новый файл JS, чтобы поместить в него компоненты.
- Экспортируйте компонент из этого файла (используя экспорт по умолчанию или именованный экспорт).
- Импортируйте его в файл, в котором вы будете использовать компонент (используя соответствующую технику для импорта по умолчанию или именованного экспорта).
Profile
, и Gallery
были перемещены из App.js
в новый файл с именем Gallery.js
. Теперь вы можете изменить App.js
, чтобы импортировать галерею из Gallery.js
:
// App.js import Gallery from './Gallery.js'; export default function App() { return <Gallery />; }
Обратите внимание, как этот пример теперь разбит на два файла компонентов:// Gallery.js function Profile() { return <img src="https://example.com/userpic.jpg" alt="User Name" />; } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
Gallery.js
:- Определяет компонент профиля, который используется только в том же файле и не экспортируется.
- Экспортирует компонент
Gallery
в качестве экспорта по умолчанию.
App.js
:- Импортирует
Gallery
по умолчанию изGallery.js
. - Экспортирует корневой компонент
App
в качестве экспорта по умолчанию.
- Импортирует
.js
, например:
Иimport Gallery from './Gallery';
'./Gallery.js'
, и './Gallery'
будут работать с React, хотя первое ближе к тому, как работают нативные модули ES.
Экспорт по умолчанию и именованный экспорт
Существует два основных способа экспорта значений с помощью JavaScript: экспорт по умолчанию и именованный экспорт. До сих пор в наших примерах использовался только экспорт по умолчанию. Но вы можете использовать один или оба из них в одном файле. Файл может иметь не более одного экспорта по умолчанию, но он может иметь сколько угодно именованных экспортов. То, как вы экспортируете свой компонент, определяет, как вы должны его импортировать. Вы получите сообщение об ошибке, если попытаетесь импортировать экспорт по умолчанию так же, как и именованный экспорт. Эта таблица поможет вам:Синтаксис | Ээкспортирование | Импортрирование |
---|---|---|
по умолчанию | export default function Button() {} | import Button from './button.js'; |
именованный | export function Button() {} | import { Button } from './button.js'; |
import Banana from './button.js'
, и он все равно предоставит вам тот же экспорт по умолчанию. Напротив, при именованном импорте имя должно совпадать с обеих сторон. Вот почему они называются именованным импортом.
Люди часто используют экспорт по умолчанию, если файл экспортирует только один компонент, и используют именованный экспорт, если он экспортирует несколько компонентов и значений. Независимо от того, какой стиль вы предпочитаете, всегда давайте осмысленные имена функциям компонентов и файлам, которые их содержат. Компоненты без имен, такие как export default() => {}
, не рекомендуются, поскольку они усложняют отладку.
Экспорт и импорт нескольких компонентов из одного файла
Что, если вы хотите показать только одинProfile
вместо галереи? Вы также можете экспортировать компонент Profile
. Но в Gallery.js
уже есть экспорт по умолчанию, и у вас не может быть двух экспортов по умолчанию. Вы можете создать новый файл с экспортом по умолчанию или добавить именованный экспорт для Profile
. Файл может иметь только один экспорт по умолчанию, но он может иметь множество именованных экспортов.
Чтобы уменьшить возможную путаницу между экспортом по умолчанию и именованным экспортом, некоторые команды предпочитают придерживаться только одного стиля (по умолчанию или именованного) или избегать их смешивания в одном файле. Это вопрос предпочтений. Делайте то, что лучше всего работает для вас.
Сначала экспортируйте Profile
из Gallery.js
, используя именованный экспорт (без ключевого слова default
):
export function Profile() { // ... }
Profile
из Gallery.js
в App.js
, используя именованный импорт (с фигурными скобками):
Наконец, отобразитеimport { Profile } from './Gallery.js';
<Profile />
из компонента App
:
Теперьexport default function App() { return <Profile />; }
Gallery.js
содержит два экспорта: экспорт Gallery
по умолчанию и именованный экспорт Profile
. App.js
импортирует их оба.
// App.js import Gallery from './Gallery.js'; import { Profile } from './Gallery.js'; export default function App() { return <Profile />; }
Теперь вы используете сочетание экспорта по умолчанию и именованного экспорта:// Gallery.js export function Profile() { return <img src="https://example.com/userpic.jpg" alt="User Name" />; } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
-
Gallery.js
:- Экспортирует компонент
Profile
как именованный экспорт с именемProfile
. - Экспортирует компонент
Gallery
в качестве экспорта по умолчанию.
- Экспортирует компонент
-
App.js
:- Импортирует
Profile
как именованный импорт с именемProfile
изGallery.js
. - Импортирует
Gallery
как импорт по умолчанию изGallery.js
. - Экспортирует корневой компонент
App
в качестве экспорта по умолчанию.
- Импортирует
Резюме
На этой странице вы узнали:- Что такое файл корневого компонента
- Как импортировать и экспортировать компонент
- Когда и как использовать именованный импорт и экспорт; и импорт и экспорт по умолчанию
- Как экспортировать несколько компонентов из одного файла