Галоўная / Артыкулы

Створыце бізнес з расширэнням Chrome Manifest V3, якое будзе выжываць пасля признэчэння ў стан адкладэння

Адаптавайце MV3 поп-апы, скрыпты з контентам і тымчасовых службавых працоўнікаў з аднойчыным збераганням дадзеных через chrome.storage, правамі на адпаведны доступ з боку сервера і разрэшэннямі, прыемнымі для магазіна.

Выдавец: REACTAPP.TOP6 хв чытання1460 слоў

Крыніцы: Building a Chrome Extension Business: Architecture, APIs, and Hard Lessons

Для стварэння стартовай сторонкі SaaS можа знадобіцца калькі месцаў на домэнах, робота з базамі дадзеных і апрацоўка процэса аутаналізацыі, прычаму паказваецца мাতра дзесятак адвітачоў. Расширэнняя браузера змінююць гэтыя правілы. Chrome Web Store вучоўна працюе як магазін дапаможных прыемас: людзі шукаюць інструменты, якія усунуць працоўныя труднасці ў GitHub, LinkedIn чым Gmail, і корисны элемент можа дасягнуць першых тысяч актыўных корыстнікаў практычна без якога-лібо платнага прыему.

Адправка рэальнага продукту через гэты канал все ж такі выклікае большых працоў, чым проста стварэнне файла manifest.json і скрыпты для контэнту. Расширэнняя падлягаюць абмежэнням дыстрыбуіраваных систем: мяркавы бюджет памяці, тымчасовыя фонавыя працоўнікі, кліенты, якія можа распакаваць кожны, а таксама затрымкі у пераглядзе атласах магазіна. Для стабільнай роботы неабходны як чыстая бізнес-модэль, так і чытка карта меж рантайма Chrome.

Архітектура расширэння: Manifest V3

Надзеянасць працы продукту пачынаецца з таго, як Chrome ізалюе контэксты пад Manifest V3 (MV3). Расшырэнне зазвычай складаецца з трох пакетаў:

  1. Вікна падметаў і апцыяны: Звычайны HTML/CSS/JS, які працуе толькі калі відкрыта вікна падметаў або сторынка апцыянаў, а потым заканчвае сваю роботу, калі корыстнік пакідае яго.
  2. Скрыпты кантэнту: Скрыпты, якія вводзяцца ў сторынкі, якія падпадаюць пад шаблоны маніфеста. Яны можу чытаць і зменяць DOM хоста, але працуюць у ізалюеваным свете: існуе спяльны DOM, але няма спяльных глобальных зменных JavaScript з сторынкай.
  3. Рабочы процес у фоне: Коордынатор, які не мае доступу да DOM. Ён керуе запускамі супэрвізора, сетевымі запытамі, локальным кэшам і ведае справу з вашым бэкендам.
+-------------------------------------------------------------+
|                        Browser                              |
|                                                             |
|  +---------------------+        +------------------------+  |
|  |    Content Script   |        |   Popup / Options UI   |  |
|  |  (Reads/Mutates DOM)|        | (Short-lived HTML/JS)  |  |
|  +----------+----------+        +-----------+------------+  |
|             |                               |               |
|             |  chrome.runtime.sendMessage() |               |
|             +--------------+----------------+               |
|                            |                                |
|                            v                                |
|             +-------------------------------+               |
|             |    Background Service Worker  |               |
|             |   (Stateless, Event-driven)   |               |
|             +---------------+---------------+               |
+-----------------------------|-------------------------------+
                              | fetch()
                              v
              +-------------------------------+
              |         Your Backend          |
              |   (Auth, Billing, Database)   |
              +-------------------------------+

Сутэчныя змены ў MV3 заключаюцца у тым, што рабочыя процесы на фоне ўяўляюць сабою тымчасовыя элементы. Старэйшыя версіі Manifest V2 дазволялі стороннім страницам застаўляцца ў памяці; MV3 зазвычай призначае на паузу некіроўваныя рабочыя процесы пасля працэсу прыблізна трыдцяти секундаў, каб захаваць RAM.

Будзь-які токен або лічылка, якія зберагаюцца толькі ў глобальных данных рабочага процесу, зникаюць, калі Chrome паводзіць ся з гэтым процесам як з некіроўваным. Данные, якія павінны застацца стойкімі, должны зберагацца в іншым месцы.

Стан і камунікацыя: практычны патэрн

Пакалі некіроўваныя рабочыя процесы зникаюць, стойкі стан павінен зберагацца ў chrome.storage.local або IndexedDB.

