Piszę rozszerzenie do Chrome. I chcę użyć jQuery
w moim rozszerzeniu. Nie używam żadnej strony w tle , tylko skrypt działający w tle .
Oto moje pliki:
manifest.json
{
"manifest_version": 2,
"name": "Extension name",
"description": "This extension does something,",
"version": "0.1",
"permissions": [
"activeTab"
],
"browser_action": {
"default_icon": "images/icon_128.png"
},
"background": {
"scripts": ["background.js"],
"persistent": false
},
"icons": {
"16": "images/icon_16.png",
"48": "images/icon_48.png",
"128": "images/icon_128.png"
}
}
Mój background.js
plik po prostu uruchamia inny plik o nazwiework.js
// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
chrome.tabs.executeScript({
file: 'work.js'
});
});
Główna logika mojego rozszerzenia znajduje się wewnątrz work.js
. Treść, która moim zdaniem nie ma tutaj znaczenia dla tego pytania.
Chcę zapytać, jak mogę używać jQuery w moim rozszerzeniu. Ponieważ nie używam żadnej strony w tle. Nie mogę po prostu dodać do niego jQuery. Jak więc mogę dodać i używać jQuery do mojego rozszerzenia?
Próbowałem uruchomić jQuery wraz z moim plikiem work.js z background.js
pliku.
// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
chrome.tabs.executeScript({
file: 'thirdParty/jquery-2.0.3.js'
});
chrome.tabs.executeScript({
file: 'work.js'
});
});
I działa dobrze, ale mam obawy, czy skrypty dodane do wykonania w ten sposób są wykonywane asynchronicznie. Jeśli tak, może się zdarzyć, że plik work.js działa jeszcze przed jQuery (lub innymi bibliotekami, które mogę dodać w przyszłości).
Chciałbym też wiedzieć, jaki jest właściwy i najlepszy sposób korzystania z bibliotek innych firm w moim rozszerzeniu do Chrome.
Odpowiedzi:
Musisz dodać skrypt jquery do projektu rozszerzenia chrome i do
background
sekcji pliku manifest.json w następujący sposób:Jeśli potrzebujesz jquery w content_scripts, musisz dodać go również do manifestu:
To właśnie zrobiłem.
Ponadto, jeśli dobrze pamiętam, skrypty działające w tle są wykonywane w oknie w tle, które można otworzyć za pomocą
chrome://extensions
.źródło
You have to add your jquery script to your chrome-extension project
? Zrobiłem to: manifest.json:"background": {
`" scripts ": [" thirdParty / jquery-2.0.3.js "," background.js "],` `" persistent ": false``}, `i pobrałem jQuery do folderu ThirdParty. Jednak nadal nie mogę używać jQuery. Daje błąd:Uncaught ReferenceError: $ is not defined
dodałem to do mojegowork.js
pliku w celu przetestowania.$("body").html("Foo!");
work.js
pliku.Uncaught ReferenceError: $ is not defined
. Jeśli możesz, czy możesz przesłać gdzieś działający przykład. Wystarczy prosty przykład, jak wykonanie '$ ("body"). Html ("Foo!");' w work.js.jQuery
lub byciem$
rozpoznanym. Okazało się, że odwoływałem się do jQuery jako ostatnie w tablicy manifestu. Kiedy umieściłem to jako pierwsze, zostało rozpoznane.Jest to bardzo łatwe, wystarczy wykonać następujące czynności:
dodaj następujący wiersz do swojego manifest.json
Teraz możesz ładować jQuery bezpośrednio z adresu URL
Źródło: dokument google
źródło
subresource integrity
(SRI).To naprawdę nie powinno być problemem: kolejkujesz skrypty do wykonania w określonym kontekście JS, a ten kontekst nie może mieć warunku wyścigu, ponieważ jest jednowątkowy.
Jednak właściwym sposobem na wyeliminowanie tego problemu jest łańcuchowanie połączeń:
Lub uogólnione:
Lub obiecał (i bardziej zgodny z odpowiednim podpisem):
Lub, do cholery,
async
/await
-ed dla jeszcze jaśniejszej składni:Uwaga, w Firefoksie możesz po prostu użyć,
browser.tabs.executeScript
ponieważ zwróci Obietnicę.źródło
Oprócz wspomnianych już rozwiązań możesz również pobrać
jquery.min.js
lokalnie, a następnie z niego korzystać -Do pobrania -
manifest.json -
w html -
Odniesienie - https://developer.chrome.com/extensions/contentSecurityPolicy
źródło
W moim przypadku dostałem działające rozwiązanie poprzez Cross-document Messaging (XDM) i uruchamianie rozszerzenia Chrome onclick zamiast ładowania strony.
manifest.json
background.js
myscript.js
źródło