Автор оригинала: Ankur Anand.
Название может привести вас к тому, что этот пост является еще одним рентгеновским сообщением о недостаточном положении «Одиночная страница приложения». Подробнее о проливе немного света на Перспектива производительности, чтобы помнить при разработке спа. Особенно если Ваш SPA потребляет API из разных доменных услуг.
Если вы проектируете спа-центр, который потребляет API из того же домена спа, то отличный. Вы должны пропустить эту статью, если ваш SPA тянет только из API в том же домене.
Большинство SPA включают в себя «микросервисы». «Они потребляют разные конечные точки обслуживания разных доменов в SPA. Это добавляет устойчивость, отказоустойчивость и улучшенный пользовательский опыт нашего продукта. Несколько доменных запросов становятся неизбежными до тех пор, пока мы не присоединяемся к тому же приложению домена API Gateway – узор микровидсов для нашего спа.
Давайте представим, что у нас есть Получить API /Пользователи/Отчет/: ID подается из домена api.example.com Отказ Наш спа подается из spa.example.com Отказ : id означает его значение, которое может измениться на каждый запрос.
Можете ли вы угадать проблему с вышеуказанным дизайном API в отношении Рост (Распределение ресурсов по перекрестному происхождению) и его влияние на производительность нашего SPA?
Вот краткое внедрение CORS из MDN :
CORS все хорошо, пока это Простой запрос это не запускает CORS прелест. Но чаще всего мы делаем запросы, которые не являются « простой запрос ».
Это связано с тем, что нам нужно отправить заголовок, который не является CORS-SafeListed-request-Header Отказ Пример заголовка Авторизация, X-Correlation-ID Отказ Часто наше Content-Type Значение заголовка это Приложение/JSON. . Это не допустимое значение для Content-Type Заголовок для CORS-SafeListed-request-Header Отказ
Если наше api.example.com Сервер принимает Content-Type Приложение/JSON , наш спа-домен spa.example.com Сначала отправлю HTTP-запрос по Варианты метод. Это отправлено на ресурс /Пользователи/Отчет/12345 На другой области api.example.com Отказ Чтобы определить, будет ли реальный запрос безопасен для отправки, опция отправляется предварительно. Запросы на перекрестные сайта всегда предварительно предварительно довольны, поскольку они могут иметь последствия для пользовательских данных.
Это работа api.example.com сервер, чтобы позволить другому домену spa.example.com Знать, что это безопасно отправлять данные. Возможно, вы сделали что-то похожее на это для CORS в вашем приложении.
Однажды api.example.com Сервер отправляет правильный ответ из метода «Опции» в другой домен spa.example.com Тогда только фактические данные с запросом, которые вы пытались сделать.
Вы можете сказать да. Мы можем использовать Заголовок доступа-контроля-максимального возраста Чтобы кэшировать результаты запроса прелета. В следующий раз мы доступаем к ресурсу api.example.com/users/report/12345 от spa.example.com Нет запроса прелета.
Да, это правда, но помнить титул – страшная стоимость исполнения CORS Запросы на одностраничное приложение (SPA). Это происходит от API, который мы употребляем, и то, как он был разработан. В нашем примере мы разработали наш API /Пользователи/Отчет/: ID , где : ID означает его значение, которое может измениться.
Так что в нашем случае доступа к ресурсу api.example.com/users/report/12345 и api.example.com/users/Report/123987 , он будет вызвать четыре запроса от нашего SPA в общей сложности.
Если у вас есть медленная сеть, это может быть огромная неудача. Особенно, когда запрос на опции занимает 2 секунды, чтобы ответить, а еще 2 для данных.
Теперь представьте себе вашу SPA-приложение, делая миллионы таких запросов для разных доменов. Это будет ужасное влияние на производительность вашего SPA. Вы удваиваете задержку каждого запроса.
Нет никакого решения или технологии, которая полностью хороша или плохой. Зная его недостаток и то, что нужно, чтобы он работал, – это то, что имеет значение. Это то, что отличает ваше приложение от других.
Оригинал: “https://www.freecodecamp.org/news/the-terrible-performance-cost-of-cors-api-on-the-single-page-application-spa-6fcf71e50147/”