Публикация расширения в Firefox Add-ons (AMO)
Firefox Add-ons (addons.mozilla.org, AMO) — официальный магазин расширений Mozilla. В отличие от Chrome Web Store, AMO предоставляет детальные инструменты для разработчиков и поддерживает более гибкие политики.
Создание аккаунта разработчика
Регистрация на addons.mozilla.org/developers через Mozilla аккаунт. Взнос не требуется — публикация бесплатна.
Отличия Firefox от Chrome
Firefox поддерживает оба манифеста — MV2 и MV3, но с особенностями:
{
"manifest_version": 2,
"browser_specific_settings": {
"gecko": {
"id": "[email protected]",
"strict_min_version": "91.0"
}
}
}
Поле browser_specific_settings.gecko.id обязательно для Firefox. Без него расширение не сможет получать обновления корректно. ID в формате email или GUID: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
Кросс-браузерная совместимость
Большинство Chrome-расширений работают в Firefox с минимальными правками. Главные отличия:
// Полифил для обоих браузеров
const browser = typeof globalThis.browser !== 'undefined'
? globalThis.browser
: globalThis.chrome;
// Или используйте webextension-polyfill от Mozilla
// npm install webextension-polyfill
import browser from 'webextension-polyfill';
webextension-polyfill оборачивает Chrome callbacks в промисы и нормализует различия API.
Подготовка пакета
AMO требует исходный код для расширений, использующих минификацию или бандлинг:
# Сборка расширения
npm run build
# ZIP с финальными файлами
cd dist/
zip -r ../firefox-extension-1.0.0.zip .
# Отдельный ZIP с исходниками (обязателен если используете bundler)
cd ../
zip -r source-code-1.0.0.zip src/ package.json webpack.config.js \
--exclude "node_modules/*" \
--exclude ".git/*"
Без исходников ревью может быть отклонено с запросом их предоставить.
Загрузка через web интерфейс
В Developer Hub → «Submit a New Add-on»:
- Distribution method: AMO (публичный) или Self-distribution (подписанный XPI без листинга)
- Upload your add-on: загружаете ZIP
- Upload source code: если используете bundler
- Describe your add-on: название, описание, категория
Self-distribution и подписание
Любое расширение в Firefox должно быть подписано Mozilla, даже если вы не планируете публиковать его в AMO. Для корпоративного или личного использования:
# Установка web-ext
npm install -g web-ext
# Подписание через AMO API (файл получит подпись Mozilla)
web-ext sign \
--source-dir ./dist \
--artifacts-dir ./signed \
--api-key $AMO_API_KEY \
--api-secret $AMO_API_SECRET
Подписанный .xpi можно установить через about:addons или распространять самостоятельно.
AMO API для автоматизации
# Загрузка новой версии через API
curl -X POST \
"https://addons.mozilla.org/api/v5/addons/addon/{addon-id}/versions/" \
-H "Authorization: JWT $AMO_JWT_TOKEN" \
-F "[email protected]" \
-F "[email protected]"
JWT генерируется из API credentials (api_key + api_secret):
import jwt from 'jsonwebtoken';
const token = jwt.sign(
{ iss: API_KEY, jti: Math.random().toString(), iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 60 },
API_SECRET
);
Полный SDK: web-ext sign делает это автоматически.
Процесс ревью на AMO
AMO имеет два уровня ревью:
Автоматизированный (Listed — Recommended не запрашивается): большинство расширений проходят автоматическую проверку на вредоносный код и получают статус «Listed» в течение нескольких часов.
Ручное ревью (Recommended badge): команда AMO проверяет код вручную. Расширение получает значок «Recommended» — больше доверия пользователей, появление в editorial picks. Ревью занимает от нескольких дней до нескольких недель.
Основные причины отклонения: удалённо загружаемый код, скрытая функциональность, избыточные разрешения, отсутствие исходников для обфусцированного кода.
Локализация листинга
AMO поддерживает полную локализацию через веб-интерфейс или файлы _locales/ в расширении:
_locales/
en_US/
messages.json
ru/
messages.json
de/
messages.json
// _locales/ru/messages.json
{
"extensionName": { "message": "Название расширения" },
"extensionDescription": { "message": "Описание расширения для пользователей" }
}
// manifest.json
{
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__"
}
Локализованные описания на AMO добавляются отдельно в Developer Hub — они не берутся автоматически из _locales.







