2015-11-24 10 views
7

Ich entwickle eine Chrome-Erweiterung mit React und Webpack.Webpack und programmgesteuerte Inhaltsskripts

In diesem Projekt werden verschiedene Module programmgesteuert Inhaltsskripts mit chrome.tabs.executeScript(null, {file: 'content-script-file.js'}) injizieren.

Das wird problematisch, da ich Webpack für die Bündelung alles verwende. Im Grunde lädt das Hintergrundskript eine Reihe von Modulen, die alle so konfiguriert sind, dass sie Inhaltsskripte unter bestimmten Umständen programmatisch einfügen.

Ich kann jedoch nicht herausfinden, wie diese Inhaltsskripts in der gebündelten Anwendung "gefunden" werden. Sie werden nicht explizit importiert, nur in executeScript Aufrufe referenziert.

Zur gleichen Zeit verwenden die Inhaltsskripts React, also müssen sie die babel-loader in Webpack durchlaufen.

Irgendwelche Ideen?

+0

Also im Grunde müssen Sie eine Wrapper-Funktion, die Babel-Skript (wohl eine sehr große) injiziert dann das eigentliche Content-Skript (und wahrscheinlich der Code, der Babel auslöst) ... Haben Sie keine Angst, die Overhead könnte zu groß sein? – wOxxOm

+0

@wOxxOm: Ich möchte diese Art von Blähungen vermeiden, um ehrlich zu sein, aber ich bin neu bei Webpack, also bin ich mir nicht sicher, was es für mich tun kann, das zu verhindern. – damd

+0

Der effiziente Ansatz wäre, vorkompilierte Skripts zu injizieren. Ich denke, Sie müssen manuell eine Liste von Scripts für die Vorkompilierung definieren, aber ich bin kein Experte für Webpack. – wOxxOm

Antwort

1

sind Ihre Inhalte Skripte effektiv "Einstiegspunkte" in webpack-Bedingungen.

Jedes Inhaltsskript der obersten Ebene sollte als Webpack-Eintrag definiert werden. Verwenden Sie Webpack zum Erstellen dieser Inhaltsskripts. Jeder Eintrag zieht alle Abhängigkeiten (wie React) in einen großen Blob.

Dann erstellen Sie einen zweiten Webpack-Build, der Ihre Erweiterung erstellt. Diese Erweiterung wird die rohe Loader und import Ihre webpack kompilierte Content-Skripte verwenden und dann wird es sie alle als Strings lokale Variablen haben:

import scriptA from 'content/build/a'; 
import scriptB from 'content/build/b'; 

Und jetzt können Sie die Skripte in Ihre Tabs injizieren nach Bedarf:

chrome.tabs.executeScript(null, scriptA); 
-1

Dies sollte funktionieren, die Chrome-Dokumente sagen Skript ausführen excepts String-Code oder String-Datei.

import ContentScript from './content-script-file'; 
 

 
chrome.tabs.executeScript(null, ContentScript);

+0

Eine Frage ist definitionsgemäß keine Antwort, daher sollte dies ein Kommentar sein, keine Antwort – RononDex

Verwandte Themen