Перейти к содержанию

Версии и передача пакета расширения

Оглавление серии

Последний снимок «Заметок читателя» содержит ввод, пользовательское чтение вкладки, проверенные сообщения, local, настройки, JSON-перенос и поиск. Теперь подготовим договор передачи. Результат — понятный набор файлов и границ, который другой человек может изучить самостоятельно. Публикация в Chrome Web Store, установка расширения, действия с аккаунтами и запуск браузерного профиля в ходе подготовки не выполнялись.

Версия manifest меняется на 0.2.0, поскольку пакет получил законченный учебный интерфейс. Это наш номер состояния, а не заявление о размещении релиза в магазине. JSON-формат заметок остаётся version=1, протокол сообщения также version=1. Три числа похожи внешне, но обозначают разные договоры. Если интерфейс изменится без изменения данных, новый номер пакета не обязан менять импорт. Если поменяется структура записи, одного увеличения manifest.version для её безопасного чтения недостаточно.

Полный каталог вместо случайной смеси

Выберите lesson-12 целиком. Manifest ссылается на popup.html, worker.js и options.html, а эти страницы импортируют существующие локальные файлы. Data.js содержит общие проверки. Content.js предназначен только для выполнения в выбранной вкладке. Style.css задаёт простое оформление. Смешивание раннего manifest с поздним worker может оставить отсутствующее разрешение storage, а ранний HTML может не содержать поле поиска, которого ждёт новый JavaScript. Полнота снимка означает согласованность этих ссылок.

В проекте нет npm, node_modules, сборщика и удалённых библиотек. JavaScript уже находится в файловом виде, который читает браузер. Поэтому ZIP содержит исходники, а не скомпилированный продукт скрытого build-процесса. Это облегчает учебное чтение, но не является доказательством работы во всех браузерах. Список пакетов и lockfile не нужны для отсутствующих зависимостей; мы не создаём фиктивный lockfile только ради привычного вида современного проекта.

Данные пользователя не входят в учебный пакет. Reader-notes.json создаётся самим читателем после сохранения его коллекции. Архив уроков содержит только авторские файлы и вымышленные пояснения. Установленное расширение получит собственную local-область; перенос исходников не переносит автоматически уже существующие записи чужого профиля. Такая граница важна для совместного изучения: можно обмениваться кодом, не собирая историю и заметки остальных участников.

Полные файлы шага

Показанные файлы полностью совпадают с выбранным состоянием архива. Остальные согласованные файлы находятся в examples/browser-extension-lab/lesson-12/.

manifest.json

{
  "manifest_version": 3,
  "name": "Заметки читателя",
  "version": "0.2.0",
  "minimum_chrome_version": "102",
  "description": "Локальные заметки о самостоятельно выбранных страницах",
  "action": {
    "default_popup": "popup.html",
    "default_title": "Заметки читателя"
  },
  "background": {
    "service_worker": "worker.js",
    "type": "module"
  },
  "permissions": [
    "activeTab",
    "scripting",
    "storage"
  ],
  "options_ui": {
    "page": "options.html",
    "open_in_tab": true
  }
}

DELIVERY.md

# Передача Заметок читателя

Статус: not_run. Расширение не устанавливалось и не публиковалось.
Chrome Manifest V3; минимальный API-профиль 102 из-за storage.setAccessLevel.
Это объявление нижней границы API, а не результат проверки в Chrome 102.
Используйте поддерживаемый актуальный Chrome в собственном учебном профиле.
Нет npm, сборщика, сервера, удалённых библиотек и lockfile.

Для самостоятельного исследования читатель выбирает этот полный каталог
через Load unpacked на chrome://extensions в своём локальном профиле.
После редактирования обновляются расширение и открытые popup/options.
Модель Firefox требует отдельного manifest и проверки background/messaging;
замена chrome на browser не доказывает переносимость всего пакета.

Ручной сценарий: собственная обычная страница, выделение фразы, заметка,
закрытие popup, открытие повторно, экспорт, повторный импорт без дублей,
отказ на служебной странице и отсутствие исполнения HTML в заголовке.
Сценарии не выполнялись автором. Публикация в магазине не проводилась.
Данные пользователя не входят в исходники. JSON-экспорт хранится у читателя.
Изменение version не мигрирует пользовательские данные; format/version JSON
и версия расширения являются разными контрактами.

Ожидаемый результат

Это ожидаемый договор для самостоятельного исследования; расширение не устанавливалось и не запускалось.

Пакет: manifest.version = 0.2.0
Данные экспорта: version = 1
Сообщения: version = 1
Платформа: Chrome Manifest V3, API baseline 102; полная совместимость не испытывалась.
Статус: not_run, публикации не было.

