yandex
Калькулятор ценТарифыАкцииДокументацияО насКарьера в Cloud.ruНовостиЮридические документыКонтактыРешенияРеферальная программаКейсыПартнерство с Cloud.ruБезопасностьEvolutionAdvancedEvolution StackОблако VMwareВ чем отличия платформ?БлогОбучение и сертификацияМероприятияИсследования Cloud.ruЛичный кабинетВойтиЗарегистрироватьсяОблако для мобильных и веб‑приложенийСайт в облакеАналитика данных в облакеХранение данных в облакеАналитика данных в облакеИнфраструктура для 1С в облакеМиграция IT‑инфраструктуры в облако3D-моделирование и рендерингРазработка и тестирование в облакеEvolution ComputeEvolution Managed KubernetesEvolution Object StorageEvolution Managed PostgreSQL®Evolution Bare MetalEvolution SSH KeysEvolution ImageEvolution DNSEvolution VPCEvolution Load BalancerEvolution Magic RouterEvolution DiskEvolution Container AppsEvolution Artifact RegistryEvolution Managed ArenadataDBEvolution Managed TrinoEvolution Managed SparkEvolution ML InferenceEvolution Distributed TrainEvolution ML FinetuningEvolution NotebooksEvolution TagsEvolution Task HistoryCurator Anti-DDoSCurator Anti‑DDoS+WAFUserGate: виртуальный NGFWStormWall: Anti-DDoSCloud MonitoringCloud LoggingАренда GPUDirect ConnectCDNCloud AdvisorCross-platform connectionAdvanced Object Storage ServiceAdvanced Elastic Cloud ServerAdvanced Relational Database Service for PostgreSQLAdvanced Image Management ServiceAdvanced Auto ScalingAdvanced Enterprise RouterAdvanced Cloud Backup and RecoveryAdvanced Data Warehouse ServiceAdvanced Elastic Volume ServiceAdvanced Cloud Container EngineAdvanced FunctionGraphAdvanced Container Guard ServiceAdvanced Software Repository for ContainerAdvanced Document Database Service with MongoDBAdvanced Relational Database Service for MySQLAdvanced Relational Database Service for SQL ServerAdvanced Server Migration ServiceAdvanced Data Replication ServiceAdvanced API GatewayAdvanced CodeArtsAdvanced Distributed Message Service for KafkaAdvanced Distributed Message Service for RabbitMQAdvanced DataArts InsightAdvanced CloudTableAdvanced MapReduce ServiceAdvanced Cloud Trace ServiceAdvanced Application Performance ManagementAdvanced Identity and Access ManagementAdvanced Enterprise Project Management ServiceVMware: виртуальный ЦОД с GPUVMware: виртуальный ЦОДУдаленные рабочие столы (VDI)VMware: резервное копирование виртуальных машинVMware: резервный ЦОДVMware: резервное копирование в облакоVMware: миграция виртуальных машин
Связаться с нами

Этапы разработки браузерного расширения в Chrome на React: рассматриваем на примере Cloudhood

Мы решили сделать браузерное расширение на React, чтобы обеспечить стабильную среду для разработки и параллельно тестировать доработки. По ходу того, как писалось расширение, родился этот гайд — в нем рассказываю про опыт нашей команды, делюсь наработками и ссылками на GitHub.

Расширения позволяют делать быстрее повседневные или рабочие задачи. Например:

  • блокировать всплывающую рекламу — это делает знаменитый Adblock;

  • менять внешний вид HTML-страниц;

  • перехватывать и модифицировать заголовки и тела запросов и ответов;

  • создавать инструменты для работы с библиотеками и API в разработке;

  • переводить тексты и веб-страницы на другие языки;

  • отслеживать цены и скидки в интернет-магазинах;

  • улучшать доступность сайтов для пользователей с ограниченными возможностями.

Этим возможности расширений не ограничиваются, все зависит от API браузера и вашей фантазии.

