Use Cases

Como desarrollar extensiones de navegador con Claude Code

Aprende a desarrollar extensiones de navegador con Claude Code. Incluye ejemplos de codigo practicos y guia paso a paso.

Acelerar el desarrollo de extensiones de navegador con Claude Code

El desarrollo de extensiones de Chrome requiere conocer muchos conceptos: la especificacion Manifest V3, content scripts, background service workers, popup UI y mas. Con Claude Code, basta con dar instrucciones en lenguaje natural para generarlos.

Configuracion inicial del proyecto

> Crea un proyecto de extension de Chrome.
> Usa Manifest V3 con popup y content script.
> Configura el build con TypeScript + Vite.

Ejemplo de manifest.json generado por Claude Code:

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

Implementacion de la Popup UI

El popup que aparece al hacer clic en el icono de la 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 });
  // Notificar al content script el cambio de configuracion
  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);
  });
});

Implementacion del Content Script

El content script que manipula el contenido de la pagina web. Aqui implementamos la funcionalidad de resaltado de texto.

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

Implementacion del Background Service Worker

// background.ts
chrome.runtime.onInstalled.addListener(() => {
  // Agregar menu contextual
  chrome.contextMenus.create({
    id: "highlight-selection",
    title: "Resaltar texto seleccionado",
    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,
    });
  }
});

Para las diferencias con el desarrollo de herramientas CLI, consulta desarrollo de herramientas CLI. Para escribir prompts eficientes, consulta 10 consejos para triplicar tu productividad.

Summary

Con Claude Code puedes acelerar significativamente el desarrollo de extensiones de Chrome, desde la configuracion de Manifest V3 hasta la UI, content scripts y background workers. Deja la complejidad de la especificacion a Claude Code y concentrate en las ideas de funcionalidad.

Para mas detalles, consulta la documentacion oficial de Claude Code.

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