Калі автаматызацыя, якая платная, должна выкананыць на сторонній странице, скрыпт кантэнту не должен зберагаць секреты аблікавання чы правяць пераказы на ліцэнзію. Ён должен адправляць запыт рабочаму процесу на фоне, які пераканаеся ў праваменстве сесіі на вашым серверы.

1. Адзначэнне рабочага процесу ў manifest.json

{
  "manifest_version": 3,
  "name": "DataExtractor Pro",
  "version": "1.0.0",
  "permissions": [
    "storage"
  ],
  "host_permissions": [
    "https://api.yourproduct.com/*"
  ],
  "background": {
    "service_worker": "background.js",
    "type": "module"
  },
  "content_scripts": [
    {
      "matches": ["https://*.github.com/*"],
      "js": ["content.js"]
    }
  ]
}

2. Скрыпт кантэнту (content.js)

Адзначыце паведамленне, каб разбудзіць або звяжыцца з працавальнікам:

// content.js
async function runPaidTask() {
  try {
    // Send a message to the background service worker
    const response = await chrome.runtime.sendMessage({
      type: 'VERIFY_AND_EXECUTE',
      payload: { targetElement: '#repo-stars-counter-star' }
    });
    if (!response.success) {
      console.warn('Execution stopped:', response.reason);
      return;
    }    console.log('Action performed successfully:', response.data);
  } catch (error) {
    console.error('Failed to communicate with service worker:', error);
  }
}runPaidTask();

3. Рабочы процес без стану (background.js)

Працавальны процес обрабоўвае паведамленне, чытае сесію з аховача, пераканальваецца ў правыях за дапамогою удалёнага API і адпавядае:

