Jump to content

Одностраничное приложение

Одностраничное приложение ( SPA ) — это веб-приложение или веб-сайт , который взаимодействует с пользователем путем динамического перезаписывания текущей веб-страницы новыми данными с веб-сервера вместо метода по умолчанию, когда веб-браузер загружает целые новые страницы. Цель — более быстрые переходы, которые сделают веб-сайт похожим более на нативное приложение .

В SPA обновление страницы никогда не происходит; вместо этого весь необходимый код HTML , JavaScript и CSS либо извлекается браузером при одной загрузке страницы, [1] или соответствующие ресурсы динамически загружаются и добавляются на страницу по мере необходимости, обычно в ответ на действия пользователя.

Происхождение термина «одностраничное приложение» неясно, хотя эта концепция обсуждалась по крайней мере еще в 2003 году технологическими евангелистами из Netscape. [2] Стюарт Моррис, студент-программист Кардиффского университета в Уэльсе, в апреле 2002 года написал автономный веб-сайт slashdotslash.com с теми же целями и функциями: [3] а позже в том же году Лукас Бирдо, Кевин Хэкман, Майкл Пичи и Клиффорд Йе описали реализацию одностраничного приложения в патенте США № 8,136,109. [4] Более ранние формы назывались богатыми веб-приложениями .

JavaScript можно использовать в веб-браузере для отображения пользовательского интерфейса (UI), выполнения логики приложения и взаимодействия с веб-сервером. Доступны зрелые бесплатные библиотеки, которые поддерживают создание SPA, сокращая объем кода JavaScript, который приходится писать разработчикам.

Технические подходы

[ редактировать ]

Существуют различные методы, которые позволяют браузеру сохранять одну страницу, даже если приложению требуется связь с сервером.

Хэши документов

[ редактировать ]

Авторы HTML могут использовать идентификаторы элементов для отображения или скрытия различных разделов HTML-документа. Затем, используя CSS, авторы могут использовать :target селектор псевдокласса, чтобы показывать только тот раздел страницы, к которому перешел браузер.

JavaScript-фреймворки

[ редактировать ]

