Общие модули

Общие модули — это коллекции ресурсов без разрешений, которые могут использоваться другими расширениями и приложениями совместно. Общие способы использования общих модулей:

  • В качестве API. Вы можете распространять общий модуль, который может предоставлять HTML, JS и другие источники для предоставления API, который можно обновлять независимо от зависящих от него расширений. Это может быть полезно для сред выполнения и игровых движков, где приложения часто представляют собой меньшие по объему полезные данные, выполняемые на коде общего модуля.
  • В качестве оптимизации загрузки. Общий модуль содержит общие ресурсы, используемые многими расширениями. Он загружается один раз, при первой установке зависимого расширения.

Манифест

Общие модули используются через два поля манифеста : экспорт и импорт.

Поле экспорта указывает, что расширение является общим модулем, который экспортирует свои ресурсы:

{
  "version": "1.0",
  "name": "My Shared Module",
  "export": {
    // Optional list of extension IDs explicitly allowed to
    // import this Shared Module's resources.  If no allowlist
    // is given, all extensions are allowed to import it.
    "allowlist": [
      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    ]
  }
  // Note: no permissions are allowed in Shared Modules
}

Поле импорта используется расширениями и приложениями, чтобы объявить, что они зависят от ресурсов определенных общих модулей:

{
  "version": "1.0",
  "name": "My Importing Extension",
  ...
  "import": [
    {"id": "cccccccccccccccccccccccccccccccc"},
    {"id": "dddddddddddddddddddddddddddddddd"
     "minimum_version": "0.5" // optional
    },
  ]
}

Доступ к ресурсам

Доступ к ресурсам общего модуля осуществляется по зарезервированному пути _modules/SHARED_MODULE_ID в корне вашего импортирующего расширения. Например, чтобы включить скрипт «foo.js» из общего модуля с идентификатором «cccccccccccccccccccccccccccccccc», используйте этот путь от корня вашего расширения:

<script src="_modules/cccccccccccccccccccccccccccccccc/foo.js">

Если импортирующее расширение имеет идентификатор «aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa», тогда полный URL-адрес ресурсов в общем модуле:

chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/_modules/cccccccccccccccccccccccccccccccc/

Обратите внимание: поскольку ресурсы из общих модулей накладываются на источник импортирующего расширения, все привилегии, предоставленные импортирующему расширению, доступны для кода в общих модулях. Кроме того, общий модуль может получать доступ к ресурсам в расширении импорта, используя абсолютные пути.

Установить/удалить

Общий модуль автоматически устанавливается из Интернет-магазина Chrome, когда это необходимо зависимому расширению, и автоматически удаляется, когда удаляется последнее расширение, ссылающееся на него. Чтобы загрузить расширение, использующее общий модуль, общий модуль должен быть опубликован в Интернет-магазине Chrome, и расширение не должно быть ограничено в использовании общего модуля в своем белом списке.

Во время разработки вам нужно будет вручную установить все общие модули, которые использует ваше расширение. Автоматическая установка не происходит для расширений, которые загружаются неопубликованно или как распакованные расширения. Для локально установленных и распакованных общих модулей необходимо использовать ключевое поле, чтобы гарантировать, что общие модули используют правильные идентификаторы.