{"id":1648,"date":"2024-08-02T10:53:59","date_gmt":"2024-08-02T08:53:59","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=1648"},"modified":"2024-08-02T10:54:00","modified_gmt":"2024-08-02T08:54:00","slug":"001-introduccion-a-las-single-page-applications-spa","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/18-single-page-application-spa\/001-introduccion-a-las-single-page-applications-spa\/","title":{"rendered":"001. Introducci\u00f3n a las Single Page Applications (SPA)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Qu\u00e9 es una Single Page Application (SPA)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Por sus siglas (<strong>SPA<\/strong>) es una <strong>aplicaci\u00f3n de una s\u00f3la p\u00e1gina<\/strong>, lo que significa que todos los recursos y las dependencias de nuestra aplicaci\u00f3n van a cargar a la hora que solicitemos al servidor ese <strong>archivo<\/strong>, que generalmente ser\u00e1 un archivo .<em><strong>html<\/strong><\/em>, se vendr\u00e1n descargando todas las <strong>tipograf\u00edas<\/strong>, las <strong>im\u00e1genes<\/strong>, los <strong>estilos<\/strong>, los <strong>archivos de programaci\u00f3n Javascript<\/strong> que nuestra <strong>aplicaci\u00f3n<\/strong> necesite para funcionar, a diferencia de aplicaciones que est\u00e9n construidas con diferentes <strong>secciones<\/strong> o <strong>p\u00e1ginas<\/strong>, donde cada vez que cambiamos de una <strong>secci\u00f3n<\/strong> a otra, vamos al <strong>servidor<\/strong> a solicitar otro <strong>archivo<\/strong>, otro <strong>recurso<\/strong>, otra <strong>ruta al servidor<\/strong>, con lo cual hay que descargar todos los <strong>recursos<\/strong> (ll\u00e1mense <strong>tipograf\u00edas<\/strong>, <strong>archivos de estilo<\/strong>, de <strong>im\u00e1genes<\/strong>, de <strong>programaci\u00f3n<\/strong>&#8230;).<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Una <strong>SPA<\/strong> carga todo el contenido en una s\u00f3la vez. Dependiendo de la complejidad y el nivel de robustez de nuestra <strong>SPA<\/strong> puede ser que la primera vez demore algo m\u00e1s en cargar, ya que est\u00e1 trayendo todo el contenido, aunque tambi\u00e9n lo que se espera es que cargue \u00fanicamente el contenido necesario y a partir de las interacciones del <strong>usuario<\/strong>, cuando vaya cargando cada una de las secciones, ir\u00e1 solicitando de <strong>manera as\u00edncrona y din\u00e1mica<\/strong> el contenido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por lo tanto, las <strong>SPA<\/strong> trabajan con <strong>peticiones as\u00edncronas<\/strong> con <strong>tecnolog\u00edas AJAX<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rutas de una SPA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En una <strong>SPA<\/strong> lo que tenemos son <strong>vistas, <\/strong>no <strong>p\u00e1ginas, <\/strong>no tenemos diferentes <strong>secciones<\/strong>, cargamos un s\u00f3lo archivo, y a partir de las interacciones del usuario cambiamos el contenido, es decir, mostramos u ocultamos el contenido necesario. Por usabilidad es buena opci\u00f3n cambiar la <strong>URL<\/strong> de nuestra <strong>SPA<\/strong> ya que de esta manera se ayuda al usuario a saber en todo momento en que p\u00e1gina est\u00e1 navegando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El cambio se consigue gracias a dos <strong>elementos de la URL<\/strong>, que pertenecen al objeto <strong><em>Location<\/em><\/strong>, el cual guarda todas las partes que se van formando de la <strong>URL<\/strong>. En dicho objeto <strong><em>Location<\/em> <\/strong>hay dos maneras de cambiar la <strong>URL<\/strong> sin necesidad de cambiar hacia una nueva ruta, y es a trav\u00e9s de la <strong>almohadilla<\/strong> (<em><strong>#<\/strong><\/em>). Otra manera de hacer los cambios es mediante el <strong>paso de variables o par\u00e1metros a trav\u00e9s de la URL<\/strong>. Estas son las dos maneras en que podemos modificar la <strong>URL<\/strong> en una <strong>SPA<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SEO en una SPA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hay dos alternativas que son t\u00e9cnicas de las <strong>SPA<\/strong>, las cuales nos ayudan a que nuestras aplicaciones sean m\u00e1s amigables con el <strong>SEO<\/strong>, la primera estrategia es usar <strong>generadores de sitios web est\u00e1ticos<\/strong>, lo que se conoce como <strong>SSG<\/strong> (<strong>Static Site Generator<\/strong>). Ejemplos de estas tecnolog\u00edas son <a href=\"https:\/\/www.gatsbyjs.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Gatsby<\/strong> <\/a>o <a href=\"https:\/\/nextjs.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Next<\/strong><\/a>&#8230; La segunda t\u00e9cnica ser\u00eda el <strong>Server Site Rendering<\/strong> (<strong>SSR<\/strong>), o en espa\u00f1ol, el <strong>renderizado del lado del servidor<\/strong>, lo que significa que, herramientas como por ejm <a href=\"https:\/\/nuxt.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Nuxt<\/strong> <\/a>para <strong>Vue<\/strong>, o <strong>Next<\/strong> para <strong>React<\/strong>, lo que hacen es din\u00e1micamente servir el contenido desde el <strong>servidor<\/strong>, por lo que se genera una <strong>URL<\/strong> nueva, pero seguimos trabajando con el mismo esquema de las <strong>SPA<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Objetivo de nuestra aplicaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si el objetivo de nuestra aplicaci\u00f3n es generar contenido, no es muy buena opci\u00f3n que nuestro blog t\u00e9cnico crearlo en una <strong>SPA<\/strong>, ya que esta no se lleva tambi\u00e9n con el <strong>SEO<\/strong>, pero si estamos pensando en desarrollar una aplicaci\u00f3n web para llevar el sistema que lleva las solicitudes de vacaciones de nuestra empresa por ejm, o una intranet privada, de entrada, el <strong>SEO<\/strong> no es importante, por lo que en este caso podemos ayudarnos de un <strong>SPA<\/strong> para construir nuestra aplicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">En qu\u00e9 se programa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las <strong>SPA<\/strong> se desarrollan en <strong>Javascript<\/strong>. Las <strong>SPA<\/strong> son 100% <strong>frontend<\/strong>. A las <strong>SPA<\/strong> no les interesa en que tecnolog\u00eda est\u00e1 desarrollado el <strong>backend<\/strong> con los datos que se cargar\u00e1n en la misma porque, y es una de las caracter\u00edsticas de la <strong>SPA<\/strong>, al ser s\u00f3lo c\u00f3digo <strong>frontend<\/strong>, permite tener separado el c\u00f3digo <strong>frontend<\/strong> del c\u00f3digo <strong>backend<\/strong> que provee los datos. Esto significa que en el caso, por ejm, de las vacaciones de los empleados de nuestra empresa, el <strong>frontend<\/strong> puede ser una <strong>SPA<\/strong>, y el <strong>backend<\/strong> puede ser un proyecto independiente, que lo \u00fanico que necesita la <strong>SPA<\/strong> es que el <strong>backend<\/strong> en que est\u00e9 desarrollado, que puede ser cualquier lenguaje de programaci\u00f3n (<strong>PHP<\/strong>, <strong>Ruby<\/strong>, <strong>Phyton<\/strong>&#8230;) es que este le exponga una <strong>API<\/strong>, generalmente en formato <strong>JSON<\/strong> para que las <strong>SPA<\/strong> pueda consumir dichos datos y generar su <strong>frontend din\u00e1mico<\/strong>. De esta manera pueden estar desacoplados el <strong>frontend<\/strong> de <strong>nuestra<\/strong> SPA del <strong>backend<\/strong> que provee los datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A diferencia del patr\u00f3n de arquitectura de desarrollo <strong>MVC<\/strong>, muy popular a inicios de la web en la d\u00e9cada de los 90 y comienzos del 2000, en un sistema <strong>MVC<\/strong>, la responsabilidad estaba del lado del servidor, en las <strong>SPA<\/strong> el <strong>frontend<\/strong> es totalmente independiente del <strong>backend<\/strong>, no dependiendo de \u00e9l.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Librer\u00edas para desarrollar nuestras SPA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Desde el a\u00f1o 2010 con es surgimiento de <a href=\"https:\/\/angularjs.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Angular.js<\/strong><\/a>, <a href=\"https:\/\/backbonejs.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Backbone.js<\/strong><\/a> y <a href=\"https:\/\/emberjs.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Ember.js<\/strong><\/a>, estos <strong>frameworks<\/strong> son la primera generaci\u00f3n de <strong>librer\u00edas<\/strong> y <strong>frameworks<\/strong> para desarrollar <strong>SPAs<\/strong>. Posteriormente con el surgimiento de <strong>React<\/strong>, <strong>Angular<\/strong>, <strong>Polimer<\/strong>, <strong>Vue<\/strong>&#8230; se pueden considerar como <strong>librer\u00edas <\/strong>o<strong> frameworks de segunda generaci\u00f3n<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 es una Single Page Application (SPA) Por sus siglas (SPA) es una aplicaci\u00f3n de una s\u00f3la p\u00e1gina, lo que significa que&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1646,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-1648","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"Qu\u00e9 es una Single Page Application (SPA) Por sus siglas (SPA) es una aplicaci\u00f3n de una s\u00f3la p\u00e1gina, lo que significa que...","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1648"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1648\/revisions"}],"predecessor-version":[{"id":1650,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1648\/revisions\/1650"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1646"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}