Ich möchte ein paar alberne Funktionen in meinem Browser. Vielleicht kann ich es mit einer einfachen Erweiterung hinzufügen? Es existiert nicht, aber es selbst zu schreiben sollte einfach sein, oder?
Das dachte ich vor ein paar Tagen. Auch wenn ich nicht völlig falsch lag, waren einige Teile des Entwicklungsprozesses etwas zeitaufwändiger als ich erwartet hatte. Ich sage nicht „schwierig“, aber anhand der verfügbaren Dokumentation ist es eher schwer herauszufinden. Während API-Dokumentation, Kernkonzepte usw. auf Developer.chrome.com recht gut beschrieben sind, wollte ich eine spezifische Entwicklererfahrung:
Im Guten wie im Schlechten gelang es mir, die Dinge so einzurichten, wie ich es wollte. In diesem Beitrag erkläre ich kurz allgemeine Erweiterungskonzepte und zeige Ihnen, wie ich meine Entwicklungsumgebung eingerichtet habe. In den nächsten ein oder zwei Beiträgen werde ich mich auf die Implementierungsdetails meiner einfachen Page-Audio-Erweiterung konzentrieren.
TLDR:
Wenn Sie nur den Code möchten, finden Sie hier das Boilerplate-Repo:
Dieses Repository soll ein Ausgangspunkt für die Entwicklung einer Chromium-Erweiterung sein.
Es ist so minimalistisch wie möglich, kommt aber mit vorkonfiguriertem:
Viel Spaß beim Codieren!
ℹ️ Ich verwende Windows 11, MS Edge, VS Code und npm überall unten ℹ️
Beginnen wir mit einem Crashkurs über allgemeine Erweiterungskonzepte.
Jede Erweiterung verfügt über eine manifest.json-Datei, die ihren Namen, ihre Version, die erforderlichen Berechtigungen und die verwendeten Dateien definiert. Erweiterungen können auf verschiedene Arten Funktionalität bereitstellen:
Es gibt auch andere Möglichkeiten, aber ich werde mich in diesem Leitfaden an diese drei halten.
Ein weiteres wichtiges Konzept ist Messaging. Normalerweise müssen wir die oben genannten Methoden kombinieren, da sie alle unterschiedliche Einschränkungen haben. Hintergrundskripte hängen beispielsweise nicht von geöffneten Tabs ab und können für die Beibehaltung des Status nützlicher sein, können aber nicht auf das DOM einer Website zugreifen. Daher müssen wir möglicherweise einige erweiterungsweite Daten vom Hintergrundskript abrufen, sie mithilfe einer Nachricht an ein Inhaltsskript übergeben und von dort aus die Website ändern.
Es kann auch hilfreich sein, einige Grundlagen zu Berechtigungen zu verstehen. Kurz gesagt: Einige APIs funktionieren nicht wie erwartet, wenn manifest.json nicht die richtigen Berechtigungen angibt. Wenn wir beispielsweise die Berechtigung „Tabs“ nicht angeben, verfügen die von der Tabs-API zurückgegebenen Objekte nicht über ein URL-Feld. Andererseits sollten wir nicht zu viele Berechtigungen verlangen – wenn die Erweiterung öffentlich sein soll, könnten Benutzer Bedenken haben, Zugriff auf zu viele Dinge zu gewähren.
Inspiriert von https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world
Beginnen wir damit, die Kernkonzepte unseres Entwicklungsworkflows zu verstehen, indem wir eine äußerst einfache Erweiterung verwenden, die lediglich Text in einem Popup anzeigt.
Zuerst benötigen wir eine manifest.json-Datei:
// manifest.json { "name": "Hello World", "description": "Shows Hello World text", "version": "1.0", "manifest_version": 3, "action": { "default_popup": "hello.html", "default_icon": "icon.png" } }
Name, Beschreibung, Version und manifest_version sind wahrscheinlich selbsterklärend. action.default_popup ist ein Pfad zu einer HTML-Datei, die beim Klicken auf das Erweiterungssymbol gerendert wird. default_icon ist ein Pfad zum Erweiterungssymbol. Beide Pfade sind relativ zum Speicherort von manifest.json.
Fügen Sie nun die Dateien icon.png (zum Beispiel diese) und hello.html im selben Verzeichnis wie manifest.json hinzu.
hello.html kann so aussehen:
<!-- hello.html --> <p>Hello world</p>
Und Ihr gesamtes Verzeichnis sollte so aussehen:
// manifest.json { "name": "Hello World", "description": "Shows Hello World text", "version": "1.0", "manifest_version": 3, "action": { "default_popup": "hello.html", "default_icon": "icon.png" } }
So aktivieren Sie Ihre Erweiterung:
Nachdem Sie nun auf das Symbol geklickt haben, wird ein kleines Popup mit dem Text „Hallo Welt“ angezeigt.
Damit sind die wichtigsten Grundlagen abgedeckt. Kommen wir zu etwas Interessanterem.
Wir beginnen erneut mit der manifest.json und dem leeren Verzeichnis.
Es wäre toll, beim Schreiben der manifest.json-Datei eine automatische Vervollständigung zu haben, oder? Glücklicherweise handelt es sich um einen klar definierten Standard und es gibt ein JSON-Schema unter https://json.schemastore.org/chrome-manifest. Wir brauchen es nur unter dem Schlüssel „$schema“ am Anfang von manifest.json:
<!-- hello.html --> <p>Hello world</p>
und VS Code hilft uns sofort, indem es Feldnamen vorschlägt und Warnungen anzeigt, wenn Pflichtfelder fehlen. Großartig!?
Damit etwas zum Testen unseres Setups funktioniert, verwenden Sie manifest.json in der folgenden Reihenfolge:
. ├── hello.html ├── icon.png └── manifest.json
Die Verwendung von TypeScript ... nun, erfordert TypeScript. Wenn Sie es nicht installiert haben, beginnen Sie mit
// manifest.json { "$schema": "https://json.schemastore.org/chrome-manifest" }
Um die Dinge organisiert, aber nicht zu kompliziert zu machen, behalte ich die .ts-Quelldateien im ts-Verzeichnis. Von dort werden sie vom Transpiler übernommen und als .js-Dateien im dist-Verzeichnis abgelegt.
Dies wird durch die folgende .tsconfig beschrieben:
// manifest.json { "$schema": "https://json.schemastore.org/chrome-manifest", "name": "Page Audio", "version": "0.0.0.1", "manifest_version": 3, "icons": { "16": "icons/logo16x16.png", "32": "icons/logo32x32.png", "48": "icons/logo48x48.png", "128": "icons/logo128x128.png" }, "background": { "service_worker": "dist/background.js", "type": "module" } }
Die wichtigsten Bits sind Compiler.rootDir und Compiler.outDir. Die anderen Felder können andere Werte haben oder vollständig entfernt werden (zumindest einige davon).
Das ist die Grundkonfiguration – wenn Sie einige Dateien im ts-Verzeichnis ablegen und tsc im Stammverzeichnis ausführen, wird eine entsprechende .js-Datei in dist erstellt. Allerdings fehlt uns ein wichtiger Teil – Typen für den Chrome-Namespace, den wir verwenden werden. Die einfachste Lösung besteht darin, sie über npm hinzuzufügen.
Erstellen Sie eine leere package.json, nur mit den Klammern:
// manifest.json { "name": "Hello World", "description": "Shows Hello World text", "version": "1.0", "manifest_version": 3, "action": { "default_popup": "hello.html", "default_icon": "icon.png" } }
und führen Sie in der Befehlszeile Folgendes aus:
<!-- hello.html --> <p>Hello world</p>
Sie können auch Skripte hinzufügen, um tsc build und im Überwachungsmodus auszuführen. Das endgültige package.json sollte so aussehen:
. ├── hello.html ├── icon.png └── manifest.json
ℹ️ Chrom-Versionen könnten in Ihrem Fall höher sein. ℹ️
Nachdem wir die Typen hinzugefügt haben, müssen wir TypeScript darüber informieren. Aktualisieren Sie dazu einfach .tsconfig.json:
// manifest.json { "$schema": "https://json.schemastore.org/chrome-manifest" }
Um zu testen, ob unser Setup korrekt funktioniert:
Erstellen Sie im Ordner „ts“ die Datei „background.ts“ mit folgendem Inhalt
// manifest.json { "$schema": "https://json.schemastore.org/chrome-manifest", "name": "Page Audio", "version": "0.0.0.1", "manifest_version": 3, "icons": { "16": "icons/logo16x16.png", "32": "icons/logo32x32.png", "48": "icons/logo48x48.png", "128": "icons/logo128x128.png" }, "background": { "service_worker": "dist/background.js", "type": "module" } }
Führen Sie in der Befehlszeile Folgendes aus:
npm install -g typescript
Überprüfen Sie, ob das dist-Verzeichnis erstellt wurde und die Datei „background.js“ dort angezeigt wurde
Ändern Sie etwas in der Zeichenfolge console.log in der Datei ts/background.ts und speichern Sie es
Überprüfen Sie, ob dist/background.js automatisch aktualisiert wurde.
Wenn das funktioniert, großartig! Wir haben fast alles eingerichtet ?
Sie können auch überprüfen, ob Ihre Verzeichnisstruktur wie folgt aussieht:
// .tsconfig { "compilerOptions": { "target": "ES6", "module": "ES6", "outDir": "./dist", "rootDir": "./ts", "strict": true, } }
Wie ich bereits erwähnt habe, würde ich den Code gerne in kleinere Dateien aufteilen. Dazu muss der Export und Import korrekt funktionieren.
Ein Schritt in diese Richtung war die Angabe unseres service_worker in manifest.json als „type“: „module“. Bei der Arbeit mit Modulen gibt es jedoch einen Unterschied zwischen TypeScript und JavaScript: Während TypeScript beim Import keine Dateierweiterungen benötigt, ist dies bei JavaScript der Fall. Also zum Beispiel dieser Import:
// package.json { }
funktioniert in TS, aber JS benötigt
npm i -D chrome-types
Es ist auch wichtig zu verstehen, dass der TS-Transpiler nichts unternimmt auf die Importpfade. Und es ist „schlau“ genug, um zu verstehen, dass beim Importieren aus file.js auch nach file.ts gesucht werden sollte.
In Kombination mit all dem wird TS auch mit dem Import im JS-Stil zufrieden sein und beim Import aus file.js die entsprechende TS-Datei verwenden. Was wir tun müssen, ist sicherzustellen, dass alle Importe in TS-Dateien die Erweiterung .js haben. So automatisieren Sie es im VS-Code:
Jetzt wird bei jedem automatischen Import mit VS-Code .js zum Dateinamen hinzugefügt ?
Um zu testen, ob alles richtig funktioniert:
Erstellen Sie die Datei ts/hello.ts mit folgendem Inhalt
// package.json { "scripts": { "build": "tsc", "watch": "tsc -w" }, "devDependencies": { "chrome-types": "^0.1.327" } }
Entfernen Sie in ts/background.ts die aktuelle Zeile console.log und beginnen Sie mit der Eingabe von „Hallo“
VS Code sollte es automatisch vervollständigen und den richtigen Import hinzufügen, nachdem Sie den Vorschlag mit der Tabulatortaste akzeptiert haben
Am Ende sollte die Datei so aussehen:
// manifest.json { "name": "Hello World", "description": "Shows Hello World text", "version": "1.0", "manifest_version": 3, "action": { "default_popup": "hello.html", "default_icon": "icon.png" } }
Beachten Sie, dass der Import mit der Erweiterung .js endet. Wenn Sie dist/background.js überprüfen, ist die Erweiterung auch vorhanden und sorgt dafür, dass alles richtig funktioniert.
Um sicherzustellen, dass wir auf dem gleichen Stand sind, können Sie die Verzeichnisstruktur vergleichen:
<!-- hello.html --> <p>Hello world</p>
Okay, wir haben eine anständige Entwicklungserfahrung. Wir haben auch einige console.log-Aufrufe hinzugefügt... aber wo sind sie jetzt zu finden?
Wenn Sie console.log in ein Inhaltsskript einfügen, können Sie einfach Dev Tools öffnen und sie sind dort, da Inhaltsskripte im gleichen Kontext wie die Seite funktionieren, in die sie eingefügt werden. Allerdings werden console.logs von Hintergrundskripten etwas stärker ausgeblendet.
Klicken Sie in der Zeile „Ansichten prüfen“ auf den Link „Servicemitarbeiter“:
Ein neues Dev Tools-Fenster sollte geöffnet werden und Sie sehen dort Protokolle des Servicemitarbeiters
Die drei Links am unteren Rand der Kachel sind ebenfalls sehr wichtig
Puh. Das hat einen Moment gedauert, aber endlich ist unsere Umgebung gut eingerichtet. Von nun an müssen wir es einfach tun
Und unsere Erweiterung wird automatisch aktualisiert! ⚙️
Wenn Sie eine Idee haben, wie Sie auch automatisch „neu laden“ können (ohne aufwändiges Hacken), lassen Sie es mich in den Kommentaren wissen
Wir haben unsere Umgebung bereit!
Im nächsten Teil beschreibe ich die Implementierungsdetails meiner kleinen „Page Audio“-Erweiterung.
Danke fürs Lesen!
Das obige ist der detaillierte Inhalt vonChrome-Erweiterung – Umgebungseinrichtung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!