Use Cases

Cara Mengembangkan Browser Extension dengan Claude Code

Pelajari cara mengembangkan browser extension menggunakan Claude Code. Dilengkapi contoh kode praktis dan panduan langkah demi langkah.

Mempercepat Pengembangan Browser Extension dengan Claude Code

Pengembangan Chrome extension membutuhkan banyak pengetahuan seperti spesifikasi Manifest V3, content script, background service worker, dan popup UI. Dengan Claude Code, semua ini bisa di-generate hanya dengan instruksi dalam bahasa alami.

Setup Awal Project

> Buat project Chrome extension.
> Dengan Manifest V3, konfigurasi menggunakan popup screen dan content script.
> Bisa di-build dengan TypeScript + Vite.

Contoh manifest.json yang di-generate Claude Code:

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "description": "Chrome extension dibuat dengan Claude Code",
  "permissions": ["storage", "activeTab"],
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icons/icon16.png",
      "48": "icons/icon48.png",
      "128": "icons/icon128.png"
    }
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"],
      "css": ["content.css"]
    }
  ],
  "background": {
    "service_worker": "background.js",
    "type": "module"
  }
}

Implementasi Popup UI

Popup yang ditampilkan saat mengklik ikon extension.

// popup.ts
interface Settings {
  enabled: boolean;
  highlightColor: string;
  fontSize: number;
}

const defaultSettings: Settings = {
  enabled: true,
  highlightColor: "#ffeb3b",
  fontSize: 14,
};

async function loadSettings(): Promise<Settings> {
  const result = await chrome.storage.sync.get("settings");
  return { ...defaultSettings, ...result.settings };
}

async function saveSettings(settings: Settings) {
  await chrome.storage.sync.set({ settings });
  // Notifikasi perubahan pengaturan ke content script
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  if (tab.id) {
    chrome.tabs.sendMessage(tab.id, { type: "SETTINGS_UPDATED", settings });
  }
}

document.addEventListener("DOMContentLoaded", async () => {
  const settings = await loadSettings();

  const enabledCheckbox = document.getElementById("enabled") as HTMLInputElement;
  const colorInput = document.getElementById("color") as HTMLInputElement;
  const fontSizeInput = document.getElementById("fontSize") as HTMLInputElement;

  enabledCheckbox.checked = settings.enabled;
  colorInput.value = settings.highlightColor;
  fontSizeInput.value = String(settings.fontSize);

  enabledCheckbox.addEventListener("change", () => {
    settings.enabled = enabledCheckbox.checked;
    saveSettings(settings);
  });

  colorInput.addEventListener("input", () => {
    settings.highlightColor = colorInput.value;
    saveSettings(settings);
  });

  fontSizeInput.addEventListener("input", () => {
    settings.fontSize = parseInt(fontSizeInput.value);
    saveSettings(settings);
  });
});

Implementasi Content Script

Content script yang memanipulasi konten halaman web. Di sini kita mengimplementasikan fitur highlight teks di halaman.

// content.ts
let settings: Settings = {
  enabled: true,
  highlightColor: "#ffeb3b",
  fontSize: 14,
};

function highlightText(searchTerm: string) {
  if (!settings.enabled || !searchTerm) return;

  const walker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_TEXT,
    null
  );

  const matches: { node: Text; index: number }[] = [];

  while (walker.nextNode()) {
    const node = walker.currentNode as Text;
    const index = node.textContent?.toLowerCase().indexOf(searchTerm.toLowerCase()) ?? -1;
    if (index !== -1) {
      matches.push({ node, index });
    }
  }

  matches.reverse().forEach(({ node, index }) => {
    const range = document.createRange();
    range.setStart(node, index);
    range.setEnd(node, index + searchTerm.length);

    const highlight = document.createElement("mark");
    highlight.style.backgroundColor = settings.highlightColor;
    highlight.className = "ext-highlight";
    range.surroundContents(highlight);
  });
}

function clearHighlights() {
  document.querySelectorAll(".ext-highlight").forEach((el) => {
    const parent = el.parentNode;
    if (parent) {
      parent.replaceChild(document.createTextNode(el.textContent || ""), el);
      parent.normalize();
    }
  });
}

// Listener pesan
chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
  if (message.type === "HIGHLIGHT") {
    clearHighlights();
    highlightText(message.term);
    sendResponse({ success: true });
  }
  if (message.type === "SETTINGS_UPDATED") {
    settings = message.settings;
  }
});

Implementasi Background Service Worker

// background.ts
chrome.runtime.onInstalled.addListener(() => {
  // Tambahkan context menu
  chrome.contextMenus.create({
    id: "highlight-selection",
    title: "Highlight teks yang dipilih",
    contexts: ["selection"],
  });
});

chrome.contextMenus.onClicked.addListener(async (info, tab) => {
  if (info.menuItemId === "highlight-selection" && tab?.id) {
    await chrome.tabs.sendMessage(tab.id, {
      type: "HIGHLIGHT",
      term: info.selectionText,
    });
  }
});

Tentang perbedaan dengan pengembangan CLI tool, lihat Pengembangan CLI Tool. Untuk cara menulis prompt yang efisien, lihat 10 Tips untuk Melipatgandakan Produktivitas 3x.

Summary

Dengan Claude Code, pengembangan Chrome extension bisa dipercepat secara signifikan, mulai dari pengaturan Manifest V3 hingga UI, content script, dan background worker. Serahkan kompleksitas spesifikasi ke Claude Code dan fokus pada ide fitur.

Untuk detail, lihat Dokumentasi Resmi Claude Code.

#Claude Code #browser extension #Chrome extension #Manifest V3 #JavaScript