Фреймворки и библиотеки JavaScript веб-браузера, такие как AngularJS , Ember.js , ExtJS , Knockout.js , Meteor.js , React , Vue.js и Svelte , приняли принципы SPA. За исключением ExtJS, все они бесплатны.

  • AngularJS — это полностью клиентская среда. Шаблоны AngularJS основаны на двунаправленной привязке данных пользовательского интерфейса . Привязка данных — это автоматический способ обновления представления при каждом изменении модели, а также обновления модели при изменении представления. HTML-шаблон компилируется в браузере. На этапе компиляции создается чистый HTML, который браузер повторно отображает в режиме реального времени. Этот шаг повторяется для последующих просмотров страниц. В традиционном серверном программировании HTML такие понятия, как контроллер и модель, взаимодействуют внутри серверного процесса для создания новых представлений HTML. В среде AngularJS состояния контроллера и модели сохраняются в клиентском браузере. Таким образом, новые страницы могут создаваться без какого-либо взаимодействия с сервером.
  • Angular 2+ — это SPA Framework, разработанный Google после AngularJS. Он на несколько шагов опережает Angular, и существует сильное сообщество разработчиков, использующих этот фреймворк. Структура обновляется дважды в год. Текущая версия — Angular 18.0.3 (по состоянию на июнь 2024 г.). ), и в эту среду часто добавляются новые функции и исправления.
  • Ember.js — это клиентская среда веб-приложений JavaScript, основанная на архитектурном шаблоне программного обеспечения модель-представление-контроллер (MVC). Он позволяет разработчикам создавать масштабируемые одностраничные приложения путем включения общих идиом и лучших практик в структуру, которая обеспечивает богатую объектную модель, декларативную двустороннюю привязку данных, вычисляемые свойства, автоматическое обновление шаблонов на базе Handlebars.js и маршрутизатор для управление состоянием приложения.
  • ExtJS также является клиентской платформой, позволяющей создавать приложения MVC. Он имеет собственную систему событий, управление окнами и макетами, управление состоянием (хранилищами) и различные компоненты пользовательского интерфейса (сетки, диалоговые окна, элементы форм и т. д.). Он имеет собственную систему классов с динамическим или статическим загрузчиком. Приложение, созданное с помощью ExtJS, может существовать либо само по себе (с состоянием в браузере), либо на сервере (например, с REST API, который используется для заполнения его внутренних хранилищ). В ExtJS встроены только возможности использования localStorage, поэтому более крупным приложениям нужен сервер для хранения состояния.
  • Knockout.js — это клиентская платформа, использующая шаблоны на основе шаблона Model-View-ViewModel .
  • Meteor.js — это полнофункциональная (клиент-серверная) среда JavaScript, разработанная исключительно для SPA. Он имеет более простую привязку данных, чем Angular, Ember или ReactJS. [5] и использует протокол распределенных данных [6] и шаблон публикации-подписки для автоматического распространения изменений данных среди клиентов в режиме реального времени, не требуя от разработчика написания какого-либо кода синхронизации. Полная реактивность стека гарантирует, что все уровни, от базы данных до шаблонов, автоматически обновляются при необходимости. Экосистемные пакеты, такие как рендеринг на стороне сервера. [7] решить проблему поисковой оптимизации.
  • React — это библиотека JavaScript для создания пользовательских интерфейсов . Его поддерживают Facebook , Instagram и сообщество отдельных разработчиков и корпораций. React использует расширение синтаксиса для JavaScript под названием JSX , которое представляет собой смесь JS и HTML (подмножество HTML). Некоторые компании используют React с Redux (библиотека JavaScript) , которая добавляет возможности управления состоянием, что (вместе с несколькими другими библиотеками) позволяет разработчикам создавать сложные приложения. [8]
  • Vue.js — это JavaScript-фреймворк для создания пользовательских интерфейсов. Разработчики Vue также предоставляют Pinia для управления состоянием.
  • Svelte — это платформа для создания пользовательских интерфейсов, которая компилирует код Svelte в JavaScript DOM (объектная модель документа), что позволяет избежать необходимости связывать платформу с клиентом и позволяет упростить синтаксис разработки приложений.

По состоянию на 2006 год наиболее известной используемой техникой был Ajax . [1] Ajax предполагает использование асинхронных запросов к серверу для данных XML или JSON , например, с помощью JavaScript XMLHttpRequest или более современных fetch() (с 2017 г.) или устаревший объект ActiveX . В отличие от декларативного подхода большинства SPA-фреймворков, при использовании Ajax веб-сайт напрямую использует JavaScript или библиотеку JavaScript, такую ​​как jQuery, для управления DOM и редактирования элементов HTML. Ajax также популяризировался такими библиотеками, как jQuery , которые обеспечивают более простой синтаксис и нормализуют поведение Ajax в разных браузерах, которые исторически имели разное поведение.

Вебсокеты

[ редактировать ]

WebSockets — это технология двунаправленной связи клиент-сервер в реальном времени, которая является частью спецификации HTML. Для общения в реальном времени их использование превосходит Ajax по производительности. [9] и простота.

События, отправленные сервером

[ редактировать ]

События, отправленные сервером (SSE), — это метод, с помощью которого серверы могут инициировать передачу данных клиентам браузера. После установления первоначального соединения поток событий остается открытым до тех пор, пока не будет закрыт клиентом. SSE отправляются по традиционному HTTP и имеют множество функций, которых нет в WebSockets по своей конструкции, таких как автоматическое переподключение, идентификаторы событий и возможность отправлять произвольные события. [10]

Плагины для браузера

[ редактировать ]

Хотя этот метод устарел, асинхронные вызовы к серверу также могут быть реализованы с использованием технологий подключаемых модулей браузера, таких как Silverlight , Flash или Java-апплеты .

Транспортировка данных (XML, JSON и Ajax)

[ редактировать ]