Версии платформы

minimum_chrome_version=102 связан с документированным storage.setAccessLevel. Он не означает фактическую проверку полного приложения в Chrome 102. Для самостоятельного исследования используйте поддерживаемый актуальный Chrome и собственный учебный профиль. APIs и ограничения сверены с первичной документацией на дату подготовки, но расширение не устанавливалось и сценарии не выполнялись. В DELIVERY.md эта граница сохранена явно, чтобы передача не превратила ожидаемые ответы в отчёт наблюдения.

Chrome Manifest V3 является выбранной платформой курса. Firefox WebExtensions имеет связанные возможности, но иной договор некоторых manifest и background-механизмов. Перенос потребует отдельного manifest, анализа фонового контекста, доступных методов и сообщений. Просто заменить chrome на browser недостаточно для обещания совместимости. Мы не выпускаем Firefox-пакет и не пишем, что текущий ZIP подходит ему без изменений. Общие идеи проверки данных и безопасного DOM остаются полезными, но платформенные детали нужно подтверждать отдельно.

Правила messaging также могут различаться по версиям. Показанный listener использует sendResponse и literal true для асинхронной работы, а известные ошибки возвращает в собственной оболочке ok=false. Это поддерживает ясный договор без опоры на новые варианты распространения исключений. Однако технический отказ канала остаётся возможным. Popup и options ловят его отдельно. Version сообщения контролирует наш протокол, не весь набор поведения браузера, поэтому соответствующее число не является универсальной платформенной проверкой.

Ожидаемые самостоятельные сценарии

DELIVERY.md предлагает reader выбрать полный каталог через Load unpacked в своём локальном профиле. После изменения файлов обновляются расширение и открытые страницы интерфейса. Это инструкции для читателя, не перечисление выполненных автором действий. Мы не устанавливали пакет, не открывали аккаунт магазина и не проходили процедуру публикации. Даже локальная установка создала бы новое свидетельство, которое не следует задним числом приписывать нынешнему исходнику.

Самостоятельный положительный путь начинается с собственной обычной страницы: выделить фразу, написать заметку, выполнить SAVE, закрыть popup и открыть снова. Ожидается прежняя запись из local. Затем экспортировать JSON, импортировать его повторно и увидеть skipped без дублей UUID. Поиск должен фильтровать экран, не удаляя записи. Настройка URL должна влиять только на новые SAVE. Эти сценарии связаны с конкретными результатами прежних глав, а не с общим перечнем функций без исходного состояния.

Есть и содержательные отказы: служебная страница недоступна; неизвестная команда не даёт privileged действия; неправильный импорт не записывается; чужая HTML-похожая строка выводится буквально. Для SAVE после потери ответа повтор может создать второй UUID, поскольку отдельной идемпотентности этой операции нет. Для IMPORT повтор того же набора использует устойчивые id и пропускает существующие элементы. Это разные договоры, и последняя глава не объединяет их ложным обещанием «любые действия всегда безопасно повторять».

Передача объясняет ограничения

Service worker остаётся краткоживущим. Очередь Promise не переживает его остановку, а local хранит только уже завершённые записи. Background не имеет DOM; Blob и ссылка экспорта находятся в options. В content script нет произвольного мостика к API расширения. TextContent сохраняет строки текстом. Эти ограничения являются частью учебного результата, поскольку позволяют другому автору расширять проект, не разрушая уже объяснённые границы контекстов и данных.

Полный manifest и DELIVERY.md показаны на этой странице, остальные файлы находятся в том же lesson-12. Архив включает двенадцать самостоятельных состояний, README и обозначение not_run. Мы получили небольшой локальный инструмент с одной развивающейся моделью заметки и честным договором переноса. Дальнейшее развитие может добавить редактирование, удаление и миграцию данных, но эти операции требуют новых самостоятельных результатов. Текущий пакет уже конкретен для редакционного просмотра и собственного исследования без обещания невыполненного выпуска.

Проверенное чтение первичных API полезно перед передачей, но имеет иной смысл, чем наблюдение установленного пакета. Мы можем сопоставить имена методов, разрешения и форму callback с документацией, не получая измеренную работу конкретного браузера. Поэтому исходники и ожидаемые сценарии передаются вместе со статусом not_run. Читатель видит, где начинается его самостоятельное исследование, и может записать собственные версии и наблюдения отдельно. Такая граница сохраняет доверие к учебному материалу без выдуманных скриншотов или заявления о завершённой публикации.

Документация и исходники

Механизмы главы сверены с первичными источниками: документация 1, документация 2, документация 3. Полный архив «Заметок читателя» содержит все двенадцать состояний. Установка, запуск и публикация не выполнялись.