68 - 馃懛 Trabajadores WEB en HTML: Qu茅 Son y C贸mo Usarlos

HTML






HTML Web Workers API

La HTML Web Workers API proporciona una forma de ejecutar scripts en segundo plano en el navegador. Esto permite realizar tareas que requieren mucho tiempo, como c谩lculos complejos o el procesamiento de datos, sin bloquear la interfaz de usuario. Los trabajadores web se ejecutan en un hilo separado y se comunican con la p谩gina principal a trav茅s de mensajes.

La ventaja de utilizar trabajadores web es que pueden mejorar la eficiencia y la experiencia del usuario, ya que permiten que las aplicaciones web sigan respondiendo mientras se llevan a cabo operaciones intensivas.

La API de trabajadores web es especialmente 煤til en aplicaciones que requieren un procesamiento intensivo, como juegos, aplicaciones de gr谩ficos, o aplicaciones que manipulan grandes vol煤menes de datos.

En resumen, la HTML Web Workers API es una herramienta poderosa para mejorar el rendimiento de las aplicaciones web al permitir la ejecuci贸n de tareas en segundo plano, mejorando as铆 la experiencia del usuario.




¿Qu茅 es un trabajador web?

Un trabajador web es un script que se ejecuta en un hilo separado del hilo principal de la aplicaci贸n web. Esto significa que un trabajador puede realizar tareas en segundo plano sin interferir con la experiencia del usuario en la interfaz de la aplicaci贸n.

Los trabajadores web son especialmente 煤tiles para operaciones que requieren mucho tiempo de CPU, como c谩lculos matem谩ticos complejos, procesamiento de im谩genes o manipulaci贸n de datos. Al delegar estas tareas a un trabajador, la interfaz de usuario sigue siendo receptiva y no se congela mientras se completan estas operaciones.

La comunicaci贸n entre el hilo principal y el trabajador web se realiza mediante un sistema de mensajer铆a. El hilo principal puede enviar mensajes al trabajador y recibir respuestas, lo que permite que ambos se sincronicen sin necesidad de compartir la memoria directamente.

En resumen, un trabajador web permite a los desarrolladores web ejecutar scripts de manera eficiente en segundo plano, mejorando el rendimiento de las aplicaciones y la experiencia del usuario.




Soporte del navegador

La compatibilidad de la HTML Web Workers API puede variar entre diferentes navegadores. A continuaci贸n se presenta una tabla que muestra el soporte de los principales navegadores para los trabajadores web:

Navegador Versi贸n de soporte Comentarios
Chrome 5.0+ Soporte completo desde la versi贸n 5
Firefox 3.5+ Soporte completo desde la versi贸n 3.5
Safari 5.0+ Soporte completo desde la versi贸n 5
Edge 12.0+ Soporte completo desde la versi贸n 12
Internet Explorer No soportado La API de trabajadores web no est谩 soportada en IE
Opera 11.6+ Soporte completo desde la versi贸n 11.6

La mayor铆a de los navegadores modernos ofrecen soporte completo para la API de trabajadores web, lo que permite a los desarrolladores aprovechar esta funcionalidad en sus aplicaciones.




HTML Web Workers Ejemplo

A continuaci贸n se presenta un ejemplo pr谩ctico de c贸mo utilizar HTML Web Workers en una aplicaci贸n web. Este ejemplo incluye un archivo de script para el trabajador y un archivo HTML que interact煤a con 茅l.

Primero, creamos un archivo llamado worker.js, que contiene el c贸digo del trabajador. Este trabajador recibir谩 un n煤mero y lo multiplicar谩 por dos:


self.onmessage = function(event) {
    const result = event.data * 2; // Multiplicar el n煤mero recibido
    postMessage(result); // Enviar el resultado de vuelta
}
            

Luego, en nuestro archivo HTML principal, inicializamos el trabajador y le enviamos un n煤mero. El c贸digo podr铆a verse de la siguiente manera:


<script>
    const worker = new Worker('worker.js');
    worker.onmessage = function(event) {
        console.log('Resultado:', event.data); // Mostrar el resultado en la consola
    }
    worker.postMessage(10); // Enviar el n煤mero al trabajador
</script>
            

En este ejemplo, cuando se env铆a el n煤mero 10 al trabajador, este lo multiplica por 2 y env铆a el resultado de vuelta al hilo principal, que lo imprime en la consola. Este enfoque permite que la interfaz de usuario permanezca receptiva mientras se realiza el c谩lculo.


Ejemplo Visual 1: Multiplicaci贸n

En este ejemplo, al hacer clic en el bot贸n, se env铆a el n煤mero 10 al trabajador web, que lo multiplica por 2 y muestra el resultado en la interfaz.

Resultado: Esperando...


C贸digo del ejemplo 1: Multiplicaci贸n

<!-- C贸digo del trabajador web (worker.js) -->
self.onmessage = function(event) {
    const result = event.data * 2; // Multiplicar el n煤mero recibido
    postMessage(result); // Enviar el resultado de vuelta
}

<!-- C贸digo en el archivo HTML principal -->
<script>
    const worker = new Worker('worker.js');
    worker.onmessage = function(event) {
        console.log('Resultado:', event.data); // Mostrar el resultado en la consola
    }
    worker.postMessage(10); // Enviar el n煤mero al trabajador
</script>
            

Ejemplo Visual 2: Incremento

Count numbers: 0

C贸digo del ejemplo visual 2: Incremento

<!-- Ejemplo Visual 2: Incremento -->
<div class="container mt-4">
    <div class="bg-primary p-3 border rounded mt-3">
        <h3 style="font-family: Georgia; font-size: 30px">Ejemplo Visual 2: Incremento</h3>
        <div class="bg-white p-3">
            <p>Count numbers: <output id="result2">0</output></p>
            <button onclick="startWorker2()">Iniciar incremento</button>
            <button onclick="stopWorker2()">Detener incremento</button>

            <script>
                var w2;
                var count2 = 0; // Definici贸n de la variable al inicio

                function startWorker2() {
                    if (typeof (Worker) !== "undefined") {
                        if (typeof (w2) == "undefined") {
                            const workerScript2 = `
                                let count = 0;
                                setInterval(() => {
                                    count++;
                                    postMessage(count);
                                }, 1000); // Incrementa cada segundo
                            `;
                            const blob2 = new Blob([workerScript2], { type: 'application/javascript' });
                            w2 = new Worker(URL.createObjectURL(blob2));
                        }
                        w2.onmessage = function (event) {
                            document.getElementById("result2").innerHTML = event.data; // Mostrar el resultado
                        };
                    } else {
                        document.getElementById("result2").innerHTML = "Lo siento, tu navegador no soporta Web Workers...";
                    }
                }

                function stopWorker2() {
                    if (w2) {
                        w2.terminate();
                        w2 = undefined;
                        document.getElementById("result2").innerHTML = "Detenido"; // Mensaje de parada
                    }
                }
            </script>
        </div>
    </div>
</div>
            



Comprobar soporte web de los trabajadores

Antes de implementar un trabajador web en tu aplicaci贸n, es fundamental verificar si el navegador del usuario lo soporta. Los trabajadores web son una caracter铆stica de HTML5 que permite ejecutar scripts en segundo plano, mejorando el rendimiento de las aplicaciones web.

Para comprobar si los trabajadores web son soportados, puedes utilizar una simple verificaci贸n en JavaScript. Aqu铆 hay un ejemplo de c贸mo hacerlo:

if (typeof(Worker) !== "undefined") {
    // Soporta trabajadores web
    console.log("Tu navegador soporta trabajadores web.");
} else {
    // No soporta trabajadores web
    console.log("Lo siento, tu navegador no soporta trabajadores web.");
}
        

En este fragmento de c贸digo, verificamos si el objeto Worker est谩 definido. Si lo est谩, significa que los trabajadores web son compatibles con el navegador. En caso contrario, se puede informar al usuario que su navegador no soporta esta funcionalidad.




Crear un archivo web de trabajo

Para utilizar trabajadores web, es necesario crear un archivo JavaScript que contenga el c贸digo que se ejecutar谩 en segundo plano. Este archivo se denomina archivo de trabajador y debe ser separado del archivo principal de la aplicaci贸n. La estructura de un archivo de trabajador web es bastante simple:

self.onmessage = function(event) {
    // C贸digo para ejecutar cuando se recibe un mensaje
    const data = event.data;
    // Procesar datos
    postMessage(result); // Enviar el resultado de vuelta
};
        

En este ejemplo, se define un manejador para el evento onmessage, que recibe datos del hilo principal, procesa la informaci贸n y devuelve el resultado.




Crear un objeto de trabajo web

Una vez que tienes tu archivo de trabajador web creado, el siguiente paso es crear un objeto de trabajador en tu archivo JavaScript principal. Esto se hace utilizando el constructor Worker de la siguiente manera:

const worker = new Worker('worker.js'); // 'worker.js' es el archivo del trabajador
        

Con este c贸digo, se instancia un nuevo objeto trabajador, que comenzar谩 a ejecutar el c贸digo definido en 'worker.js'. Puedes enviarle mensajes utilizando el m茅todo postMessage.




Terminar un trabajador web

Cuando ya no necesites un trabajador web, puedes finalizarlo utilizando el m茅todo terminate(). Esto libera los recursos utilizados por el trabajador. La forma de hacerlo es:

worker.terminate(); // Finaliza el trabajador
        

Al llamar a terminate(), el trabajador dejar谩 de ejecutarse inmediatamente y se liberar谩n sus recursos. Es buena pr谩ctica terminar los trabajadores que ya no se utilizan para evitar posibles fugas de memoria.




Reutilizar el trabajador web

Reutilizar un trabajador web puede ser beneficioso para mejorar el rendimiento de la aplicaci贸n. En lugar de crear un nuevo trabajador cada vez que lo necesites, puedes utilizar el mismo objeto de trabajador para diferentes tareas.

Esto se hace simplemente enviando diferentes mensajes al mismo trabajador, que puede manejar m煤ltiples tareas dependiendo de la l贸gica que hayas implementado en el archivo del trabajador.

worker.onmessage = function(event) {
    // L贸gica para manejar diferentes tipos de mensajes
    if (event.data.type === 'multiply') {
        postMessage(event.data.value * 2);
    } else if (event.data.type === 'add') {
        postMessage(event.data.value + 2);
    }
};

// Ejemplo de reutilizaci贸n
worker.postMessage({ type: 'multiply', value: 10 });
worker.postMessage({ type: 'add', value: 5 });
        

Al reutilizar un trabajador, aseg煤rate de manejar correctamente los diferentes tipos de mensajes para evitar errores.




C贸digo de ejemplo de trabajo web completo

A continuaci贸n, se presenta un c贸digo de ejemplo que muestra c贸mo implementar un trabajador web completo. En este caso, el trabajador realiza diferentes operaciones seg煤n los mensajes que recibe.

// Archivo worker.js
self.onmessage = function(event) {
    const { type, value } = event.data;
    let result;

    switch (type) {
        case 'multiply':
            result = value * 2;
            break;
        case 'add':
            result = value + 2;
            break;
    }
    postMessage(result);
};

// Archivo principal
const worker = new Worker('worker.js');
worker.onmessage = function(event) {
    console.log('Resultado:', event.data);
};

worker.postMessage({ type: 'multiply', value: 10 });
worker.postMessage({ type: 'add', value: 5 });
        

En este ejemplo, el trabajador puede multiplicar o sumar valores seg煤n los mensajes que recibe desde el hilo principal.




Trabajadores web y el DOM

Es importante entender que los trabajadores web no tienen acceso directo al DOM del documento. Esto se debe a que est谩n dise帽ados para ejecutar c贸digo en segundo plano y evitar bloquear la interfaz de usuario.

Sin embargo, los trabajadores pueden comunicarse con el hilo principal mediante el uso de postMessage para enviar datos de vuelta y, luego, manipular el DOM desde el hilo principal.

// En el archivo worker.js
self.onmessage = function(event) {
    const data = event.data;
    // Procesar datos
    postMessage(processedData);
};

// En el archivo principal
worker.onmessage = function(event) {
    document.getElementById('result').innerText = event.data; // Actualizar el DOM
};
        

Esta separaci贸n garantiza que la interfaz de usuario se mantenga receptiva mientras se realizan operaciones complejas en segundo plano.







Publicar un comentario

0 Comentarios