Запросы к серверу обычно приводят либо к необработанным данным (например, XML или JSON ), либо нового HTML к возврату . В случае, когда сервер возвращает HTML, JavaScript на клиенте обновляет частичную область DOM ( объектная модель документа ). Когда возвращаются необработанные данные, часто на стороне клиента используется процесс JavaScript XML /( XSL ) (а в случае JSON — шаблон ) для перевода необработанных данных в HTML, который затем используется для обновления частичной области DOM. .

Серверная архитектура

[ редактировать ]

Тонкая серверная архитектура

[ редактировать ]

SPA переносит логику с сервера на клиент, при этом роль веб-сервера превращается в чистый API данных или веб-сервис. Этот архитектурный сдвиг в некоторых кругах был назван «архитектурой тонкого сервера», чтобы подчеркнуть, что сложность была перенесена с сервера на клиент, с аргументом, что это в конечном итоге снижает общую сложность системы.

Толстая серверная архитектура с сохранением состояния

[ редактировать ]

Сервер сохраняет необходимое состояние в памяти клиентского состояния страницы. Таким образом, когда на сервер поступает какой-либо запрос (обычно действия пользователя), сервер отправляет соответствующий HTML и/или JavaScript с конкретными изменениями, чтобы привести клиента в новое желаемое состояние (обычно добавление/удаление/обновление части клиентский DOM). В то же время состояние на сервере обновляется. Большая часть логики выполняется на сервере, и HTML обычно также отображается на сервере. В некотором смысле сервер имитирует веб-браузер, получая события и выполняя дельта-изменения в состоянии сервера, которые автоматически передаются клиенту.

Этот подход требует больше серверной памяти и серверной обработки, но преимуществом является упрощенная модель разработки, поскольку а) приложение обычно полностью закодировано на сервере и б) данные и состояние пользовательского интерфейса на сервере совместно используются в одном и том же пространстве памяти без каких-либо ограничений. необходимость создания пользовательских мостов связи клиент/сервер.

Толстая серверная архитектура без сохранения состояния

[ редактировать ]

Это вариант подхода сервера с отслеживанием состояния. Клиентская страница отправляет данные, представляющие ее текущее состояние, на сервер, обычно через запросы Ajax. Используя эти данные, сервер может реконструировать состояние клиента той части страницы, которую необходимо изменить, и может сгенерировать необходимые данные или код (например, в формате JSON или JavaScript), который возвращается клиенту для его в новое состояние, обычно изменяя дерево DOM страницы в соответствии с действием клиента, которое послужило причиной запроса.

Этот подход требует отправки большего количества данных на сервер и может потребовать больше вычислительных ресурсов на каждый запрос для частичного или полного восстановления состояния клиентской страницы на сервере. В то же время этот подход легче масштабируется, поскольку на сервере не хранятся данные страниц для каждого клиента, и, следовательно, запросы Ajax могут отправляться на разные серверные узлы без необходимости совместного использования данных сеанса или привязки к серверу.

Запуск локально

[ редактировать ]

Некоторые SPA могут выполняться из локального файла с использованием схемы URI файла . Это дает пользователям возможность загружать SPA с сервера и запускать файл с локального устройства хранения данных независимо от подключения к серверу. Если такой SPA хочет хранить и обновлять данные, он должен использовать веб-хранилище на базе браузера . Эти приложения извлекают выгоду из достижений HTML . [11]

Проблемы с моделью SPA

[ редактировать ]

Поскольку SPA представляет собой эволюцию модели перерисовки страниц без сохранения состояния, для которой изначально были разработаны браузеры, возникли некоторые новые проблемы. Возможные решения (разной сложности, полноты и авторского контроля): [12]

  • клиентские библиотеки JavaScript
  • серверные веб-фреймворки, специализирующиеся на модели SPA [13] [14] [15]
  • эволюция браузеров и спецификации HTML, [16] разработан для модели SPA

Поисковая оптимизация

[ редактировать ]

Из-за отсутствия выполнения JavaScript сканерами некоторых популярных поисковых систем в Интернете , [17] SEO ( поисковая оптимизация ) исторически представляло проблему для общедоступных веб-сайтов, желающих принять модель SPA. [18]

