Прия — на прошлой неделе вы спросили, стоит ли вашему трекеру снижения цен опрашивать страницу товара каждую минуту «на всякий случай». Прежде чем встраивать это в сборку, давайте разберём всё по порядку, потому что интервал опроса — на самом деле наименее важное решение здесь, а правильная форма с самого начала сэкономит вам цикл-другой ревью перед запуском.
Начнём с самого промпта. Вы сказали «расширение, которое следит за этой страницей и сообщает мне о снижении цены», и это неплохая идея, но пока не спецификация — билдеру нужно знать, когда он действует, а не только что делает. Ваш трекер — третья из трёх форм триггеров, и стоит знать про две другие, даже если они вам не нужны, потому что форма определяет разрешения, а разрешения определяют сроки ревью.
- Действие по клику — самый дешёвый вариант: всплывающее окно, которое запускается один раз для текущей страницы при нажатии на иконку в панели инструментов — например, «собрать все цены на этой странице в список».
- Постоянно активный content script запускается автоматически по указанному вами шаблону URL — хорошо подходит для чего-то вроде подсветки имени конкурента на каждой странице определённого домена, но шаблон нужно указывать явно, потому что «на наших внутренних сайтах» будет истолковано уже, чем вы имели в виду.
- Ваш случай — третий: фоновый наблюдатель, состояние которого сохраняется независимо от того, открыта вкладка или нет, работающий на service worker в рамках MV3 и меняющий значок иконки при изменении.
Это единственная форма, при которой билдер должен уточнить у вас деталь, и он это сделает — потому что число интервала опроса это реальный компромисс, а не формальность.
Что возвращает меня к вашему инстинкту «каждую минуту». Недавно я запрашивал почти такую же сборку — следить за страницей, менять значок при изменении цены — и первая версия опрашивала страницу каждые 60 секунд. Для одного человека, тестирующего локально, работало нормально. Умножьте это на сколько угодно реальных пользователей — и вы без нужды бомбардируете чью-то страницу товара, потому что цены на обычном ритейл-листинге меняются не чаще нескольких раз в день. Укажите в промпте билдеру «проверять каждые 30 минут». Это не компромисс, а более честный запрос — никому не нужны уведомления с частотой меньше минуты от браузерного расширения, и позже вы будете благодарны себе, что не придётся объяснять ревьюеру, почему ваше расширение стучится домой 1440 раз в день.
Что можно не обдумывать
Вы упомянули, что нервничаете из-за манифеста — не стоит, это единственное, к чему вам действительно не нужно прикасаться. Оба магазина сейчас требуют Manifest V3; MV2 больше не принимается для новых листингов, и Chrome активно сворачивает ещё работающие расширения на MV2. Главное изменение в MV3 — ваша фоновая логика работает как service worker вместо постоянной фоновой страницы: он запускается по событию, браузер может завершить его между событиями, а состояние должно храниться через chrome.storage , а не просто жить в переменной. Это ровно тот вид деталей жизненного цикла, которые билдер по умолчанию пишет правильно. Вы никогда не увидите файл манифеста, если сами не захотите его найти.
На чём стоит сосредоточить внимание — так это на разрешениях, потому что именно они определяют скорость ревью, а не код. Вашему трекеру нужен alarms для опроса и, вероятно, storage для запоминания последней цены — ему не нужен tabs или <all_urls>, и если вы попросите «возможность работать на любом сайте в будущем», потому что планируете расширить функциональность позже, билдер построит именно под это, и вы будете запрашивать широкий доступ к хостам ради функции, которой ещё не существует. Это самая пугающая строка в диалоге установки — «читать и изменять данные на всех посещаемых сайтах» — и именно она переводит автоматическое ревью в ручное. Опишите, что расширение делает сегодня. Расширите доступ позже, если он действительно понадобится.
Ещё две вещи стоят тридцати секунд внимания, прежде чем считать дело сделанным: UI всплывающего окна и иконки.
- UI всплывающего окна — стандартная страница настроек с голыми чекбоксами без иерархии — реальный источник однозвёздочных отзывов, никак не связанных с тем, работает ли расширение. У вас всего пара настроек (URL, возможно интервал), но выглядеть это должно так, будто принадлежит продукту, а не сырая форма.
- Иконки — проверьте иконку во всех четырёх размерах Chrome (16, 32, 48, 128 px, для Firefox матрица немного другая), потому что логотип, чёткий при 128 px, превращается в кляксу при 16 px — а именно этот размер он занимает большую часть дня в переполненной панели инструментов.
Прежде чем прикасаться к магазинам
Протестируйте это по-настоящему, а не только в предпросмотре чата. На выходе из сборки вы получаете полноценное загружаемое расширение, так что перейдите в chrome://extensions, включите режим разработчика, «загрузить распакованное расширение» и запустите его на реальной странице продукта, о которой идёт речь, а не на её симуляции. Я бы конкретно проверил вручную две вещи: соответствует ли запрос на разрешение при установке тому, что вы ожидали, исходя из того, что запросили, и что происходит, если content script когда-нибудь попадёт на страницу, для которой он не предназначен — падает ли он тихо или выдаёт видимую ошибку? Обе проверки занимают меньше минуты, и обе относятся к тому типу багов, который очевиден в момент, когда на него смотришь, и незаметен, если не смотришь.
Когда вы будете готовы к реальному запуску, вам предстоит пройти через собственные аккаунты разработчика в обоих магазинах — листинг ваш, платформа его за вас не ведёт. И хочу отметить: эти два магазина совсем не симметричны, чтобы вы не планировали дату запуска, исходя из того, что это так.
| Магазин | Процесс подачи |
|---|---|
| Chrome | Автозаполняет листинг — название, описание, категорию и текст обоснования разрешений, который реально читает ревью, сгенерированный на основе того, что делает код, а не написанный отдельно вручную, что важно, поскольку несовпадающие обоснования — сама по себе частая причина отказа. |
| Firefox | По сути, без вашего участия; конвейер Mozilla легче, и подача просто проходит. |
Комплект для листинга, который генерируется после завершения сборки, также создаст скриншоты, снятые с вашего реально работающего расширения (а не макета), текст листинга и ответы по практикам конфиденциальности, сверенные с реальным кодом, а не заполненные по памяти. Последнее важнее, чем кажется, для чего-то, что взаимодействует с внешней страницей: анкета Chrome о конфиденциальности задаёт прямые вопросы «да/нет» об обработке данных, и ответ «нет» на вопрос «собирает ли это данные», когда ваш трекер опрашивает и сохраняет цены, — тот вид небольшой нечестности, за который блокируют уже после запуска, а не просто отклоняют до него. Сверка ответов с тем, что реально делает код, автоматически закрывает этот разрыв за вас.
| Магазин | Типичное время ревью |
|---|---|
| Firefox | Часы, иногда меньше одного |
| Chrome | Пара дней, иногда ближе к двум в неудачную неделю |
Расширения с фоновой активностью, как у вас, чаще попадают в более медленную очередь ручного ревью, чем простое расширение с действием по клику. Ни вы, ни я не можем повлиять на эту очередь. Планируйте анонс, ориентируясь на сроки Chrome, а не Firefox, и не назначайте ничего на тот же день, когда подаёте заявку.
И последнее, раз уж я вас знаю, — вы уже думаете о том, чтобы добавить «синхронизировать список отслеживания между устройствами» и «отслеживать историю цен со временем» после запуска. Это нормально, но учтите: каждая из этих функций — новое разрешение, а новое разрешение может означать более медленное ревью, чем то, что вы только что прошли. Если вы уверены, что хотите более крупную версию, действительно лучше запросить её в промпте сразу и один раз пережить более медленное ревью, чем добавлять разрешения по одному. Если пока не уверены — выпускайте то, что есть: узко ограниченный трекер проходит ревью быстро, даёт реальное использование, а реальное использование сейчас ценнее, чем более длинный список функций, застрявший в очереди Chrome. Добавить что-то можно всегда позже; а вот вернуть этот запуск, если он застрянет в ручном ревью из-за того, что вам ещё не было нужно, — уже нельзя.



