برنامه نویسی

همگام سازی وضعیت برنامه های افزودنی Chrome – انجمن DEV

نحوه استفاده از رویدادهای سفارشی برای همگام‌سازی حالت بین نمونه‌های برنامه افزودنی Chrome

معرفی

این ادامه مقاله قبلی در مورد ایجاد یک برنامه افزودنی کروم با استفاده از Svelte و Tailwind است. این مقاله بر روی افزودن یک صفحه گزینه ها به برنامه افزودنی تمرکز می کند.

مشکل

هنگامی که یک عمل در یک نمونه از افزونه انجام می شود، داده ها به طور خودکار همگام سازی نمی شوند. به عنوان مثال، اگر کاربر تعداد را در یک برگه به ​​روز کند، محتوای برگه های دیگر به طور خودکار به تغییرات واکنش نشان نمی دهد.

همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

راه اندازی پروژه

مخزن را از وبلاگ قبلی کلون کنید

ساده ترین راه استفاده از degit است.

npx degit codegino/svelte-tailwind-chrome-plugin#02-options my-target-folder
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dependencies را نصب کرده و اپلیکیشن را اجرا کنید

cd my-target-folder
npm install
npm run dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مدیریت ارتباطات رویداد

این مقاله بر روی استفاده از رویدادهای سفارشی برای اجازه دادن به ارتباط افزونه تمرکز خواهد کرد. برای کسب اطلاعات بیشتر در مورد مدیریت سایر رویدادها، اسناد api را بررسی کنید.

برای ایجاد رویدادهای سفارشی خود، می‌توانیم از chrome.runtime API استفاده کنیم. Runtime API راهی برای ارسال پیام بین بخش های مختلف برنامه افزودنی فراهم می کند.

در اینجا مراحلی وجود دارد که می توانیم هنگام ایجاد رویدادهای سفارشی دنبال کنیم:

  1. راه اندازی یک رویداد (الزامی)
  2. افزودن شنونده رویداد (الزامی)
  3. پاسخ شنوندگان را مدیریت کنید
  4. رسیدگی به خطای اتصال
  5. قطع اتصال را کنترل کنید

1. یک رویداد را آغاز کنید

این مرحله شامل دو تغییر است. ابتدا باید اعلان تابع را به an تغییر دهیم async/await نحو، بنابراین خواندن آن در آینده آسان تر خواهد بود. دوم، ما باید یک پیام با مقداری محموله ارسال کنیم.

محموله می تواند هر چیزی باشد. در این مثال، من یک را اضافه کردم type ویژگی به محموله برای شناسایی رویداد در شنونده رویداد.

// src/components/Counter.svelte
<script lang="ts">
  export let count: number;
  let message: string = null;

  const increment = () => (count += 1);
  const decrement = () => (count -= 1);


-  const handleSave = () => {
-    chrome.storage.sync.set({ count }).then(() => {
-      message = "Updated!";
-
-      setTimeout(() => {
-        message = null;
-      }, 2000);
-    });
-  };
+  const handleSave = async () => {
+    await chrome.storage.sync.set({ count });
+    message = "Updated!";
+
+    // This is the only different behavior
+    await chrome.runtime.sendMessage({count, type: "count_updated"});
+
+    setTimeout(() => {
+      message = null;
+    }, 2000);
+  };
</script>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. شنونده رویداد اضافه کنید

از آنجایی که ما از Svelte استفاده می کنیم، می توانیم از آن استفاده کنیم onMount قلاب برای اضافه کردن شنونده.

// src/components/Counter.svelte
<script lang="ts">
+  import { onMount } from "svelte";

  export let count: number;
  let message: string = null;


+  onMount(() => {
+    chrome.runtime.onMessage.addListener(handleMessageEvent);
+  });
+
+  function handleMessageEvent(request, _, sendResponse) {
+    if (request.type === "count_updated") {
+      count = request.count;
+    }
+  }

  const increment = () => (count += 1);
  const decrement = () => (count -= 1);

  const handleSave = async () => {
    await chrome.storage.sync.set({ count });
    message = "Updated!";

    await chrome.runtime.sendMessage({count, type: "count_updated"});

    setTimeout(() => {
      message = null;
    }, 2000);
  };
</script>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از اضافه کردن شنونده، می بینیم که شمارش در همه تب ها به روز می شود.
1678118854 834 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

به راحتی می توان تأیید کرد که در پنجره بازشو نیز کار می کند زیرا ما از همان مؤلفه استفاده می کنیم.
1678118855 536 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

3. پاسخ شنوندگان را مدیریت کنید

در کنترل کننده رویداد، می توانیم a را فراخوانی کنیم sendResponse عملکرد با باری که می خواهیم به فرستنده برگردانیم. در این مثال، من تغییر در مقدار شمارش را پس می فرستم.

