Laboratorio 1: Computación en El Cliente Web
Laboratorio 1: Computación en El Cliente Web
Laboratorio 1: Computación en El Cliente Web
Contenido
Objetivos ................................................................................................................................................ 2
Descripción de la Actividad ................................................................................................................. 2
Herramientas a Utilizar ................................................................................................................... 3
Desarrollo del Laboratorio .................................................................................................................. 4
Ejercicio 1: Resolución del ejercicio 2005 ..................................................................................... 7
Ejercicio 2: Resolución del ejercicio 2006 .................................................................................. 11
Ejercicio 3: Resolución con Plugin de JQuery (antes de 2014) ................................................ 14
Ejercicio 4: Resolución en 2014.................................................................................................... 17
Fetch desde Node.js.................................................................................................................... 19
Ejercicio 5: Componentes Web ..................................................................................................... 22
Ejecución de Aplicación Web .................................................................................................... 27
Objetivos
Trabajar con estándares web relacionados con conexiones AJAX, funciones asíncronas y
componentes.
Desarrollar el laboratorio tal y como se explica durante la sesión y narrar cómo se ha hecho,
siguiendo para ello las instrucciones de este documento. Si no puedes asistir a la sesión en
directo, recuerda que siempre la tienes a tu disposición como grabación.
Descripción de la Actividad
En este laboratorio vamos a realizar una sencilla petición mediante estándares web y vamos a
representar los datos obtenidos en una página de manera limpia. Iremos complicando y
actualizando esta petición de datos para que cada vez se acerque más a la manera actual de
realizarse en la práctica. Es decir, repasaremos cada una de las maneras de hacer peticiones
AJAX desde la antigüedad, hasta nuestros días.
• El objeto XMLHttpRequest.
• Las funciones AJAX del archiconocido framework jQuery.
• Un plugin específico para jQuery creado por el mantenedor del servicio al que nos
vamos a conectar.
• Por último, un componente web moderno (web component) desarrollado por un
tercero que nos permitirá realizar peticiones parecidas, pero de manera increíblemente
elegante.
Herramientas a Utilizar
Visual Studio Code o VS Code, un editor de código que con el paso del tiempo se ha vuelto
amplio debido a sus extensiones, este lo podemos bajar directamente desde la página oficial:
https://code.visualstudio.com/#alt-downloads para el sistema operativo que tengamos.
JQuery es una biblioteca de JavaScript rápida, pequeña y rica en funciones. Hace que cosas
como el recorrido y la manipulación de documentos HTML, el manejo de eventos, la animación
y Ajax sean mucho más simples con una API fácil de usar que funciona en una multitud de
navegadores, la utilizaremos bajando el script de la URL https://code.jquery.com/jquery-
3.6.0.min.js y colocándola en nuestro proyecto.
Node JS es un motor javascript para el servidor con muchas utilidades, una de ellas son los
paquetes de “node” a través de su repositorio de software centralizado llamado NPM.
En este archivo “Indice.html” crearemos una interfaz donde podamos acceder a nuestros
ejercicios, para esto utilizaremos el tag HTML con sus elementos HEAD y BODY, seguido
haremos referencia a nuestras herramientas de “Bootstrap” y “JQuery” en nuestro
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"
/>
<title>Chuck Norris - API</title>
<!-- Añadiendo Referencia de JQuery -->
<script src="scripts/jquery-3.6.0.min.js"></script>
<!-- Añadiendo Referencia de Bootstrap -->
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css
" />
</head>
Fig. 6 – Índice, contenido HEAD
Con esto podremos ocupar los estilos y función que requiramos de las herramientas, esta
función la ocuparemos en todos nuestros archivos HTML, ahora en el elemento
BODY vamos a ocupar algunos elementos DIV que utilizan estilos para darle presentación a
las opciones de todos los ejercicios que desarrollaremos, comenzaremos por crear un DIV con
el estilo “container” y ahí comenzaremos a agregar todo nuestro código.
Este acceso tendrá un elemento “h5” con el título del Ejercicio, un elemento “p” con una breve
descripción y un elemento “a” con el enlace que redirecciona al mismo, ubicado en la carpeta
de “ejercicios”.
Una vez definido nuestros elementos por utilizar, crearemos 5 accesos que nos redireccionaran
a nuestros 5 ejercicios del laboratorio, los accesos los iremos cambiando conforme avancemos
y nuestra página se verá de la siguiente forma:
Para poder navegar en los diferentes ejercicios, deberemos de colocar un elemento “a” con la
dirección de nuestro índice dentro del elemento BODY en cada página HTML que tengamos
que crear:
El objeto XMLHttpRequest nos permite hacer peticiones AJAX de manera bastante cómoda,
esta forma se ocupaba mucho en el 2005, por lo que para ocuparlo necesitaremos agregar
archivos un archivo de tipo HTML a nuestra carpeta de ejercicios, un archivo tipo JS a nuestra
carpeta de scripts y una imagen a nuestra carpeta de imágenes dentro de nuestro proyecto.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"
/>
<title>Laboratorio 1 - Ejercicio 2005</title>
<script src="../scripts/jquery-3.6.0.min.js"></script>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css
" />
</head>
<body>
<script src="../scripts/ejercicio1.js"></script>
Como nos lo pide el ejercicio, debemos de mostrar el título donde se mostrará nuestro “chiste”
en el estilo “jumbotron” de Bootstrap, de esta forma, nos devolverá el siguiente resultado en
nuestro navegador:
Este ejercicio ocupa una estructura similar a la del ejercicio anterior, únicamente cambia la
referencia hacia el archivo JS que vamos a ocupar, de la siguiente manera:
<body>
<script src="../scripts/ejercicio2.js"></script>
<!-- Contenido Principal -->
<div class="container">
<div class="col-md-12">
<div class="mt-3"></div>
<h2>Ejercicio 2.</h2>
<table class="table">
<thead>
<tr>
<th>Resolución: 2006</th>
<th>Desrcipción: Consumo de API con JQuery</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img src="../imagenes/ejercicio002.jpg"
class="img-thumbnail" alt="" >
</td>
<th>
<h1 class="display-4">Obtiene Chiste</h1>
<p class="lead">Mensaje obtenido desde
'http://api.icndb.com/jokes/random/'.</p>
</th>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Se crea el boton de regreso al Indice -->
<div class="container">
<div class="row">
<div class="col-md-12">
<a href="../indice.html" class="btn btn-primary btn-
lg">Regresar al indice</a>
<hr>
</div>
</div>
</div>
</body>
Fig. 17 – Ejercicio2006, Archivo HTML cuerpo
En todos ellos se agregaría el valor, debido a que así lo asignamos desde JQuery.
La diferencia radica en que vamos a ocupar una librería más en nuestro elemento HEAD que
realiza el consumo de ICNDB mediante un Plugin, este lo encontraremos en la página:
http://code.icndb.com/jquery.icndb.min.js y lo que haremos será descargar el JS e importarlo
a nuestro proyecto en la carpeta de “scripts” e incluirlo en nuestro HTML.
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"
/>
<title>Laboratorio 1 - Ejercicio 2014</title>
<script src="../scripts/jquery-3.6.0.min.js"></script>
<script src="../scripts/jquery.icndb.min.js"></script>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css
" />
</head>
Fig. 22 – Ejercicio2014, Archivo HTML, elemento HEAD, Plugin ICNDB
Cada resultado obtenido se añade a un elemento “li” dentro una lista “ul” de la página. Ahora
en nuestro HTML cambiaremos el elemento “h1” por el “ul” para hacer el enlace:
<h2>Ejercicio 3.</h2>
<table class="table">
<thead>
<tr>
<th>Resolución: 2014-1</th>
<th>Desrcipción: Consumo de API con Plugin de
JQuery</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img src="../imagenes/ejercicio003.jpg"
class="img-thumbnail" alt="" >
</td>
<th>
<ul class="list-group"></ul>
</th>
</tr>
</tbody>
</table>
Fig. 24 – Ejercicio2014, Archivo HTML, elemento BODY, Lista UL
El elemento principal “ul” y los “li” llevan clases de estilos de Bootstrap, lo que nos da como
resultado la siguiente pantalla:
Para implementar API Fetch, agregaremos nuestros 3 archivos, como lo hemos hecho con los
ejercicios anteriores y ocuparemos el diseño del HTML del ejercicio anterior, ya que como lo
solicita el ejercicio, necesitamos mostrar una lista de datos.
Existen características de ICNDB que nos permiten obtener datos de distintas maneras, para
este ejercicio, utilizaremos la URL http://api.icndb.com/jokes/random/10 en nuestro archivo
JS, la variación que notamos es que al final de la dirección se encuentra el número “10”. Por lo
que nuestro script queda de la siguiente manera:
A diferencia del ejercicio anterior, mostramos la lista y un objeto “span” mostrando el ID.
Al terminar las instalaciones nuestro proyecto se verá de la siguiente forma, con la carpeta
“node_modules” que contendrá todo lo que necesita Node JS para ejecutar archivos JS y los
archivos “package” con la configuración de la ejecución:
El script nos mostrará una impresión de la consola donde se pueden apreciar el atributo ID y
la descripción JOKE en una cadena, ahora debemos de dirigirnos a la carpeta “scripts” con el
comando “cd scripts”, una vez ahí, ejecutaremos nuestro archivo JS con el comando:
¿Qué es WHATWG?
De acuerdo con su sitio web, WHATWG es una respuesta al W3C's (en-US) lento progreso en
los estándares Web, especialmente HTML, que el W3C dejó de desarrollar para concentrarse
en XHTML. El WHATWG mantiene especificaciones para HTML, DOM, y JavaScript
• HTML 5 (anteriormente conocida como Aplicaciones Web 1.0) es la quinta versión del
HTML y ha sido adoptado por el W3C como punto de partida de la labor del nuevo
grupo de trabajo HTML.
• Web Workers, la cual define una API que permite utilizar ECMAScript en un CPU
multi-núcleo de manera más eficaz.
• Formularios Web 2.0, una actualización de los formularios HTML, la cual quedó
integrada en HTML5.
Una vez instalado, nos vamos a la terminal de nuestro proyecto y ejecutamos los siguientes
comandos:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Laboratorio 1 - Ejercicio Web Component</title>
<!-- Obteniendo Hoja de Estilos "Skeleton" -->
<link rel="stylesheet" href="../bower_components/skeleton-
framework/dist/skeleton.css">
<!-- Obteniendo Componente "Chuck Norris" -->
<script src="../scripts/ejercicioWC.js"></script>
</head>
<body>
<div class="container">
<h1>Chuck Norris Joke</h1>
<h6>Componente Web de Javascript</h6>
<!-- Invocando Componente -->
<chuck-norris-joke
jsonapi="https://api.icndb.com/jokes/random/10"></chuck-norris-joke>
<!-- Se crea el boton de regreso al Indice -->
<div class="frame-container">
<div class="row">
<a href="../indice.html" class="button button-
primary">Regresar al indice</a>
</div>
</div>
</div>
</body>
</html>
Fig. 36 – EjercicioWebComponent, Archivo HTML que invoca el componente.
El ejercicio nos solicita la creación de una tabla donde imprima los datos obtenidos del API de
ICNDB, para que nuestro script defina este componente, nuestro archivo JS debe de contener
una clase que herede sus caracteristicas de HTMLElement:
Nuestra clase debe de tener su constructor, debe de implementar “super();” y deberá tener
definido nuestro atributo “jsonapi”, al final de la clase utiliza el comando
“window.customElements.define(‘chuck-norris-joke’,ChuckNorrisWebComponent);”
Esta última linea es la que se encarga de definir nuestro componente en la ventana donde lo
queremos invocar. Sin embargo, aún no terminamos, debemos de ocupar el método
“connectedCallback” que es el encargado de llamar los controles al momento de realizar la
solicitud a la página:
connectedCallback(){
//Declarando elemento de ShadowRoot y contenedor principal
let shadow = this.attachShadow({mode:'open'});
//Obteniendo Datos de la Petición
let respuesta = fetch(this.getAttribute('jsonapi')).then(r=>r.json())
respuesta.then(datos =>{
//Mostrando Datos
let cont = this.creaTabla(datos.value);
shadow.appendChild(cont);
})
.catch(e =>console.log(e));
}
Fig. 38 – EjercicioWebComponent, Archivo JS, método connectedCallback
Este método realiza la petición de datos vía “fetch” y los procesa en el método “creaTabla” que
solicita nuestros datos como parámetro de entrada y al final añade el elemento HTML obtenido
a nuestra variable “shadow” que es la encargada de mostrar nuestra construcción de elementos
de nuestra página, es muy importante que todo lo que obtengamos lo añadamos a este
elemento que se mostrará.
Después definiremos el método de “creaTabla” donde crearemos los elementos HTML de una
tabla normal (tbody, tr, th, etc) y asignaremos los datos y las columnas de forma dinámica:
creaTabla(datos){
let contenedor = document.createElement('div');
contenedor.className ='frame-container';
//Creando Estructura de la Tabla
let tabla = document.createElement('table'),
tr = tabla.insertRow(-1), //Fila Vacia
tbody = document.createElement('tbody');
//Definiendo Estilos
tabla.className = 'u-full-width';
tr.className = 'tr-container';
//Definiendo Columnas Dinamicas
let columnas = [];
for (let indice=0; indice<datos.length; indice++)
{
for (let llave in datos[indice])
{
//Validando Columna
if (columnas.indexOf(llave)===-1){
columnas.push(llave);
}
}
}
//Añadiendo Columnas Obtenidas
for (let indice=0; indice<columnas.length; indice++)
{
//Creando Encabezado y Añadiendo Valor
let th = document.createElement('th');
th.innerHTML=columnas[indice];
tr.appendChild(th);
}
//Añadiendo Registros
for (let indice=0; indice<datos.length; indice++)
{
tr = tabla.insertRow(-1);
//Insertando Relación de Datos con las columnas
for (let idx=0; idx<columnas.length; idx++)
{
//Insertando Celda de Datos
let celda = tr.insertCell(-1);
celda.innerHTML = datos[indice][columnas[idx]];
}
}
contenedor.appendChild(tabla);
//Devolviendo Valor
return contenedor;
}
Fig. 39 - EjercicioWebComponent, Archivo JS, método CreaTabla
Y esta característica ya no se reconoce dentro de los estándares web relevantes. Por último,
procederemos a ejecutar nuestra forma y nos devolverá lo siguiente:
En base a los requerimientos solicitados, podemos apreciar que se construye una tabla de
HTML, que contiene 3 columnas (id, joke y categories), contiene la información obtenida del
API y la forma en general esta maquetada por los estilos de “skeleton”.
Al ingresar por las direcciones disponibles, nos aparecerá un índice con el directorio de nuestra
aplicación para que podamos navegar en el: