Ejecuta secuencias de comandos en todas las páginas

Crea tu primera extensión que inserte un nuevo elemento en la página.

Descripción general

En este instructivo, se compila una extensión que agrega el tiempo de lectura esperado a cualquier extensión de Chrome y a la página de documentación de Chrome Web Store.

Extensión de tiempo de lectura en la página de bienvenida de la extensión
Extensión de Tiempo de lectura en la página de bienvenida de la extensión.

En esta guía, explicaremos los siguientes conceptos:

  • Es el manifiesto de la extensión.
  • El tamaño de los íconos que usa una extensión
  • Cómo insertar código en páginas con secuencias de comandos de contenido
  • Cómo usar los patrones de coincidencia
  • Permisos de extensiones.

Antes de comenzar

En esta guía, se da por sentado que tienes experiencia básica en desarrollo web. Te recomendamos que consultes el instructivo Hello World para obtener una introducción al flujo de trabajo de desarrollo de extensiones.

Compila la extensión

Para comenzar, crea un directorio nuevo llamado reading-time que contenga los archivos de la extensión. Si lo prefieres, puedes descargar el código fuente completo desde GitHub.

Paso 1: Agrega información sobre la extensión

El archivo JSON de manifiesto es el único archivo obligatorio. Contiene información importante sobre la extensión. Crea un archivo manifest.json en la raíz del proyecto y agrega el siguiente código:

{
  "manifest_version": 3,
  "name": "Reading time",
  "version": "1.0",
  "description": "Add the reading time to Chrome Extension documentation articles"
}

Estas claves contienen metadatos básicos de la extensión. Controlan cómo aparece la extensión en la página de extensiones y, cuando se publica, en Chrome Web Store. Para obtener más información, consulta las claves "name", "version" y "description" en la página de descripción general del Manifiesto.

