Короткий ответ
WebExtensions API, manifest differences, conditional build, testing and store publication. Разбираем практический порядок работ, риски, стоимость и то, как принять результат без новых проблем.
Ниже — конкретные проверки, команды, таблицы и контроль результата. Выполняйте изменения только после резервной копии, если действие затрагивает рабочую систему.
Что обычно переиспользуется
| Часть | Chrome/Edge | Firefox |
|---|---|---|
| WebExtensions APIs | много общего | много общего |
| Content scripts | обычно общий код | обычно общий код |
| Manifest | нужны различия | нужны различия |
| Namespace | chrome | browser/chrome compatibility |
| Store package | отдельный | отдельный |
| Некоторые APIs | Chromium-specific | аналоги/ограничения |
Минимальный wrapper API
const api = globalThis.browser ?? globalThis.chrome;
api.runtime.onMessage.addListener((message) => {
console.log(message);
});Один repository — не обязательно один manifest
Практичнее держать общий src и отдельные build-конфиги/manifest overrides. Так browser-specific permissions и API не превращаются в условные конструкции по всему коду.
Тестировать отдельно
| Сценарий | Chrome | Edge | Firefox |
|---|---|---|---|
| Install/update | ✓ | ✓ | ✓ |
| Permissions prompt | ✓ | ✓ | ✓ |
| Content script | ✓ | ✓ | ✓ |
| Storage | ✓ | ✓ | ✓ |
| Auth/API | ✓ | ✓ | ✓ |
| Store package | отдельная проверка | отдельная | отдельная |
Как проверить результат
После изменений повторите исходный сценарий, зафиксируйте результат и убедитесь, что соседние функции работают так же, как до правки. Если проблема проявляется не всегда, проведите несколько повторов в одинаковых условиях и сохраните диагностические данные.