Ich habe die Entwicklung einer Chrome-Erweiterung Polymer nun schon seit einiger Zeit mit, und ich habe ein paar Bedenken darüber in seiner aktuellen Zustand freigegeben wird. Ich möchte über einige Strategien zum Verhindern der folgenden Probleme hören, mit denen ich konfrontiert wurde:Probleme Polymer 1.0 in einer Chrom-Erweiterung geladen
1) Laden von Polymer in die Seite leckt in den globalen Namespace. Polymer wird nicht in JS-Dateien gebündelt, sondern kommt in Form einer HTML-Seite und erfordert, dass der Benutzer einen HTML-Import verwendet, um es in die Seite zu laden. AFAIK, Inhaltsskripte erlauben nur CSS und JS, aber nicht HTML. Um dieses Problem zu beheben, ich bin auch durch dynamisch ein Verbindungselement zu erzeugen und sie als solche in der Seite hinzufügen:
function loadUrl(url) {
return new Promise(
function(resolve, reject) {
var link = document.createElement('link');
link.setAttribute('rel', 'import');
link.setAttribute('href', url);
link.onload = function() {
resolve(url);
};
document.head.appendChild(link);
});
}
loadUrl(chrome.extension.getURL("polymer/polymer.html")).
then(loadUrl(chrome.extension.getURL("my/component.html")))
Einmal in die Host-Seite geladen, ist es nicht isoliert wie Content-Skripte ausgeführt und kann Ursache Namespace-Konflikte, wenn die Seite bereits hat Polymer geladen.
2) Polymer sagen Sie nicht, wenn es geladen und einsatzbereit. Polymer feuert (derzeit) nicht ein Ereignis, wenn es geladen wurde und als Ergebnis laden meine Komponenten manchmal vor Polymer und brechen.
Um dies zu mildern, ich Auslösen ein benutzerdefiniertes Ereignis am Ende der polymer-micro.html
(die in den Polymer ist) als solche definiert:
var ev = new CustomEvent('polymer-loaded');
document.dispatchEvent(ev);
3) Das Polybuild Werkzeug nicht für einen richtigen Code generiert Chromverlängerung. So nützlich es ist, erzeugt es eine separate JavaScript-Datei außerhalb der dom-module
einen Namespace leak
in das globale Fensterobjekt verursacht. Wenn zum Beispiel jQuery in mein Modul importiert wurde, erzeugte Polybuild eine JS-Datei, die jQuery außerhalb des DOM-Moduls enthielt, wodurch sie an das Objekt des Host-Fensters angehängt wurde - ein großes Nein in einer Chrome-Erweiterung.
Danke für das Feedback.
Zum Zeitpunkt des Schreibens dieses verwende ich Polymer 1.2.3
Ich beantwortete Frage (2) nur richtig, also erwarte ich nicht, dass meine Antwort akzeptiert wird, aber ich werde versuchen, es nach dem Experimentieren mehr mit polymerbasierten Chrom-Erweiterungen und es6 Modulen und Importen zu aktualisieren, bis dahin ich hoffe es hilft dir wenigstens ein bisschen. –