را sendMessage تابع یک وعده را برمی گرداند. ما می توانیم استفاده کنیم await کلمه کلیدی برای دریافت پاسخ از شنونده. در این مثال، من به سادگی پاسخ را به پیام اضافه می کنم.

// src/components/Counter.svelte
function handleMessageEvent(request, _, sendResponse) {
  if (request.type === "count_updated") {
+    sendResponse({ message: `from ${count} to ${request.count}` });
    count = request.count;
  }
}

const handleSave = async () => {
  await chrome.storage.sync.set({ count });
  message = "Updated!";


-  await chrome.runtime.sendMessage({count, type: "count_updated"});
+  const res = await chrome.runtime.sendMessage({count, type: "count_updated"});
+  message += ` ${res.message}`;

  setTimeout(() => {
    message = null;
  }, 2000);
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ اکنون در انتهای پیام موفقیت است.
1678118855 295 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

4. خطای اتصال را کنترل کنید

در صورتی که فقط یک نمونه از پلاگین در حال اجرا داشته باشیم، sendMessage تابع یک خطا ایجاد می کند. همچنین پیام موفقیت Updated! همیشه قابل مشاهده خواهد بود زیرا به کد مخفی کردن پیام دسترسی نخواهد داشت.

1678118855 291 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

ما می توانیم خطا را با بسته بندی کردن کنترل کنیم sendMessage در یک try/catch مسدود کردن.

// src/components/Counter.svelte
  const handleSave = async () => {
    await chrome.storage.sync.set({ count });
    message = "Updated!";


-    const res = await chrome.runtime.sendMessage({count, type: "count_updated"});
-    message += ` ${res.message}`;
+    try {
+      const res = await chrome.runtime.sendMessage({count, type: "count_updated"});
+      message += ` ${res.message}`;
+    } catch (error) {
+      // Handle error here
+      console.log("TODO:", error);
+    }

    setTimeout(() => {
      message = null;
    }, 2000);
  };
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکته جانبی: خطای اتصال را با تماس پاسخ دهید

اگر به هر دلیلی از تماس برگشتی استفاده می کنید، باید صریحاً خطا را بررسی کنید.

// src/components/Counter.svelte
const handleSave = async () => {
  await chrome.storage.sync.set({ count });
  message = "Updated!";

  chrome.runtime.sendMessage({count, type: "count_updated"},
    (res) => {
      const lastError = chrome.runtime.lastError;

      // This conditional check is important to remove the error
      if (lastError) {
        // Handle error here
        console.log("TODO:", lastError.message);
        return;
      }
      message += ` ${res.message}`;
    }
  );

  setTimeout(() => {
    message = null;
  }, 2000);
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، خطا به درستی مدیریت می‌شود و کد مخفی کردن پیام همچنان اجرا می‌شود.
1678118856 136 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

5. لغو اشتراک از شنونده

گاهی لازم است منابع را آزاد کنیم. در این صورت می توانیم از onDestroy قلاب برای حذف شنونده

// src/components/Counter.svelte
import { onDestroy } from "svelte";

// Rest of the code...

onDestroy(() => {
  chrome.runtime.onMessage.removeListener(handleMessageEvent);
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک جایگزین این است که یک تابع را از onMount قلاب. این تابع زمانی فراخوانی می شود که کامپوننت از بین برود.

// src/components/Counter.svelte
// Rest of the code...

onMount(() => {
  chrome.runtime.onMessage.addListener(handleMessageEvent);

  return () => {
    chrome.runtime.onMessage.removeListener(handleMessageEvent);
  };
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای ساده کردن نسخه نمایشی حذف شنونده، من شنونده را پس از 4 ثانیه که کامپوننت نصب شد حذف می کنم.

// src/components/Counter.svelte
onMount(() => {
  chrome.runtime.onMessage.addListener(handleMessageEvent);

  // For demo purposes only
  setTimeout(() => {
    chrome.runtime.onMessage.removeListener(handleMessageEvent);
  }, 4000);

  return () => {
    chrome.runtime.onMessage.removeListener(handleMessageEvent);
  };
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دیگر زبانه ها گوش نمی دهند count_changed رویداد، و خطایی وجود خواهد داشت زیرا کسی گوش نمی دهد.
1678118856 279 همگام سازی وضعیت برنامه های افزودنی Chrome انجمن DEV

مخزن

کد منبع را اینجا بررسی کنید

بعدش چی

  • [ ] یک اسکریپت محتوا اضافه کنید
  • [ ] یک اسکریپت پس زمینه اضافه کنید
  • [ ] یک صفحه ابزار توسعه دهنده اضافه کنید
  • [ ] در حال استقرار پسوند

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا