Use Cases

Comment developper des extensions de navigateur avec Claude Code

Apprenez a developper des extensions de navigateur avec Claude Code. Inclut des exemples de code pratiques et un guide etape par etape.

Accelerer le developpement d’extensions de navigateur avec Claude Code

Le developpement d’extensions Chrome necessite de connaitre de nombreux concepts : la specification Manifest V3, les content scripts, les background service workers, la popup UI et bien plus. Avec Claude Code, il suffit de donner des instructions en langage naturel pour les generer.

Configuration initiale du projet

> Cree un projet d'extension Chrome.
> Utilise Manifest V3 avec popup et content script.
> Configure le build avec TypeScript + Vite.

Exemple de manifest.json genere par Claude Code :

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "description": "Extension Chrome creee avec 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"
  }
}

Implementation de la Popup UI

Le popup qui apparait lorsque l’on clique sur l’icone de l’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 });
  // Notifier le content script du changement de configuration
  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);
  });
});

Implementation du Content Script

Le content script qui manipule le contenu de la page web. Ici, nous implementons la fonctionnalite de surlignage de texte.

// 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();
    }
  });
}

// Ecouteur de messages
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;
  }
});

Implementation du Background Service Worker

// background.ts
chrome.runtime.onInstalled.addListener(() => {
  // Ajouter un menu contextuel
  chrome.contextMenus.create({
    id: "highlight-selection",
    title: "Surligner le texte selectionne",
    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,
    });
  }
});

Pour les differences avec le developpement d’outils CLI, consultez le developpement d’outils CLI. Pour ecrire des prompts efficaces, consultez les 10 conseils pour tripler votre productivite.

Summary

Avec Claude Code, vous pouvez accelerer considerablement le developpement d’extensions Chrome, de la configuration Manifest V3 a l’UI, aux content scripts et aux background workers. Laissez la complexite de la specification a Claude Code et concentrez-vous sur les idees de fonctionnalites.

Pour plus de details, consultez la documentation officielle de Claude Code.

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