2010-09-26 10 views
5

An welchem ​​Punkt sollte ich eine Chrome-Verbindung verwenden? Gibt es jemals einen guten Grund, sowohl einfache Message-Passing- als auch langlebige Verbindungen zu verwenden? Haben diese zwei unterschiedliche Auswirkungen auf die Leistung?Chrome-Erweiterungen: Einfache Nachrichtenübergabe vs Chrome-Verbindung

Gibt es andere Dokumente als http://code.google.com/chrome/extensions/messaging.html, die die beiden Ansätze vergleichen?

(edit: Dokumentation bewegte https://developer.chrome.com/extensions/messaging)

+0

Für alle zukünftigen Zuschauer glaube ich, 'sendmessage' verwendet' chrome.runtime.connection', öffnet einen Port und schließt dann den Port, nachdem die einzelne Nachricht gesendet wurde, so dass sie in Bezug auf die Leistung identisch sein sollten. Versuchen Sie 'console.log (sendResponse)'. –

Antwort

7

In meiner persönlichen Erfahrung mit dem Schreiben von Erweiterungen, neige ich sendMessage für Zustandsinitialisierung zu verwenden und eine Verbindung zu jeder Zeit, die ich will immer wieder Dinge senden.

Als Beispiel haben meine Erweiterungen normalerweise benutzerkonfigurierbare Optionen, und ich brauche eine Möglichkeit, diese Optionen an meine Inhaltsskripte zu senden. Ich verwende sendMessage und onMessage, um ein JSON-Objekt an meine Inhaltsskripte zu übergeben. Dieses Objekt enthält die verschiedenen benutzergesteuerten Einstellungen und möglicherweise auch andere Zustände.

Ich habe auch eine kleine Bibliothek erstellt, mit der Sie Tastaturkürzel auf der Hintergrundseite definieren können. Wie es funktioniert, ist einfach: Ein Inhaltsskript wird in jede Seite eingefügt, die dann auf die Ereignisse keydown und keyup hört.

Wenn ein Ereignis auftritt, verwendet es chrome.runtime.connect, um mit der Hintergrundseite zu kommunizieren. Ich denke, dies ist ein hervorragendes Beispiel dafür, wann eine langlebige Verbindung nützlicher sein könnte als viele Anrufe.

Ich glaube nicht, dass es etwas gibt, dass Sie auf die eine oder andere Weise verwenden müssen ... Sie könnten mehrere sendMessage verwenden oder nur eine einzige Nachricht mit Verbindung senden. Ich glaube, es ist eher eine Frage der Semantik und der Auswahl, welches Tool für den Job am sinnvollsten ist.

Denken Sie auch daran, dass die Verwendung von connect es einfach macht, für jede Verbindung einen separaten Status zu speichern, während es mit sendMessage etwas schwieriger sein könnte.

Wie für die Leistung ... Ich weiß ehrlich gesagt nicht, aber ich würde erwarten, dass sie zumindest ähnlich sein, d. H. 5 sendMessage wäre in etwa gleich mit dem Senden von 5 Nachrichten mit Verbindung. Denken Sie daran, dass sie asynchron sind, so dass das Timing abhängig von den Umständen schwanken kann.

1

Um zu der anderen Antwort hinzuzufügen, hat die Verwendung von Ports einen zusätzlichen Vorteil in Form des onDisconnect Ereignisses.

Angenommen, ein Inhaltsskript öffnet eine Verbindung zur Hintergrundseite. Die Hintergrundseite wird dann sofort über das entladene Inhaltsskript benachrichtigt, wenn die Registerkarte geschlossen ist oder der Benutzer weg navigiert.

Dies ermöglicht auch nachvollziehbar, offene Registerkarten (mit Inhaltsskripten injiziert) ohne die tabs Erlaubnis zu verfolgen.