Browser-Erweiterungen entwickeln (Chrome, Firefox, Edge, Safari)
Manifest V3, Service Worker, Content Scripts und Popup: wie eine Erweiterung aufgebaut ist, wie Sie sie lokal testen und in welchen Stores sie landet.
Browser-Erweiterungen sind der zugänglichste Einstieg in die Add-on-Entwicklung. Sie brauchen keinen Server, keine besondere Entwicklungsumgebung und keine Freigabe, um loszulegen: Ein Ordner mit einer Manifest-Datei und etwas JavaScript genügt, und der Browser lädt das Ergebnis im Entwicklermodus sofort. Gleichzeitig ist die Plattform mächtig. Erweiterungen können Webseiten verändern, Tabs verwalten, Netzwerkanfragen filtern und eigene Oberflächen einblenden. Genau deshalb gelten strenge Regeln für Berechtigungen und Veröffentlichung.
Das WebExtensions-Modell
Fast alle aktuellen Browser folgen einem gemeinsamen Modell, das ursprünglich aus Chrome stammt und als WebExtensions bezeichnet wird. Firefox hat es übernommen, Edge setzt seit dem Wechsel auf Chromium auf dieselbe Basis, und auch Safari unterstützt Web Extensions. Für Sie heißt das: Wer eine Erweiterung für einen Browser schreibt, hat die anderen zu großen Teilen gleich mit abgedeckt.
Das Herzstück ist die Datei manifest.json. Sie beschreibt, wie die Erweiterung heißt, welche Version sie hat, welche Dateien zu ihr gehören und welche Rechte sie braucht. Aktuell ist Manifest V3. Chrome hat die Unterstützung für Manifest V2 auslaufen lassen; neue Erweiterungen sollten ausschließlich auf V3 setzen.
{
"manifest_version": 3,
"name": "Tab-Zähler",
"version": "1.0.0",
"description": "Zeigt die Zahl offener Tabs im Symbol an.",
"background": { "service_worker": "background.js" },
"action": { "default_title": "Offene Tabs" },
"permissions": ["tabs"]
}
Die Bausteine einer Erweiterung
Eine Erweiterung ist kein einzelnes Programm, sondern ein Verbund aus Teilen, die in unterschiedlichen Umgebungen laufen und über Nachrichten miteinander sprechen.
| Baustein | Wo er läuft | Typische Aufgabe |
|---|---|---|
| Service Worker (Hintergrund) | eigener Kontext, ohne Fenster | auf Ereignisse reagieren, Daten verwalten, Alarme |
| Content Script | im Kontext einer Webseite | Seiteninhalt lesen und verändern |
| Popup | kleines Fenster am Symbol | schnelle Bedienung, Einstellungen umschalten |
| Optionsseite | eigener Tab | dauerhafte Einstellungen |
| Seitenleiste (Side Panel) | Leiste neben der Seite | Werkzeuge, die neben dem Inhalt sichtbar bleiben |
Der Service Worker ersetzt unter Manifest V3 die frühere dauerhaft laufende Hintergrundseite. Er wird bei Bedarf gestartet und nach kurzer Inaktivität wieder beendet. Variablen im Speicher gehen dabei verloren. Zustand, der erhalten bleiben soll, gehört deshalb in chrome.storage. Wer diesen Unterschied nicht kennt, wundert sich über scheinbar zufällig verschwundene Daten.
Content Scripts laufen in einer isolierten Umgebung neben dem JavaScript der Webseite. Sie sehen dasselbe DOM, aber nicht die Variablen der Seite. Für den Austausch mit dem Service Worker dienen chrome.runtime.sendMessage und chrome.runtime.onMessage.
// background.js: Zahl der offenen Tabs als Badge anzeigen
async function aktualisieren() {
const tabs = await chrome.tabs.query({});
await chrome.action.setBadgeText({ text: String(tabs.length) });
}
chrome.tabs.onCreated.addListener(aktualisieren);
chrome.tabs.onRemoved.addListener(aktualisieren);
chrome.runtime.onStartup.addListener(aktualisieren);
Berechtigungen: so wenig wie möglich
Jede Berechtigung im Manifest erscheint bei der Installation als Hinweis für Nutzerinnen und Nutzer. Je weitreichender die Liste, desto größer das Misstrauen und desto genauer die Prüfung im Store. Manifest V3 trennt API-Berechtigungen (permissions) von Websitezugriffen (host_permissions). Ein Zugriff auf <all_urls> ist für viele Zwecke unnötig: Die Berechtigung activeTab gewährt Zugriff auf den aktuellen Tab erst dann, wenn jemand die Erweiterung aktiv anklickt.
Unter Manifest V3 darf eine Erweiterung keinen JavaScript-Code von externen Servern laden und ausführen. Alle Logik muss im Paket stecken. Das schließt auch eval() und ähnliche Konstrukte in den Erweiterungsseiten aus. Daten wie Konfigurationen oder Listen dürfen Sie dagegen weiterhin abrufen.
Mehr zur Nutzersicht auf Berechtigungen lesen Sie im Bereich Erweiterungen sicher nutzen und prüfen.
Lokal laden und testen
- Legen Sie einen Ordner mit
manifest.jsonund den benötigten Skripten an. - In Chrome öffnen Sie
chrome://extensions, aktivieren oben rechts den Entwicklermodus und wählen „Entpackte Erweiterung laden“. - In Firefox öffnen Sie
about:debugging, wechseln zu „Dieser Firefox“ und laden die Manifest-Datei als temporäres Add-on. - Nach jeder Änderung laden Sie die Erweiterung über das Neuladen-Symbol neu. Fehler im Service Worker sehen Sie über den Link „Service Worker untersuchen“.
Für größere Projekte lohnt sich ein Build-Schritt mit TypeScript und einem Bundler. Automatisierte Tests mit Werkzeugen wie Playwright können eine Erweiterung in einem echten Browser laden und Klickpfade prüfen. Beides behandelt der Bereich Programmiergrundlagen.
Unterschiede zwischen den Browsern
| Browser | Hintergrund unter V3 | Namensraum | Veröffentlichung |
|---|---|---|---|
| Chrome | Service Worker | chrome.* |
Chrome Web Store |
| Edge | Service Worker | chrome.* |
Microsoft Edge Add-ons |
| Firefox | Ereignisseite (background.scripts) |
browser.* und chrome.* |
addons.mozilla.org |
| Safari | Service Worker oder Ereignisseite | browser.* |
App Store über eine Xcode-App |
Firefox unterstützt neben Manifest V3 weiterhin Manifest V2 und verlangt, dass Erweiterungen für die reguläre Version von Mozilla signiert sind. Safari ist ein Sonderfall: Eine Web Extension wird dort in eine native App verpackt. Apple liefert dafür ein Konvertierungswerkzeug in Xcode, das aus einem bestehenden Erweiterungsordner ein Projekt erzeugt.
Veröffentlichen
Jeder Store hat ein eigenes Entwicklerkonto, eigene Prüfprozesse und eigene Inhaltsrichtlinien. Gemeinsam ist allen: Eine klare Beschreibung, eine Datenschutzerklärung bei Datenzugriff, nachvollziehbar begründete Berechtigungen und aussagekräftige Screenshots beschleunigen die Prüfung. Konten, Gebühren und typische Ablehnungsgründe vergleicht der Bereich Add-ons veröffentlichen und pflegen.
Typische Stolpersteine
- Verschwundener Zustand: Der Service Worker wurde beendet, globale Variablen sind weg. Lösung: Zustand in
chrome.storageablegen. - Content Script greift nicht: Das Muster in
matchespasst nicht zur Adresse, oder die Seite wurde vor der Installation geladen und muss neu geladen werden. - Nachricht kommt nicht an: Der Empfänger existiert noch nicht, etwa weil das Popup geschlossen ist. Nachrichten an ein Popup sind nur zustellbar, solange es geöffnet ist.
- Ablehnung im Store: zu breite Berechtigungen, unklare Funktion oder fehlende Angaben zur Datennutzung.
Anleitungen zu Browser-Erweiterungen
- Chrome-Erweiterung programmieren
Von der leeren manifest.json bis zur funktionierenden Erweiterung mit Popup, Service Worker und Kontextmenü: ein vollständiges Beispiel zum Nachbauen.
- Manifest V2 vs. V3
Service Worker statt Hintergrundseite, Regeln statt blockierendem webRequest, kein nachgeladener Code: die Unterschiede im Überblick und wie Sie migrieren.
- Firefox-Add-on erstellen
Was im Manifest für Firefox anders ist, wie Sie mit web-ext testen und paketieren und wie die Einreichung, Signierung und Prüfung bei addons.mozilla.org abläuft.
- Safari-Erweiterung portieren
Wie Apples Konverter aus einem Erweiterungsordner ein Xcode-Projekt macht, was Sie danach anpassen müssen und wie die Erweiterung als App in den App Store kommt.
- Aufbau einer Erweiterung
Welche Teile eine Erweiterung hat, in welchem Kontext jeder läuft, was er darf und wie die Teile über Nachrichten und Speicher zusammenarbeiten.
Fragen und Antworten
- Laufen Chrome-Erweiterungen auch in Edge, Brave oder Opera?
- In der Regel ja. Diese Browser basieren auf Chromium und unterstützen dieselbe Erweiterungsschnittstelle. Kleine Unterschiede gibt es bei einzelnen APIs und bei den Stores: Für Edge veröffentlichen Sie zum Beispiel separat bei Microsoft Edge Add-ons, auch wenn der Code identisch bleibt.
- Brauche ich für eine Browser-Erweiterung einen Server?
- Nein. Eine Erweiterung läuft vollständig im Browser. Ein Server ist nur nötig, wenn Ihre Erweiterung Daten speichern oder abgleichen soll, die über das Gerät hinausgehen. Code aus dem Netz nachzuladen und auszuführen ist unter Manifest V3 ohnehin nicht erlaubt.
- Kann ich eine Erweiterung für Firefox und Chrome mit einer Codebasis bauen?
- Ja, das ist der Normalfall. Beide folgen dem WebExtensions-Modell. Unterschiede betreffen vor allem den Hintergrundteil, einzelne Manifest-Schlüssel und den Namensraum browser statt chrome. Viele Projekte nutzen ein Build-Skript, das aus einem gemeinsamen Quellordner zwei Pakete erzeugt.
Weiterlesen
- Sicherheit
Welche Berechtigungen heikel sind, woran Sie bösartige Erweiterungen erkennen, warum Updates und Übernahmen ein Risiko sind und was im Ernstfall zu tun ist.
- Veröffentlichen
Stores und Prüfprozesse, Versionsnummern und Changelog, Lizenzen und Bezahlmodelle: was nach dem letzten Commit kommt und warum ein Add-on nie ganz fertig ist.
- Grundlagen
Sprachen, Schnittstellen, Build-Werkzeuge, Versionskontrolle und Tests: das Handwerkszeug, das für Erweiterungen jeder Plattform gebraucht wird.