В период с 2009 по 2015 год Центр веб-мастеров Google предложил, а затем рекомендовал «схему сканирования AJAX». [19] [20] использование начального восклицательного знака в идентификаторах фрагментов для страниц AJAX с отслеживанием состояния ( #!). На сайте SPA должно быть реализовано специальное поведение, позволяющее извлекать соответствующие метаданные сканеру поисковой системы. Для поисковых систем, которые не поддерживают эту схему хеширования URL-адресов , хешированные URL-адреса SPA остаются невидимыми. Ряд авторов, в том числе Джени Теннисон из W3C, сочли эти «хэш-взрывные» URI проблематичными, поскольку они делают страницы недоступными для тех, у кого JavaScript в браузере не активирован . Они также нарушают заголовки HTTP-реферера , поскольку браузерам не разрешено отправлять идентификатор фрагмента в заголовке Referer. [21] В 2015 году Google отказался от своего хеш-предложения по сканированию AJAX. [22]

Альтернативно, приложения могут отображать загрузку первой страницы на сервере и последующие обновления страницы на клиенте. Это традиционно сложно, поскольку код рендеринга может потребоваться написать на разных языках или в разных платформах на сервере и на клиенте. Использование шаблонов без логики, кросс-компиляция с одного языка на другой или использование одного и того же языка на сервере и клиенте может помочь увеличить объем кода, который можно использовать совместно.

В 2018 году Google представил динамический рендеринг как еще один вариант для сайтов, желающих предложить сканерам тяжелую версию страницы без JavaScript для целей индексирования. [23] Динамический рендеринг переключается между версией страницы, отображаемой на стороне клиента, и предварительно обработанной версией для определенных пользовательских агентов. Этот подход предполагает, что ваш веб-сервер обнаруживает сканеры (через пользовательский агент) и направляет их к средству рендеринга, откуда им затем предоставляется более простая версия HTML-контента. С 2024 года Google больше не рекомендует динамический рендеринг. [24] , предлагая вместо этого « рендеринг на стороне сервера , статический рендеринг или гидратацию ».

Поскольку совместимость с SEO не является тривиальной для SPA, стоит отметить, что SPA обычно не используются в контексте, где индексирование поисковыми системами является либо обязательным, либо желательным. Случаи использования включают приложения, которые раскрывают личные данные, скрытые за системой аутентификации . В тех случаях, когда эти приложения являются потребительскими продуктами, для целевой страницы приложения и маркетингового сайта часто используется классическая модель «перерисовки страницы», которая предоставляет достаточно метаданных, чтобы приложение отображалось как попадание в запрос поисковой системы. Блоги, форумы поддержки и другие традиционные артефакты перерисовки страниц часто располагаются вокруг SPA и могут наполнять поисковые системы соответствующими терминами.

Начиная с 2021 года и в частности с Google, совместимость с SEO для простого SPA проста и требует соблюдения всего нескольких простых условий. [25]

Один из способов увеличить объем кода, который может совместно использоваться серверами и клиентами, — использовать язык шаблонов без логики, такой как Mustache или Handlebars . Такие шаблоны могут отображаться на разных хост-языках, например Ruby на сервере и JavaScript на клиенте. Однако простой обмен шаблонами обычно требует дублирования бизнес-логики, используемой для выбора правильных шаблонов и заполнения их данными. Визуализация из шаблонов может иметь отрицательные последствия для производительности при обновлении только небольшой части страницы — например, значения введенного текста в большом шаблоне. Замена всего шаблона также может нарушить выбор пользователя или положение курсора, тогда как обновление только измененного значения может не повлиять. Чтобы избежать этих проблем, приложения могут использовать привязки данных пользовательского интерфейса или детальные манипуляции с DOM , чтобы обновлять только соответствующие части страницы, а не перерисовывать целые шаблоны. [26]

История браузера

[ редактировать ]

Поскольку SPA по определению является «одной страницей», модель нарушает дизайн браузера для навигации по истории страниц с помощью кнопок «вперед» или «назад». Это представляет собой препятствие для удобства использования, когда пользователь нажимает кнопку «Назад», ожидая предыдущего состояния экрана в SPA, но вместо этого выгружается единственная страница приложения и отображается предыдущая страница в истории браузера.

Традиционным решением для SPA было изменение идентификатора хеш-фрагмента URL-адреса браузера в соответствии с текущим состоянием экрана. Этого можно достичь с помощью JavaScript, и события истории URL-адресов будут создаваться в браузере. Пока SPA способен восстанавливать то же состояние экрана на основе информации, содержащейся в хеше URL-адреса, ожидаемое поведение кнопки «Назад» сохраняется.

Для дальнейшего решения этой проблемы в спецификации HTML введены pushState и replaceState, обеспечивающие программный доступ к фактическому URL-адресу и истории браузера.

Аналитика

[ редактировать ]

Инструменты аналитики, такие как Google Analytics, в значительной степени полагаются на загрузку целых новых страниц в браузере, инициируемую загрузкой новой страницы. СПА так не работают.

После загрузки первой страницы все последующие изменения страницы и содержимого обрабатываются внутри приложения, которое должно просто вызвать функцию для обновления пакета аналитики. Если такую ​​функцию не вызвать, браузер никогда не инициирует загрузку новой страницы, в историю браузера ничего не добавляется, а пакет аналитики не знает, кто и что делает на сайте.

Сканирование безопасности

[ редактировать ]

Подобно проблемам, с которыми сталкиваются сканеры поисковых систем, инструменты DAST могут столкнуться с трудностями при работе с этими приложениями, насыщенными JavaScript. Проблемы могут включать отсутствие гипертекстовых ссылок, проблемы с использованием памяти и ресурсы, загружаемые SPA, обычно доступные через интерфейс прикладного программирования или API. Одностраничные приложения по-прежнему подвержены тем же рискам безопасности, что и традиционные веб-страницы, такие как межсайтовый скриптинг (XSS) , но также и множеству других уникальных уязвимостей, таких как раскрытие данных через API, логика на стороне клиента и принудительное исполнение на стороне клиента. безопасности на стороне сервера. [27] Чтобы эффективно сканировать одностраничное приложение, сканер DAST должен иметь возможность надежно и воспроизводимо перемещаться по клиентскому приложению, чтобы обеспечить обнаружение всех областей приложения и перехват всех запросов, которые приложение отправляет удаленным пользователям. серверы (например, запросы API).

Добавление загрузки страниц в SPA

[ редактировать ]

В SPA можно добавлять события загрузки страницы с помощью API истории HTML; это поможет интегрировать аналитику. Трудность заключается в управлении этим и обеспечении точного отслеживания всего – это включает в себя проверку на отсутствие отсутствующих отчетов и двойных записей.Некоторые платформы предоставляют бесплатную интеграцию аналитики, подходящую большинству основных поставщиков аналитики. Разработчики могут интегрировать их в приложение и убедиться, что все работает корректно, но нет необходимости делать все с нуля. [26]

Ускорение загрузки страницы

[ редактировать ]

Существуют некоторые способы ускорения начальной загрузки SPA, такие как выборочная предварительная обработка целевой/индексной страницы SPA, кэширование и различные методы разделения кода, включая модули отложенной загрузки, когда это необходимо. Но уйти от того, что нужно скачать фреймворк, хотя бы часть кода приложения, не получится; и будет обращаться к API для данных, если страница динамическая. [26] Это компромиссный сценарий «заплати мне сейчас или заплати мне позже». Вопрос производительности и времени ожидания остается решением, которое должен принять разработчик.

Жизненный цикл страницы

[ редактировать ]

SPA полностью загружается при начальной загрузке страницы, а затем области страницы заменяются или обновляются новыми фрагментами страницы, загружаемыми с сервера по требованию. Чтобы избежать чрезмерной загрузки неиспользуемых функций, SPA часто постепенно загружает больше функций по мере необходимости: либо небольшие фрагменты страницы, либо целые модули экрана.

Таким образом, существует аналогия между «состояниями» SPA и «страницами» традиционного веб-сайта. Поскольку «навигация по состояниям» на той же странице аналогична навигации по страницам, теоретически любой страничный веб-сайт можно преобразовать в одностраничный, заменив на той же странице только измененные части.

Подход SPA в Интернете аналогичен методу представления однодокументного интерфейса (SDI), популярному в собственных настольных приложениях.

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б Фланаган, Дэвид, « JavaScript — полное руководство », 5-е изд., О'Рейли, Севастополь, Калифорния, 2006 , стр.497.
  2. ^ «Внутренний просмотр: расширение парадигмы навигации в веб-просмотре» . Архивировано из оригинала 10 августа 2003 года . Проверено 16 мая 2003 г.
  3. ^ «Slashdotslash.com: автономный веб-сайт, использующий DHTML» . Проверено 6 июля 2012 г.
  4. ^ «Патент США 8 136 109» . Проверено 12 апреля 2002 г.
  5. ^ «Метеоритное пламя» . Гитхаб . 6 мая 2022 г. Blaze — мощная библиотека для создания пользовательских интерфейсов путем написания реактивных шаблонов HTML.
  6. ^ Представляем DDP , 21 марта 2012 г.
  7. ^ «Рендеринг на стороне сервера для Meteor» . Архивировано из оригинала 20 марта 2015 года . Проверено 31 января 2015 г.
  8. ^ «Одностраничные приложения против многостраничных: плюсы, минусы, подводные камни - BLAKIT - IT Solutions» . blak-it.com . БЛАКИТ - ИТ Решения. 17 октября 2017 года . Проверено 19 октября 2017 г.
  9. ^ «Мониторинг в реальном времени с использованием AJAX и WebSockets» . www.computer.org . Проверено 1 июня 2016 г.
  10. ^ «События, отправленные сервером» . W3C. 17 июля 2013 г.
  11. ^ «Неразмещенные веб-приложения» .
  12. ^ «Манифест одностраничного интерфейса» . Проверено 25 апреля 2014 г.
  13. ^ «Дерби» . Проверено 11 декабря 2011 г.
  14. ^ «Паруса.js» . Гитхаб . Проверено 20 февраля 2013 г.
  15. ^ «Учебное пособие: одностраничный интерфейс веб-сайта с ItsNat» . Проверено 13 января 2011 г.
  16. ^ HTML5
  17. ^ «Что видит пользователь, то и сканер видит» . Проверено 6 января 2014 г. браузер может выполнять JavaScript и создавать контент «на лету», а сканер не может
  18. ^ «Обеспечение сканирования приложений Ajax» . Проверено 6 января 2014 г. Исторически сложилось так, что приложения Ajax было сложно обрабатывать поисковым системам, поскольку контент Ajax создается
  19. ^ «Предложение по обеспечению возможности сканирования AJAX» . Google. 7 октября 2009 года . Проверено 13 июля 2011 г.
  20. ^ «(Спецификации) Обеспечение возможности сканирования приложений AJAX» . Гугл Инк . Проверено 4 марта 2013 г.
  21. ^ «Хеш-URI» . Блог W3C . 12 мая 2011 года . Проверено 13 июля 2011 г.
  22. ^ «Устаревшая наша схема сканирования AJAX» . Официальный блог Центра веб-мастеров Google . Проверено 23 февраля 2017 г.
  23. ^ «Реализовать динамический рендеринг» . Центр поиска Google . 13 октября 2018 г. Проверено 7 января 2021 г.
  24. ^ «Динамический рендеринг как обходной путь» . Центр поиска Google . 18 марта 2024 г. Проверено 2 июля 2024 г.
  25. ^ «Исправьте одностраничное приложение для поиска Google» . Google Codelabs . Проверено 15 декабря 2021 г.
  26. ^ Перейти обратно: а б с Холмс, Симона (2015). Получение MEAN с помощью Mongo, Express, Angular и Node . Публикации Мэннинга. ISBN   978-1-6172-9203-3
  27. ^ «Одностраничные приложения (SPA)» . ООО "Аппчек "
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6c516b7f14703c5dc5e88aa7e15fcc12__1719933720
URL1:https://arc.ask3.ru/arc/aa/6c/12/6c516b7f14703c5dc5e88aa7e15fcc12.html
Заголовок, (Title) документа по адресу, URL1:
Single-page application - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)