Entwickeln Sie die Chrome-Erweiterung mit Angular CLI

Ich habe lange Zeit Erweiterungen für Chrome entwickelt und bin in dieser Zeit von Greasemonkey-Benutzerskripten zu einer vollwertigen Angular-Anwendung in der Chrome-Erweiterungs-Shell übergegangen. Meine Aufgabe ist es, einige bereits funktionierende Sites zu patchen, um ihre Funktionalität zu ändern und einige Prozesse auf diesen Sites zu automatisieren. Manchmal wächst meine Anwendung in großem Maßstab und es wird schwierig, die Plain-Js-Erweiterung zu unterstützen (es gibt viele Einstellungen in der Anwendung, CRUD-Funktionalität usw.). Und dann kommt Angular zur Rettung.

In diesem Artikel werde ich Ihnen erklären, wie ich mich mit Chrome Extension und Angular CLI angefreundet und den Entwicklungsprozess eingerichtet habe sowie auf welche Schwierigkeiten ich gestoßen bin und wie ich sie lösen kann.
Erstellen Sie einen neuen Ordner und initialisieren Sie eine neue Anwendung darin.

mkdir new-project cd new-project ng new frontend --routing=true --skipGit=true --style=scss --skipTests=true 

In der Entwicklungsphase generiert Angular eine dynamische HTML-Datei, in der die Entwicklung stattfindet, und der Chrome-Erweiterung muss eine statische HTML-Datei zugeführt werden, um das Ergebnis der Arbeit anzuzeigen. Natürlich können Sie das Angulyarovsk-Projekt separat zusammenstellen und dann zusätzlich die Build-Version erstellen, aber es ist praktisch, wenn dies automatisch geschieht.

Wechseln Sie nach dem Generieren einer neuen Anwendung in den Frontend-Ordner und fügen Sie in der Datei package.json im Abschnitt Skripte ein neues Skript hinzu, um unser Projekt zu erstellen

 "developing": "ng build --watch --deploy-url /frontend/dist/frontend/ --base-href /frontend/dist/frontend/index.html?/" 

Achten Sie auf deploy-url und base-href .

Erstellen Sie dann im Stammverzeichnis des Projekts einen weiteren Erweiterungsordner und erstellen Sie die Datei extension.js darin, die das Hintergrundskript für unsere Erweiterung darstellt. Aktuelle Projektstruktur:

 | new-project/ | | extension/ | | | extension.js | | frontend/ | | | ... 

Inhaltserweiterung.js

 const ANGULAR_HTML_URL = "../../frontend/dist/frontend/index.html"; chrome.browserAction.onClicked.addListener(function () { chrome.tabs.create({ url: chrome.runtime.getURL(ANGULAR_HTML_URL) }); }); 

Dies ist browserAction , die mit unserer Winkelanwendung eine neue Registerkarte öffnet, die in zusammengesetzter Form bereits auf diesem Pfad gespeichert wird.

Fügen Sie manifest.json zu unserem Projekt hinzu
 { "manifest_version": 2, "name": "Simple Chrome Ext", "description": "Simple Chrome Extension as an example", "version": "1.00", "author": "Bogdan", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "background": { "persistent": true, "scripts": ["/extension/extension.js"] }, "browser_action": { "default_title": "Chrome ext" } } 


Jetzt können wir unser Projekt zu einer Erweiterung zusammenstellen. Wir gehen in chrome: // extensions / , aktivieren den Entwicklermodus und wählen Download Unpacked extension .

Ergebnis
Bild

Der Vorteil ist, dass wir fast Hot-Reloading haben. Wir haben ng build mit dem Watch- Flag gestartet. Wenn sich der Code ändert, wird das Projekt neu erstellt und die js-Dateien werden ersetzt. Das heißt, auf der Erweiterungsseite müssen wir nur die Seite neu laden, und alle Aktualisierungen werden übernommen. Dies beschleunigt die Entwicklung von Add-Ons erheblich.

Ein weiterer Punkt, an dem ich den Hund gefressen habe, ist der in der Routing-Konfiguration:

 { useHash: true } 

und wir werden auch oben zurückkehren, base-href bei Build, den wir als /frontend/dist/frontend/index.html?/ registriert haben - achten Sie auf ein Fragezeichen vor dem letzten Schrägstrich. Tatsache ist, dass auf einigen Systemen, wenn Sie auf die Links in der Angular-Anwendung klicken, alles ohne dieses Zeichen abstürzt. Anscheinend hat der statische Webserver der Chrome Engine die URL-Änderung als Anforderung an eine andere Datei wahrgenommen (obwohl useHash: true), und beim Aktualisieren der Seite wurde ein 404-Fehler zurückgegeben. Nur in dieser Kombination gelang es mir, auf allen Systemen einen stabilen Betrieb zu erreichen.

Kehren wir zur package.json unserer Anwendung zurück und fügen ein weiteres Skript hinzu

 "prod": "ng build --sourceMap false --prod true --deploy-url /frontend/dist/frontend/ --base-href /frontend/dist/frontend/index.html?/" 

Dies ist das Skript zum Erstellen unserer Anwendung für die Produktionsversion.

Im Chrome Web Store wird ein Zip-Archiv mit der Erweiterung veröffentlicht. Um die Zusammenstellung zu vereinfachen, habe ich für diese Zwecke ein Skript erstellt

update.sh
 #!/bin/bash rm -rf ./prod-build mkdir -p prod-build/frontend cd frontend npm run prod cd .. cp -R ./frontend/dist ./prod-build/frontend cp -R ./extension ./prod-build cp ./manifest.json ./prod-build zip -r prod-build{.zip,} rm -rf ./prod-build 

Den Quellcode finden Sie hier .

Insgesamt: Wir haben ein Vorentwicklungskit für Angular Chrome Extension mit dem richtigen Routing und der praktischen Aktualisierung / Erstellung der Anwendung erstellt.

PS: Um ein solches / frontend / dist / frontend / path zu entfernen , können Sie die Umgebung konfigurieren und den Pfad in der Produktionsassembly anders angeben, aber dies ist nicht der entscheidende Punkt.

Source: https://habr.com/ru/post/de458556/


All Articles