💡 Otros datos sobre el manifiesto de la extensión

  • Debe estar ubicado en la raíz del proyecto.
  • Las únicas claves obligatorias son "manifest_version", "name" y "version".
  • Admite comentarios (//) durante el desarrollo, pero debes quitarlos antes de subir tu código a Chrome Web Store.

Paso 2: Proporciona los íconos

Entonces, ¿por qué necesitas iconos? Aunque los íconos son opcionales durante el desarrollo, son obligatorios si planeas distribuir la extensión en Chrome Web Store. También aparecen en otros lugares, como la página Administración de extensiones.

Crea una carpeta images y coloca los íconos dentro. Puedes descargar los íconos en GitHub. Luego, agrega el código destacado a tu manifiesto para declarar íconos:

{
  "icons": {
    "16": "images/icon-16.png",
    "32": "images/icon-32.png",
    "48": "images/icon-48.png",
    "128": "images/icon-128.png"
  }
}

Recomendamos usar archivos PNG, pero se permiten otros formatos de archivo, excepto los archivos SVG.

💡 ¿Dónde se muestran estos íconos con tamaños diferentes?

Tamaño del ícono Uso de íconos
16x16 Ícono de página en las páginas y el menú contextual de la extensión
32 × 32 Las computadoras con Windows suelen requerir este tamaño.
48 × 48 Se muestra en la página Extensiones.
128 × 128 Se muestra en la instalación y en Chrome Web Store.

Paso 3: Declara la secuencia de comandos del contenido

Las extensiones pueden ejecutar secuencias de comandos que leen y modifican el contenido de una página. Estos se denominan secuencias de comandos de contenido. Viven en un mundo aislado, lo que significa que pueden realizar cambios en su entorno de JavaScript sin entrar en conflicto con la página de host ni con las secuencias de comandos del contenido de otras extensiones.

Agrega el siguiente código a manifest.json para registrar una secuencia de comandos de contenido llamada content.js.

{
  "content_scripts": [
    {
      "js": ["scripts/content.js"],
      "matches": [
        "https://developer.chrome.com/docs/extensions/*",
        "https://developer.chrome.com/docs/webstore/*"
      ]
    }
  ]
}

El campo "matches" puede tener uno o más patrones de coincidencia. Esto permite que el navegador identifique en qué sitios insertar las secuencias de comandos de contenido. Los patrones de coincidencia constan de tres partes: <scheme>://<host><path>. Pueden contener los caracteres '*'.

💡 ¿Esta extensión muestra una advertencia de permisos?

Cuando un usuario instala una extensión, el navegador le informa qué puede hacer la extensión. Las secuencias de comandos de contenido solicitan permiso para ejecutarse en sitios que cumplen con los criterios del patrón de coincidencia.

En este ejemplo, el usuario vería la siguiente advertencia de permiso:

Permiso que verá una advertencia que verá el usuario cuando instale la extensión Tiempo de lectura
Advertencia de permiso de tiempo de lectura.

Para obtener más información sobre los permisos de extensiones, consulta Cómo declarar permisos y advertir a los usuarios.

Paso 4: Calcula e inserta el tiempo de lectura

Las secuencias de comandos de contenido pueden usar el Modelo de objetos del documento (DOM) estándar para leer y cambiar el contenido de una página. Primero, la extensión verificará si la página contiene el elemento <article>. Luego, contará todas las palabras dentro de este elemento y creará un párrafo que muestra el tiempo total de lectura.

Crea un archivo llamado content.js dentro de una carpeta llamada scripts y agrega el siguiente código:

const article = document.querySelector("article");

// `document.querySelector` may return null if the selector doesn't match anything.
if (article) {
  const text = article.textContent;
  const wordMatchRegExp = /[^\s]+/g; // Regular expression
  const words = text.matchAll(wordMatchRegExp);
  // matchAll returns an iterator, convert to array to get word count
  const wordCount = [...words].length;
  const readingTime = Math.round(wordCount / 200);
  const badge = document.createElement("p");
  // Use the same styling as the publish information in an article's header
  badge.classList.add("color-secondary-text", "type--caption");
  badge.textContent = `⏱️ ${readingTime} min read`;

  // Support for API reference docs
  const heading = article.querySelector("h1");
  // Support for article docs with date
  const date = article.querySelector("time")?.parentNode;

  (date ?? heading).insertAdjacentElement("afterend", badge);
}

💡 Se usa JavaScript interesante en este código

  • Expresiones regulares que se usan para contar solo las palabras dentro del elemento <article>.
  • insertAdjacentElement() se usa para insertar el nodo de tiempo de lectura después del elemento.
  • La propiedad classList que se usa para agregar nombres de clase CSS al atributo de clase de elemento.
  • Encadenamiento opcional que se usa para acceder a una propiedad del objeto que puede ser indefinida o nula.
  • Nullish coalescing muestra el <heading> si <date> es nulo o indefinido.

Prueba que funcione

Verifica que la estructura de archivos de tu proyecto se vea de la siguiente manera:

El contenido de la carpeta de tiempo de lectura: manifest.json, content.js en la carpeta de secuencias de comandos y la carpeta de imágenes

Carga la extensión de forma local

Para cargar una extensión desempaquetada en modo de desarrollador, sigue los pasos que se indican en Conceptos básicos de desarrollo.

Abrir una extensión o la documentación de Chrome Web Store

A continuación, se indican algunas páginas que puedes abrir para ver cuánto tiempo tardará cada artículo en leerse.

Se verá de la siguiente manera:

Tiempo de lectura en la página de bienvenida
Página de bienvenida de la extensión con la extensión Reading Time

🎯 Posibles mejoras

En función de lo que aprendiste hoy, intenta implementar cualquiera de las siguientes opciones:

Seguir creando

Felicitaciones por terminar este instructivo 🎉. Para seguir desarrollando tus habilidades, completa otros instructivos de esta serie:

Extensión Qué aprenderás
Modo sin distracciones Para ejecutar el código en la página actual después de hacer clic en la acción de la extensión.
Administrador de pestañas Para crear una ventana emergente que administre las pestañas del navegador.

Sigue explorando

Esperamos que hayas disfrutado de crear esta extensión de Chrome y nos entusiasma continuar tu recorrido de aprendizaje sobre el desarrollo de Chrome. Recomendamos la siguiente ruta de aprendizaje:

  • La guía para desarrolladores contiene decenas de vínculos adicionales a documentación relevante para la creación avanzada de extensiones.
  • Las extensiones tienen acceso a APIs potentes más allá de lo que está disponible en la Web abierta. En la documentación de las API de Chrome se explica cada API.