Sebastian Gomez
En este post, exploraremos el concepto de los service workers y cómo funcionan dentro de las extensiones para Chrome. Los service workers son scripts que se ejecutan en segundo plano, de forma independiente a las páginas web o ventanas para las que fueron registrados. Este tutorial te enseñará a implementar un service worker en tu extensión para Chrome y entender la diferencia entre el ámbito de los service workers y el ámbito de la ventana.
Los service workers son trabajadores en segundo plano que se ejecutan de manera independiente del DOM (Document Object Model) de la página web o ventana. Son útiles para manejar tareas que no requieren la interacción directa con la interfaz del usuario, como hacer solicitudes a APIs o gestionar eventos en segundo plano.
Configuración del Service Worker:
{
"manifest_version": 3,
"name": "Mi Extensión",
"version": "0.0.1",
"background": {
"service_worker": "background.js"
}
}
console.log('Hola desde el script de fondo');
Verificar la Actividad del Service Worker:
Al cargar la extensión en Chrome, el service worker se registrará y ejecutará. Puedes verificar su actividad en la pestaña de "Service Workers" de las herramientas de desarrollador de Chrome.
Es crucial entender que los service workers operan en un ámbito diferente al de la ventana (o DOM). Mientras que la ventana tiene acceso a la interfaz del usuario y puede manipular elementos DOM, los service workers no tienen este acceso.
Ámbito del Service Worker:
Ámbito de la Ventana:
Vamos a implementar un ejemplo básico para entender mejor cómo funcionan estos conceptos.
Script de Fondo (background.js):
console.log('Hola desde el script de fondo');
Script de la Ventana (popup.js):
console.log('Hola desde el script de la ventana');
Archivo HTML del Pop-up (popup.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pop-up</title>
<script src="popup.js"></script>
</head>
<body>
<h1>Hola Mundo</h1>
</body>
</html>
Actualizar el manifest.json:
{
"manifest_version": 3,
"name": "Mi Extensión",
"version": "0.0.1",
"background": {
"service_worker": "background.js"
},
"action": {
"default_popup": "popup.html"
}
}
El archivo background.js se ejecuta en segundo plano y puede realizar tareas continuas, como manejar eventos del navegador o mantener el estado de la extensión. Por otro lado, el pop-up es una interfaz de usuario que aparece cuando el usuario hace clic en el icono de la extensión en la barra de herramientas del navegador. La comunicación entre estos dos componentes es crucial para muchas funcionalidades de las extensiones.
Para enviar un mensaje desde el pop-up al script de fondo, puedes utilizar la API runtime.sendMessage. Aquí hay un ejemplo de cómo hacerlo desde popup.js:
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('sendMessage').addEventListener('click', function() {
chrome.runtime.sendMessage({greeting: "hola"}, function(response) {
console.log(response.farewell);
});
});
});
Y en popup.html:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Pop-up</title>
</head>
<body>
<button id="sendMessage">Enviar Mensaje</button>
<script src="popup.js"></script>
</body>
</html>
En background.js, puedes escuchar y responder a los mensajes entrantes utilizando chrome.runtime.onMessage.addListener:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log(sender.tab ?
"Mensaje desde el contenido del script:" + sender.tab.url :
"Mensaje desde la extensión");
if (request.greeting === "hola") {
sendResponse({farewell: "adiós"});
}
});
Si necesitas enviar un mensaje desde background.js al pop-up, debes obtener una referencia al pop-up activo y utilizar la API runtime.sendMessage. Aquí hay un ejemplo:
En background.js:
function sendMessageToPopup() {
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log(response.farewell);
});
}
// Puedes llamar a sendMessageToPopup cuando sea necesario.
En popup.js, escucha los mensajes de la misma manera:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.greeting === "hello") {
sendResponse({farewell: "goodbye"});
}
});
Para una comunicación más compleja y bidireccional, puedes utilizar puertos (port) para mantener una conexión abierta entre background.js y el pop-up. Aquí hay un ejemplo básico:
En popup.js:
let port = chrome.runtime.connect({name: "popup-background"});
port.postMessage({greeting: "hello"});
port.onMessage.addListener(function(msg) {
console.log("Mensaje recibido:", msg);
});
En background.js:
chrome.runtime.onConnect.addListener(function(port) {
console.assert(port.name === "popup-background");
port.onMessage.addListener(function(msg) {
console.log("Mensaje recibido:", msg);
if (msg.greeting === "hello") {
port.postMessage({farewell: "goodbye"});
}
});
});
Los service workers son una herramienta poderosa para gestionar tareas en segundo plano en tus extensiones para Chrome. Al entender la diferencia entre el ámbito de los service workers y el ámbito de la ventana, puedes aprovechar al máximo estas capacidades para crear extensiones más robustas y eficientes. ¡Explora estas técnicas y lleva tus extensiones al siguiente nivel!
Creador de contenido principalmente acerca de tecnología.