// background.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.type === 'VERIFY_AND_EXECUTE') {
    // Return true to indicate we will respond asynchronously
    handleTaskExecution(message.payload).then(sendResponse);
    return true;
  }
});
async function handleTaskExecution(payload) {
  // Read state from storage, never from memory variables
  const { sessionToken } = await chrome.storage.local.get(['sessionToken']);  if (!sessionToken) {
    return { success: false, reason: 'NOT_AUTHENTICATED' };
  }  try {
    const apiResponse = await fetch('https://api.yourproduct.com/v1/verify', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${sessionToken}`
      },
      body: JSON.stringify(payload)
    });    const result = await apiResponse.json();    if (!result.isSubscribed) {
      return { success: false, reason: 'PAYMENT_REQUIRED' };
    }    return { success: true, data: result.data };
  } catch (err) {
    return { success: false, reason: 'NETWORK_ERROR' };
  }
}

Верненне true з chrome.runtime.onMessage.addListener заставляе канал ачытым для асінхроннага sendResponse. Без гэтаго return true порт закрываецца раней, і вызначальнік бачыць undefined.

Як монетызаваць кліента ў браузере

Частая памылка — размешчанне логікі платежаў аб прав на выкарыстоўвання толькі ў пакете дадатку.

Усё, што доставляецца ў браузер — JavaScript, WebAssembly, локальныя настройкі — можа быць адзірвана, распакавана, зменена і перазаваначана ў режыме разработчыка.

Ніколы не пакладайцеся на пераконтроль з боку кліента для кантролю доступу.

Спрыяйце расширэнню як на ненадзеяны фронтэнд, який ведае справы з удаленым бэкэндам.

Модель монетызацыі Архітэктурная рэалізацыя Практычныя компрэсіі
Freemium SaaS Кліент дадзеўа інтерфейс; важкія задачы выкананы на цэнтральным API Жорсткія правілы і прагнозаваныя ліміты; вышэйшыя косцты хоставання
Bring-Your-Own-Key (BYOK) Пользователь дае ключ аптэкара; одноразовая ліцензыя адкрывае местныя функцыі Низкія косцты вычысленняў; контроль ліцензый важка захаваць ад зворачнай інжынерыі
Падпіскі для каманд/Б2B Функцыі саўмешчання ў інструментах, такіх як Salesforce, Zendesk або Jira Высока гатовасць плаціць; трэба SSO і рэтельны адзірэванне прав

Расчыткі частаюць выкарыстоўвацца сэрвісамі Stripe, Lemon Squeezy або прадаўцамі, які спецыялізуюцца на расширэннях, такімі як ExtensionPay.

Процес платежа не можа выконвалівацца ў простым popup-iframe пад сучаснымі правіламі CSP. Дзеянне “Апгрэйд” должна ачыняць сторанку, якая розмешчаецца на сервере, за дапамою chrome.tabs.create({ url: 'https://yourproduct.com/checkout?user_id=xyz' }). Пасля платежа сервер фіксуе выбраны план, а працоўні кантэйнер апдэйтуе права на выкарыстоўванне плану пад час наступнай сінхронізацыі.

Скрытая тэхнічная рэальнасць

Першыя большы апдэйты для тыяў тысяч установак выявілі тры постацэйныя прыганчыкі.

1. Нестабільнасць цэлевага хоста

Інтеграцыя з LinkedIn, Jira або падобнымі продуктамі значыць, што вы не контролюеце слой візуальнага адображэння. Змена назвы класа з .action-button-v2 на клас-функцыю з хэшам можа за адну ноч прывести да бягучых проблем з выбіраннем элементаў і заполненняя чергі на падтрымку.

Мераў прыбліжэння, якія краща падтрымваюць стабільнасць:

  • Ўважайце рызык злама адказоў CSS, якія ўтвараюцца дзельнікаў.
  • Вярней выбірайце aria-label, стабільныя атрыбуты дадзэнняў чы семантычныя элементы заместа класоў стайлізавання.
  • Адправляйце тэліметрыю пра няудачныя запыты DOM, каб зламы сталі видныя раней, чым пачнуцца серьёзныя проблемы.

2. Акцыя пра перагляд у Web Store

Критычныя практыкі не выкарыстоўваюцца мгновэна. Кожны пакет праходзіць автаматызаваны, а часта і ручны перагляд з боку Google, які можа завершыцца за калькі гадзін чы растягнуцца на калькі рабочых дняў. Няправильна адправлены скрыпт з контэнтом нельга вярнуць у працездатны стан простым аплывам у продакшн.

Зменшыце труднасці перагляду, як:

  • Запрашайце самыя мінімальныя права. Шырокі атрыбут <all_urls> спрыяе медленнейшай перапрацоўке з боку абэргавання; вярней выбірайце конкрэтныя хосты, напрыклад https://github.com/*.
  • Ўзаць eval() і завантажэнне скрыпта з даўальных выкананняў не трэба. MV3 забараняе выкананне коду з даўальных выкананняў; логіку трэба размесціваць унутры пакета.
  • 3. Кліентскія пакеты можна адгэнераваць

    Файлы расширэнняя, якія быўць установленыя, знаходзяцца на дыску ў катэгорыі Extensions прафіля Chrome. Загадчаванне спамячвае простае чытанне; аднак гэта не заважае людям знаходзіць канчатковыя пункты, выкарыстоўваць захаваныя секрэты чы рэдагаваць локальныя умовы if (isPaidUser).

    Проектаваць так, як будзе адкрыты код кліента. Автентыфікуваць вызовы API за дапамойкай JWT-аў чы кукусоў сесіі і ўсё час пераканваліцца ў правах на серверы.

    Калі ствараць расширэнне (і калі яго ужо не ствараць)

    Расширэнняя падходзяць, калі:

    • Вы паспрабоўваеце паўнэчысці існуючы процес: Карыстувальнікі застаюцца ў Gmail, GitHub чы Notion, а вы дадаеце новыя можлівасці пры тым.
  • Актуальны ўсе абставіны: Продукт павінен маты можлівасць рэальнага доступу да таго, што чытае або рэдагуе ўжо корыстнік.
  • Адкупаванне павінна застацца дышэчным: Чытальна анкета магазіна можа прывабіць корыстнікаў, якія шукаюць конкрэтны продукт.
  • Не викорыстоўвайце такі модель, калі:

    • Вам патрэбны глыбокія правы ўправленьвання ОС: Расшырэнні не можу свабодна выкарыстоўваць локальную систему файлаў або працаваць пасля закрыцьця браузера.
    • Рызыкі, якія несе платформа, ўжо непрыемныя: Правіла маніфеста, прыоритэты та правілы можу вымусіць раптовыя змены.

    Магазін ўособліва канал дыстрыбуцыі, а не проста пячорка для падпрыемных проектаў. Пашанавайце межы ізоляціі, праектаваўцы, вядзічы пры ўжыванні безстацыйных рабочых процэсаў, а пераверкі трэба выкананы на серверах; саме такая комбінацыя ператварае расширэнне на стойкі продукт, а не на хвороблівы скрыпт. Команды, якія з самага пачатку прыймаюць гэтыя абмежэння, витрачаюць менш часу на борьбу з чергамі перагляду та неспакою, вызванымі зламамі DOM пазней.