Manejo de Rutas en Aplicaciones Web con JavaScript
Clase 8 de 16 • Curso de Single Page Application con JavaScript Vanilla
Contenido del curso
Clase 8 de 16 • Curso de Single Page Application con JavaScript Vanilla
Contenido del curso
Emmanuel Rodríguez
Añaqui Apolinar Morales
Juan Camilo Rico Orjuela
Reynaldo Francisco Moreno Briceño
Juan David González Rodríguez
Hernán David Mercado Fernández
Aarón Fabricio Santa Cruz Valdez
Sebastian Moreno Olivera
Alejandro Jimenez
juan martinez lopez
Juan Jose Vega
José Antonio Torres
Fernando Cordero
Juan Luis Sánchez Cardoza
Valentina Arenas Lozano
Cesar Guevara Cabrera
Jose Ramon Moreno Sanchez
Nazareno Aznar Altamiranda
Alejandro Ruiz Melo
Bernardo Noé Cárdenas Rocha
Carlos Enrique Ramírez Flores
Leobardo Licona Soto
Victor Alvarado
Cesar Gonzalez Groh
Cristian Córdova
Daniel Eduardo Sanchez Yañez
Heber Yarod Chanca Melgar
Miguel Angel Sirra Giraldo
Heber Yarod Chanca Melgar
Jhon Carlos Colorado Angulo
Oscar Barajas Tavares
Jhon Carlos Colorado Angulo
Obed Paz
Ponciano Guevara Lozano
Luis Lira
Cristofher Jumbo Jimenez
Jefferson Hernández Correa
Eleazar Carreón Álvarez
Jefferson Hernández Correa
Hermes Aguilar
Josue Zafra
Juan Camilo Espitia
Anfernee Valera
Mario Osvaldo Méndez Pino
Anfernee Valera
Les recomiendo instalar el plugin Relative path para buscar rápidamente sus archivos.
Como funciona?
Este plugin aplica para VSCode.
Para usar esta extensión, usas un comando (en Windows: Ctrl + Shift + H) y te abre una barra de búsqueda en donde puedes digitar el nombre del documento que deseas invocar, e inmediatamente te muestra las posibles opciones a seleccionar con su respectiva ruta.
Agiliza bastante el trabajo al momento de llamar algún archivo y evitar errores que podrían ocurrir al momento de digitar la ruta.
Para los que le sale el error en cosola, a partir de Babel 7 debemos instalar @babel/polyfill deben.. para eso deben hacer lo siguiente:
En la terminal ejecutan npm install --save @babel/polyfill
Van al archivo webpack.config.js y en "entry" agregan:
entry: ['@babel/polyfill', './src/index.js'],
Despues de eso corren el comando "build" y luego el comando "start" y chequen si ya no les sale el error en consola y lo mas importante que les aparezca el header!
que hace la librería '@babel/polyfill?
Muchas gracias! Me salvaste la patría
Una hora buscando un bug y resulta que en webpack.config.js escribí templade , en lugar de template. Odio cuando eso pasa jaja.
Me paso exactamente igual jajajaj.
Me voy a hacer bolas con tanto archivo index
todo esto se parece mucho a crear componentes en React
Es lo que hace React por debajo, vanilla es puro
Asi es. Por eso me gusta el curso
import Header from '../templates/Header'; import Home from '../pages/Home'; import Character from '../pages/Character'; import Error404 from '../pages/Error404'; // ROUTES TO BE RENDER const routes = { '/': Home, '/:id': Character, '/contact': 'Contact', }; //ROUTER const router = async () => { // stablishing templates to dom const header = null || document.getElementById('Header'); const content = null || document.getElementById('content'); header.innerHTML = await Header(); }; export default router;```
Gracias!
Gracias por el ahorro de escritura jejeje
En muchos cursos veo el problema de que avanzan mucho con el codigo sin ir mostrando resultados de a pocos, creo que asi seria mas logico para alguien nuevo como y porque suceden las cosas.
Muy cierto, siento que voy a ciegas y me cuesta entender :(
Si llegas a tener un error referido a regeneratorRuntime es debido al asincronismo. Estuve toda la tarde de viendo cómo solucionarlo y resultó ser bastante sencillo. Les sugiero que lean y comprendan bien lo que pasa para saber el por qué del proceso
¿Por qué el problema?
Babel utiliza multiples modulos pequeños para hacer funcionar ciertas de sus caracteristicas. Una cosa a tener en cuenta es que transpilar el codigo no lo hace 100% compatible con navegadores antiguos, a veces es necesario acompañarlo de polyfills (fragmentos de código que emulan una funcion del lenguaje en caso de no tenerla disponible)
Una de las cosas que no soporta Babel de por sí son las funciones asíncronas, por lo que tenemos que darles soporte a partir de una librería. El profe en la clase de preparacion de webpack instala una, pero haciendo otro proyecto no me funcionó.
Para darle soporte general a metodos del lenguaje anteriormente Babel utilizaba un modulo propio llamado @babel/polyfill, que era una combinacion de 2 modulos independientes llamados core-js y regenerator-runtime. Este fue deprecado en la version 7. Por lo que ahora nos conviene directamente importar ambos módulos
Instalación de las librerías
Primero instalan las siguientes librerías en npm o yarn:
npm install core-js npm install regenerator-runtime
luego en el archivo principal de su aplicacion (index.js) lo importan
// CommonJS require("regenerator-runtime/runtime"); // ECMAScript 2015 import "regenerator-runtime/runtime.js";
Péro ¿Por qué estos archivos?
Core-JS es una librería super util que reune un monton de polyfills que podés importar de forma general o específica. COmo buena practica, para evitar que tu programa sea pesado, se recomienda importar solamente los polyfills de los features que vayas a utilizar (ej, async, promesas, clases) Pero comó descubrí todo esto ayer lo reduzco a importarlo de forma general como hice arriba jeje :P
Regenerator-Runtime es una librería que principalmente le da soporte a las funciones asincronas en entornos donde no son soportadas. Me imagino que tendrá otras funciones, pero principalmente se la usa por ese motivo. Realmente para que no nos de error solo es necesario ésta librería, pero acordemonos de que nuestra intención es darle soporte a todos los navegadores posibles
Sugiero entender bien el uso de ambas librerías porque son muy importantes y les será de mucha ayuda cuando sean avanzados
Enlaces para entrar en contexto (en ingles)
regenerator-runtime - npm
core-js - npm
Babel polyfill is dead. Long live core-js!
What is regenerator-runtime npm package used for?
Esta es toda la explicación, es problable que no sea 100% rigurosa, por lo que si tienen algo que aclarar o corregir, su feedback es bienvenido ^-^
Muchas gracias!
Muchas gracias. Valiosísimo tu aporte :D
si hay que reiniciar el server para que funcione correcto!
Me resultaría muy útil entender conceptualmente como va a construir la aplicación, con un diagrama o algún apoyo grafico ... en lugar de ir descubriendo su lógica y construcción mientras se realiza el código, les sucede algo parecido?
A los que tengan un error como este ReferenceError: regeneratorRuntime is not defined en consola, hagan lo siguiente:
instalar las siguientes dependencias :
npm install --save core-js npm install --save regenerator-runtime
Luego en el archivo index,js (el que se encuentra en el root de src), importar las siguientes librerias:
import "core-js/stable"; //importar esta lib import "regenerator-runtime/runtime"; //importar esta otra lib import router from './routes/index'; window.addEventListener('load', router);
Encontré otra forma Instalar: npm i --save-dev @babel/plugin-transform-runtime y agregar un archivo de configuracion en el raiz .babelrc con este contenido:
{ "plugins": ["@babel/plugin-transform-runtime"] }
y no hay que importar nada en el index. Me parece un poco mas elegante 😀
Ahora entiendo porque pusimos en el fichero Home.js lo siguiente:
<a href="#/1/">
Cuando pulsemos en el link. Nos llevará a la ruta personalizada de cada Character.js En este caso cada id corresponderá a cada uno de los personajes que metamos.
:D No lo entendía hasta ahora...
Para los que no entienden porque el profe usa Await en la funcion Header().
Ahora, tenemos que esperar todos estos pasos para ejecutar esta función? No necesariamente, porque aunque sabemos que la construcción de todo esto se hace demaciado rapido. Cuando queremos acceder, nuestras funciones también acceden demasiado rapido, y podemos estar haciendo un request de algo al DOM que aun no existe.
Con await, le decimos a nuestra función. Ejecutante si y sólo si. El evento "load" ya ha sido lanzado, has un await de esto.
Aqui les muestro el LOG de los Eventos. Un imagen vale mas que 1000 palabras.
Espero les sirva de ayuda!
¿Para qué sirve el "null || " la siguiente línea: const header = null || document.getElementById('header')?
Es para que en caso de que no encuentre ese elemento con el ID header se le asigne null a esa variable
Si no encuentra el elemento, document.getElementById('header') ya devuelve null, por lo que no veo la diferencia de dejarlo como:
const header = document.getElementById('header')
Avanzando super animado con el curso.
Al final muéstrame tu proyecto terminado!!
Vale, prometido.
Por esto me gusta mucho TypeScript por encima de Babel, nos ayuda a resolver posibles problemas antes de correr nuestra aplicacion. Al principio se puede sentir muy pesado o inneceario para aplicaciones pequeñas, pero vale muchisimo la pena con el tiempo, con practica se te vuelve normal y desarrollas incluso mas rapido detectando errores mas temprano.
ctrl + c (por lómenos en mac para salir de ahí)
En general el Ctrl + C sirve para terminar el proceso de Node de cualquier sistema operativo :D También en Windows y Ubuntu uso esa combinación.
Que bueno gracias, no sabia como salir hahaha
Tengo un lio con el webpack, alguien podria ayudarme, Slds!
tml Webpack Plugin: Error: Child compilation failed: Entry module not found: Error: Can't resolve 'C:\Users\pc\Desktop\sap_rickandmorthy\public\index.html' in 'C:\Users \pc\Desktop\sap_rickandmorthy': Error: Can't resolve 'C:\Users\pc\Desktop\sap_rickandmorthy\public\index.html' in 'C:\Users\pc\Desktop\sap_ricka ndmorthy' EntryModuleNotFoundError: Entry module not found: Error: Can't resolve 'C:\Users\pc\Desktop\sap_rickandmorthy\publi c\index.html' in 'C:\Users\pc\Desktop\sap_rickandmorthy'
Puede que tengas el error en como estas agregando el template de HtmlWebpackPlugin o en tus entradas. ¿Puedes mostrarme el archivo de webpack?
Claro! este es el archivo, lo tengo con comentarios para no perderme
// Constante de node donde le requerimos saber donde estamos en las carpetas, sirve para local y en la nube const path = require('path'); // Archivo html que creamos, que nos permite trabajar con el Html const HtmlWebpackPlugin = require ('html-webpack-plugin'); //creamos un modulo donde vive cada configuracion de lo que va a suceder module.exports = { //punto inicial, donde se encuentra el codigo inicial y donde partira el proyecto entry: './src/index.js', //Donde ponemos el proyecto estructurado y listo para produccion output: { path: path.resolve (__dirname, 'dist'), filename: 'main.js' }, //Ahora trabajamos en las extensiones que tendra nuestro proyecto. resolve: { // Aqui pasamos las extensiones que vamos a usar en este caso solo js ira en un array extensions:['.js'], }, //Creamos un modulo con las reglas necesarias que vamos a trabajar, en este casi las de babel, para que sea compatible con todos los navegadores module :{ rules: [ { //Estructura de babel , creamos un test de como vamos a identificar los archivos segun los que se encuentran en nuestro entorno //RegExp Sirve para establecer valores que queremos filtrar de una ruta, elementos. etc. test: /\.js?$/, //ruta que queremos excluir exclude: /node_modules/, use: { //Configuracion establecida para trabajar neustro codigo, en este caso babel-loader que fue instalado anteriormente loader: 'babel-loader', } } ] }, //Ahora establecemos los plugins que voy a necesitar. plugins: [ //nos permite trabajar con los archivos html que definimos al principio new HtmlWebpackPlugin ( { inject: true, //Donde se encuentra nuestro archivo html principal template: './public/index.html', //Hacia donde lo tenemos que mandar o donde vamos a guardar el archivo index filename: './index.html', } ), ] }
Por que me construye la aplicacion pero no me aparece el header?
Puede que te hayas olvidado de escribir return view; al final de la funcion
me paso exactamente lo mismo y encontré varios typos en los códigos HTML que van en los Script etiquetas mal cerradas o class mal nombrados con un s de mas cosas así. y despues d everificar todo y arreglarlo volví a ejecutar el npm run build y luego el npm run start y quedo espero te sirva.
En la versión actual de Webpack, para utilizar babel hace falta crear un archivo .babelrc y crear un objeto con una especificación de como manejará nuestro código. Pero primero hay que ir a npm y:
npm i @babel/core @babel/preset-env @babel/runtime @babel/plugin-transform-runtime babel-loader -D
"presets": [ "@babel/preset-env" //Estó es lo que nos permite trabajar con JavaScript moderno y babel lo transpile a versiones entendibles para los navegadores. ], "plugins": [ "@babel/plugin-transform-runtime" // ESTE ES MUY IMPORTANTE PARA LA CLASE. Este plugin nos permite trabajar con funciones asincronas(promesas, async/await, cb) Así que si vienes del curso de Webpack, recuerda utilizar estas configuraciones. Y si no lo has hecho. agrega estas configuraciones y espero te ayude ] }```
graciaaaaas, la clave era este pequeño codigo!
{ "presets": [ "@babel/preset-env" ], "plugins": [ "@babel/plugin-transform-runtime" ] }
Puede que consigas varios inconvenientes, pero toda esta en saber usar webpack y en su defecto preguntarle a la comunidad, mucha suerte :D