Omówienie architektury

Rozszerzenia to spakowane pakiety plików HTML, CSS, JavaScript, obrazów i innych plików używanych w internecie które pozwalają dostosować sposób przeglądania Google Chrome. Rozszerzenia są tworzone w internecie i używać tych samych interfejsów API, które przeglądarka udostępnia w sieci.

Rozszerzenia mają wiele różnych możliwości funkcjonalnych. Mogą modyfikować treści internetowe widoczne dla użytkowników wchodzić w interakcje z przeglądarką, rozszerzać ją i zmieniać jej działanie.

Rozważ użycie rozszerzeń, dzięki którym przeglądarka Chrome stanie się najbardziej spersonalizowana.

Pliki rozszerzeń

Rozszerzenia różnią się pod względem typów plików i liczby katalogów, ale wszystkie muszą mieć [manifest][docs-manifest]. Podstawowe, ale przydatne rozszerzenia mogą składać się z samego pliku manifestu jej ikonę na pasku narzędzi.

Plik manifestu o nazwie manifest.json zawiera informacje o rozszerzeniu, takie jak: oraz wskazać funkcje, z których rozszerzenie może korzystać.

{
  "name": "My Extension",
  "version": "2.1",
  "description": "Gets information from Google.",
  "icons": {
    "128": "icon_16.png",
    "128": "icon_32.png",
    "128": "icon_48.png",
    "128": "icon_128.png"
  },
  "background": {
    "persistent": false,
    "scripts": ["background_script.js"]
  },
  "permissions": ["https://*.google.com/", "activeTab"],
  "browser_action": {
    "default_icon": "icon_16.png",
    "default_popup": "popup.html"
  }
}

Rozszerzenia muszą mieć ikonę na pasku narzędzi przeglądarki. Ikony na pasku narzędzi umożliwiają łatwy dostęp informując użytkowników o tym, które rozszerzenia są zainstalowane. Większość użytkowników będzie korzystać z rozszerzenia, które używa wyskakującego okienka, które można kliknąć.

To rozszerzenie Sprawdzanie poczty Google używa działania przeglądarki:

Zrzut ekranu rozszerzenia Google Mail Checker

To rozszerzenie Mappy używa działania na stronie i treści skrypt:

zrzut ekranu z rozszerzeniem Mappy.

Odwołania do plików

Do plików rozszerzenia można się odwoływać za pomocą względnego adresu URL, tak jak w zwykłym kodzie HTML. stronę.

<img src="images/my_image.png">

Dodatkowo dostęp do każdego pliku można uzyskać za pomocą bezwzględnego adresu URL.

chrome-extension://EXTENSION_ID/PATH_TO_FILE

W bezwzględnym adresie URL EXTENSION_ID to unikalny identyfikator, który system rozszerzeń dla każdego rozszerzenia. Identyfikatory wszystkich wczytanych rozszerzeń możesz wyświetlić, otwierając URL chrome://extensions. PATH_TO_FILE to lokalizacja pliku w pliku folder górny rozszerzenia; pasuje do względnego adresu URL.

Podczas pracy nad rozszerzeniem bez pakietu jego identyfikator może się zmieniać. Chodzi konkretnie o identyfikator rozszerzenie bez pakietu zmieni się, jeśli zostanie wczytane z innego katalogu; identyfikator będzie są zmieniane ponownie po umieszczeniu rozszerzenia w pakiecie. Jeśli kod rozszerzenia opiera się na bezwzględnym adresie URL, może użyć metody chrome.runtime.getURL(), by uniknąć kodowania na stałe identyfikatora podczas w Google Cloud.

Architektura

Architektura rozszerzenia zależy od jego funkcjonalności, ale wiele zaawansowanych rozszerzeń mają wiele komponentów:

Skrypt tła

Skrypt w tle to moduł obsługi zdarzeń rozszerzenia. zawiera detektory pod kątem zdarzeń przeglądarki, które są ważne dla rozszerzenia. Jest uśpiony do momentu wywołania zdarzenia, a potem wykonuje zaleconą logikę. Skuteczny skrypt działający w tle jest wczytywany tylko wtedy, gdy jest potrzebny. jest wyładowywany, gdy urządzenie jest nieaktywne.