Инструкции
Иллюстрация для статьи на тему «Этапы разработки браузерного расширения в Chrome на React: рассматриваем на примере Cloudhood»
Продукты из этой статьи:
Иконка-Evolution Artifact Registry
Evolution Artifact Registry
Иконка-Evolution Container Apps
Evolution Container Apps
Иконка-Evolution Managed Kubernetes
Evolution Managed Kubernetes

Задача, которую мы хотели решить разработкой расширения

Нам расширение понадобилось, чтобы несколько команд могли параллельно работать над своими фичами. Например, разработчики пушат свои ветки и хотят их одновременно потестировать. Если доработки идут в разных репозиториях, на помощь придут микрофронтенды, которые можно тестировать параллельно, но это решит только часть задач.

Как у нас устроен CI/CD-процесс

  1. Разработчик создает новую фичу.

  2. Получившийся код пушится в GitLab.

  3. В GitLab запускаются пайплайны, проходят проверки кода.

  4. Приложение собирается и деплоится в Docker на dev-стенд.

Все готово, но возникает вопрос: как обеспечить параллельное тестирование разных версий определенного приложения на одном dev-стенде? Здесь помогает браузерное расширение Cloudhood, оно позволяет с помощью прокидывания хедеров в запросах подтягивать нужную версию приложения. В статье на Хабре рассказываем, как это у нас реализовано.

Конфигурация расширения Cloudhood

Прежде чем приступить к разработке, создадим стандартную структуру проекта. В нашем случае она выглядит так:

Дарим до 20 000 бонусов
Дарим до 20 000 бонусов
4 000 бонусов — физическим лицам, 20 000 бонусов — юридическим
Структура проекта: примерВариант структуры проекта

Для создания стандартной структуры нужно следующее:

1. Создать package.json.

2. Добавить README.md — markdown-файл, в который стоит внести детальное описание проекта.

3. Добавить конфиги eslint, Prettier и TypeScript.

4. Настроить husky и lint-staged для прекоммит-хуков, в которых будут прогоняться eslint и Prettier.

5. Добавить .gitignore — он указывает, какие файлы не добавлять в систему контроля версий. Это поможет исключить ненужные артефакты и не раздуть репозиторий.

6. Выбрать лицензию. В нашем случае подошла Apache License 2.0.

7. Подобрать структуру проекта, которая будет комфортна. Мы остановились на Feature-Sliced Design:

Как собрать конфигурацию расширения Cloudhood

8. Создать index.html и index.tsx. как входную точку в приложение — аналогично обычному приложению на React.

9. Добавить файл manifest.json. Это файл конфигурации для расширений в браузере Google Chrome. Он содержит ключевые сведения о версии, иконках, разрешениях и визуальной части расширения. Файл пригодится в дальнейшем для того, чтобы опубликовать наше расширение.

Файл manifest.jsonЧто есть в файле manifest.json

Содержание manifest.json:

1. manifest_version — версия файла конфигурации. Рекомендую использовать v3, так как Chrome постепенно отказывается от v2.

2. icon и default_icon — иконки, которые будут отображаться в браузере у всплывающего окна расширения:

Содержание manifest.json

4. default_popup — HTML-файл или попап, который будет отображаться при клике на иконку расширения. Это визуальная часть расширения.

5. icons — набор иконок разных размеров, которые будут на страницах интернет-магазина Chrome. У каждой страницы свои размеры, допустим:

Содержание manifest.json

5. host_permissions — права доступа, они определяют, на каких сайтах будет работать расширение. В нашем случае расширение работает везде.

6. permissions разрешения, или АPI Chrome, которые будут использоваться. Chrome детально проверяет пермишены ради безопасности пользователей — злоумышленники могут использовать расширения, чтобы воровать данные пользователей. Если не добавить разрешение, при установке приложения оно не будет работать. Также не стоит добавлять лишнего: нужно обосновать наличие каждого разрешения, и если добавить какое-то необоснованно, есть риск, что расширение не опубликуют.

7. background используется для работы сервис-воркера (Service Worker), который управляет фоновой работой расширения.

Готово, приложение сконфигурировано. Теперь можно писать компоненты.

Как использовать API Chrome