Elementy interfejsu

Interfejs rozszerzenia powinien być prosty i ograniczony do minimum. Interfejs powinien dostosować lub aby ułatwić przeglądanie, nie rozpraszając ich. Większość rozszerzeń ma przeglądarkę action lub page action, ale mogą zawierać inne formy UI, takich jak menu kontekstowe, użycie omniboksu lub utworzenie skrót klawiszowy.

Strony interfejsu rozszerzeń, takie jak wyskakujące okienka, mogą zawierać zwykłe strony HTML z kodem JavaScript logikę logiczną. Aby wyświetlić, rozszerzenia mogą też wywoływać metodę tabs.create lub window.open(). rozszerzenie zawiera dodatkowe pliki HTML.

Rozszerzenie, które korzysta z działania na stronie i wyskakującego okienka, może używać elementu deklaratywnego Content API, aby ustawić reguły w skrypcie działającym w tle, które będą działać, gdy wyskakujące okienko dostępnych dla użytkowników. Po spełnieniu warunków skrypt działający w tle komunikuje się z wyskakującym okienkiem. aby użytkownicy mogli ją kliknąć.

Okno przeglądarki zawierające działanie strony wyświetlające wyskakujące okienko

Skrypty treści

Rozszerzenia, które odczytują lub zapisują dane na stronach internetowych, korzystają ze skryptu treści. skrypt content zawiera kod JavaScript, który jest wykonywany w kontekście strony, która została wczytana do z przeglądarki. Skrypty treści odczytują i modyfikują DOM stron internetowych odwiedzanych przez przeglądarkę.

Okno przeglądarki z działaniem związanym ze stroną i skryptem treści

Skrypty treści mogą komunikować się z rozszerzeniem nadrzędnym przez wymianę wiadomości i przechowywanie wartości za pomocą interfejsu API storage.

Pokazuje ścieżkę komunikacji między skryptem treści a rozszerzeniem nadrzędnym

Strona opcji

Dzięki rozszerzeniom użytkownicy mogą dostosowywać przeglądarkę Chrome, podobnie jak strona opcji. umożliwia dostosowanie rozszerzenia. Opcje pozwalają włączać funkcje i umożliwiać użytkownikom wybrać, która funkcjonalność odpowiada ich potrzebom.

Korzystanie z interfejsów API Chrome

Oprócz tego, że mają dostęp do tych samych interfejsów API, co strony internetowe, rozszerzenia mogą również używać interfejsy API dla rozszerzeń, które zapewniają ścisłą integrację z przeglądarką. Rozszerzenia strony internetowe mogą korzystać ze standardowej metody window.open() do otwierania adresu URL, ale rozszerzenia – określ, w którym oknie ma być wyświetlany adres URL, używając interfejsu API Chrome tabs.create.

Metody asynchroniczne i synchroniczne

Większość metod interfejsu API Chrome jest asynchronicznych: powracają natychmiast, bez oczekiwania na operację. aby zakończyć. Jeśli rozszerzenie musi znać wynik operacji asynchronicznej, może przekazać funkcji wywołania zwrotnego do metody. Wywołanie zwrotne jest wykonywane później, prawdopodobnie znacznie później, po .

Jeśli rozszerzenie musiało przejść do nowej karty z aktualnie wybranej przez użytkownika karty do nowego adresu URL, musi wykonać te czynności: pobierz identyfikator bieżącej karty, a następnie ustaw nowy URL na tej karcie.

Jeśli metoda tabs.query jest synchroniczna, może wyglądać mniej więcej tak:

//THIS CODE DOESN'T WORK
var tab = chrome.tabs.query({'active': true}); //WRONG!!!
chrome.tabs.update(tab.id, {url:newUrl});
someOtherFunction();

Ta metoda się nie uda, ponieważ interfejs query() jest asynchroniczny. Urządzenie powraca bez czekania na pracę. i nie zwraca żadnej wartości. Metoda jest asynchroniczna, gdy parametr wywołania zwrotnego to dostępnych w podpisie.

// Signature for an asynchronous method
chrome.tabs.query(object queryInfo, function callback)

Aby prawidłowe zapytanie dotyczące karty i aktualizowanie jej adresu URL były prawidłowe, rozszerzenie musi używać parametru wywołania zwrotnego.

//THIS CODE WORKS
chrome.tabs.query({'active': true}, function(tabs) {
  chrome.tabs.update(tabs[0].id, {url: newUrl});
});
someOtherFunction();

W powyższym kodzie wiersze są wykonywane w tej kolejności: 1, 4, 2. Funkcja wywołania zwrotnego określone jako query() jest wywoływane i wykonuje wiersz 2, ale dopiero po informacjach na temat dostępna jest obecnie wybrana karta. Dzieje się tak jakiś czas po powrocie aplikacji query(). Chociaż Komponent update() jest asynchroniczny. Kod nie korzysta z parametru wywołania zwrotnego, bo rozszerzenie tego nie robi na wynik aktualizacji.

// Synchronous methods have no callback option and returns a type of string
string chrome.runtime.getURL()

Ta metoda synchronicznie zwraca adres URL jako metodę string i nie wykonuje żadnej innej operacji asynchronicznej.

Więcej szczegółów

Więcej informacji znajdziesz w dokumentacji interfejsu API Chrome i obejrzyj te materiały: film.

Komunikacja między stronami

Różne komponenty rozszerzenia często muszą się ze sobą komunikować. Różne strony HTML mogą się odnaleźć za pomocą metod chrome.extension, takich jak getViews() i getBackgroundPage(). Jeśli strona zawiera odwołanie do innych stron rozszerzeń, pierwsza z nich może wywoływanie funkcji na innych stronach i manipulowanie ich DOM. Dodatkowo wszystkie komponenty może uzyskać dostęp do wartości przechowywanych przy użyciu interfejsu API storage i komunikować się za pomocą: przekazywanie wiadomości.

Zapisywanie danych i tryb incognito

Rozszerzenia mogą zapisywać dane za pomocą interfejsu API storage oraz Web Storage API lub wysyłanie żądań do serwera , które skutkują zapisywaniem danych. Gdy rozszerzenie musi coś zapisać. Najpierw zastanów się, czy nie pochodzi z okna incognito. Domyślnie rozszerzenia nie działają w oknach incognito.

Tryb incognito powoduje, że okno nie pozostawia żadnych śladów. W przypadku danych z: w oknach incognito, rozszerzenia powinny spełniać tę obietnicę. Jeśli rozszerzenie zwykle zapisuje przeglądanie historię, nie zapisuj historii z okien incognito. Rozszerzenia mogą jednak zapisywać ustawienia ustawienia w dowolnym oknie – incognito lub nie.

Aby wykryć, czy okno jest w trybie incognito, sprawdź właściwość incognito odpowiedniej tabs.Tab lub windows.Window.

function saveTabData(tab) {
  if (tab.incognito) {
    return;
  } else {
    chrome.storage.local.set({data: tab.url});
  }
}

Kolejny krok

Po przeczytaniu omówienia i ukończeniu samouczka Pierwsze kroki możesz powinni być gotowi zacząć tworzyć własne rozszerzenia. Zanurz się głębiej w świat w Chrome z tymi zasobami.

  • Więcej informacji o dostępnych opcjach debugowania rozszerzeń znajdziesz w sekcji Debugowanie .
  • Rozszerzenia do Chrome mają dostęp do zaawansowanych interfejsów API wykraczających poza możliwości otwartego internetu. Chrome.* w dokumentacji interfejsów API.
  • W sekcji Omówienie tworzenia rozszerzeń znajdziesz dziesiątki dodatkowych linków do sekcji: dokumentację dotyczącą tworzenia rozszerzeń zaawansowanych.