В этом разделе рассмотрим, как задействовать API Chrome для изменения запросов на сайте:

1. Задействуем storage.local, чтобы сохранить хедеры для запросов, когда удаляем, меняем или добавляем их. Можно сказать, что это аналог localStorage браузера.

Как использовать API Chrome

2. Сообщаем сервис-воркеру, что нужно обновить заголовки с помощью chrome.runtime.sendMessage.

Как использовать API Chrome

3. Сервис-воркер в файле background.ts слушает входящие сообщения (onMessage).

Как использовать API Chrome

4. Если сообщение получено, сервис-воркер извлекает сохраненные заголовки из хранилища и применяет обновленные заголовки ко всем запросам браузера с помощью API chrome.declarativeNetRequest.updateDynamicRules.

Как использовать API Chrome

 Я рассказал о роли background.ts, теперь опишу процесс запуска и сборки приложения.

Запуск и сборка расширения

React-приложение можно запустить несколькими способами: локально или собрав и загрузив в браузер. Локальный запуск удобнее, поскольку hot-reload работает стабильнее и упрощает отладку.

Для этого в package.json добавляется скрипт start, как видно на скриншоте. Этот скрипт конфигурирует webpack-dev-server. Детали можно посмотреть в репозитории.

Запуск и сборка расширения

Для финальной сборки выполняем скрипт build, который использует конфигурацию из webpack.config.js.

  • Собираем две точки входа — index.tsx (интерфейс расширения) и background.ts для сервис-воркера — и помещаем их в папку build:

Запуск и сборка расширения
  • Копируем manifest.json в папку build с помощью плагина copy-webpack-plugin:

Запуск и сборка расширения
  • Таким же способом копируем картинки и index.html в build:

Запуск и сборка расширения

После этого проект полностью собран и готов к загрузке в браузер.

Как добавить расширение в Chrome

1. Открыть управление расширениями в браузере Chrome. Путь: три точки в правом верхнем углу вкладки → РасширенияУправление расширениями.

2. С помощью ползунка включить режим разработчика.

Запуск и сборка расширения

3. В разделе Расширения нажать Загрузить распакованное расширение, чтобы добавить приложение.

Запуск и сборка расширения

Сборка и релиз на GitHub

Автоматизируем сборку и релиз с помощью GitHub Actions — для этого надо настроить проверку лицензий, выполнение линтеров, сборку проекта и публикацию релизов. Детально ознакомиться с нашим решением можно на GitHub

Workflow для фича-веток и main
Workflow для фича-ветокWorkflow для фича-веток и main

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

Загрузка приложения в Chrome Web Store

Создать учетную запись в консоли разработчика Google. Регистрация стоит 5 $.

На главной странице нажать + Добавить продукт и загрузить архив с расширением.

Заполнить форму описания. К ней надо приложить:

  • логотип и скриншоты расширения;

  • описание функций расширения;

  • обоснования для всех запрашиваемых разрешений (permissions) из manifest.json.

Загрузка приложения в Chrome Web Store

Чем больше разрешений запрашивает приложение, тем дольше идет проверка. Рекомендую оставить только необходимые и детально объяснить, зачем они нужны

Отправить расширение на проверку. По данным Chrome for Developers, время рассмотрения варьируется, но обычно занимает до трех дней. Обычно первый раз расширение проверяется дольше, у нас это заняло два дня. При последующих релизах проверка может занять около пары часов.

Еще в консоли разработчика доступна аналитика. Она показывает количество установок, просмотров и удалений.

Как расширение сделало нашу работу удобнее

Через Cloudhood можно задавать Request headers, которые автоматически применяются ко всем запросам браузера:

Оркестратор приложений

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

Если у вас есть предложения, как улучшить наше расширение, ждем ваши issues и pull requests на GitHub.

Продукты из этой статьи:
Иконка-Evolution Artifact Registry
Evolution Artifact Registry
Иконка-Evolution Container Apps
Evolution Container Apps
Иконка-Evolution Managed Kubernetes
Evolution Managed Kubernetes
11 августа 2025

Вам может понравиться