Manifiesto por una �nica P�gina Web (Single Page Interface)

Actualizaci�n: 21 de septiembre 2015

spiral Los origenes de la tecnolog�a web

Cuando Tim Berners Lee invent� la web buscaba un sistema para poder publicar y visualizar documentaci�n cient�fica de forma remota, que fuera atractiva visualmente, f�cil de codificar y f�cil de usar para un no inform�tico.

En un documento cient�fico es imprescindible la referencia a otros documentos citados con el fin de que el lector opcionalmente pueda profundizar en el tema que se trata.

Por estas razones el Word Wide Web se concibi� como un sistema de p�ginas (documentos) e hiperenlaces.

Inicialmente la web era un mundo de p�ginas est�ticas y enlaces pero pronto la generaci�n de p�ginas din�micas y en general el uso de la web como soporte para el dise�o de aplicaciones basadas en web lo complic� todo.

spiral La llegada de las aplicaciones web

Durante a�os ha existido un esfuerzo de adaptar el paradigma de p�ginas y navegaci�n entre p�ginas al desarrollo de aplicaciones, aplicaciones en las que el concepto de p�gina, como documento est�tico id�ntico para todo el mundo tal y como lo concibi� Berners no existe. Diferentes paradigmas de desarrollo de aplicaciones web se han ido sucediendo:

  • Model 1: la traslaci�n directa del modelo original de p�ginas e hiperenlaces en donde las p�ginas son generada din�micamente.
  • Model 2 o MVC: la navegaci�n entre p�ginas generadas ya no es directa sino que es intermediada por un controlador que decide cual es la siguiente p�gina dependiendo de las operaciones que se hayan realizado en el proceso de transici�n.
  • MVC basado en componentes (�Model 3?): es la sofisticaci�n del Model 2 en donde se simula la forma de trabajar en el escritorio, basado en componentes y eventos, de tal manera que una acci�n del usuario supone la regeneraci�n de la p�gina cambiando parcialmente una parte de la misma de acuerdo con la acci�n. La p�gina y la transici�n entre p�ginas ahora es gestionada por componentes que saben qu� cambios han de realizarse en la regeneraci�n de la p�gina de acuerdo al evento, simulando un comportamiento similar a los sistemas de componentes GUI de la programaci�n de escritorio.

En a�os recientes se ha ido introduciendo la t�cnica AJAX, dicha t�cnica con la ayuda de JavaScript permite el cambio parcial de la p�gina obteniendo nuevos datos del servidor sin llegar recargarse �sta. Aunque la pr�ctica del cambio parcial de una p�gina web es muy anterior a la introducci�n del componente XMLHttpRequest en Internet Explorer (base de la programaci�n AJAX), ha sido el uso de este componente el que ha favorecido un uso masivo de la misma.

Hoy millones de sitios web y aplicaciones web usan AJAX para proporcionar una mejor experiencia al usuario gracias a una mayor inmediatez y transparencia evitando parcialmente las molestas recargas de p�ginas.

Sin embargo a pesar del uso masivo de AJAX podemos decir que hoy d�a la web sigue un modelo que podr�amos calificar de "Model 2 (MVC) enriquecido con AJAX", en donde el llamado aqu� Model 3 tiene cada vez menos sentido, pues la introducci�n de AJAX hace en gran parte innecesaria la gesti�n de p�ginas basada en componentes. Como habitualmente el uso de AJAX tiende a estar ligado a componentes (no necesariamente presentes en el Model 2) podr�amos resumir que el estado del arte actual viene a ser un Model 3.5, en donde la navegaci�n de p�ginas se consigue evitar parcialmente en el caso de transiciones de estado menores, las cuales se realizan utilizando AJAX y JavaScript.

spiral �Qu� inconvenientes tiene la navegaci�n y el desarrollo basado en p�ginas?

Todo programador web sabe lo problem�tica que es la navegaci�n por p�ginas en una aplicaci�n web, aparte del derroche de ancho de banda y de tiempo de proceso en regenerar la p�gina completa est�n los problemas con el cacheado no deseado, el back-forward, los inconvenientes del "form auto fill" habitual en los navegadores etc. No es raro ver aplicaciones web que ocultan los menues y botones del navegador o que usan frames o iframes (por ejemplo en bancos) para evitar la problem�tica de los botones Atr�s/Adelante (Back/Forward).

La programaci�n basada en p�ginas tiende a forzar una forma de programar extra�a, repetitiva (plagada de includes) e ineficiente (tanto en ancho de banda como en potencia de c�lculo) que no existe en el �mbito del escritorio en donde no existe esa imposici�n.

spiral �Qu� es lo que impide un uso intensivo de AJAX?

En el �mbito del desarrollo web se suelen distinguir dos tipos de soluciones: aplicaciones web y sitios web.

En el primer caso AJAX tiende a utilizarse cada vez m�s de forma intensiva debido a que este tipo de aplicaciones no tiene algunos de los requisitos de los sitios web, es en los sitios web en donde un uso intensivo de AJAX puede suponer un problema.

En los sitios web el usuario est� acostumbrado al concepto de p�gina, ligados a las p�ginas existen algunos requisitos b�sicos de cualquier sitio web tal y como:

  1. Memorizaci�n de p�ginas favoritas (bookmarking): cada p�gina web tiene un �nico URL, dicho URL es por tanto "memorizable" como favorito. Como AJAX tiende a cambiar parcialmente las p�ginas se pierde la posibilidad de guardar favoritos.
  2. Search Engine Optimization (SEO): la compatibilidad SEO es un deber de cualquier sitio web, cualquiera puede entender esto. Los actuales robots indexadores de p�ginas ven la web como Web 1.0, es decir, el c�digo JavaScript es totalmente ignorado tal que cualquier cambio parcial de p�gina hecho via AJAX cargando datos del servidor no es conocido por los robots indexadores que atraviesan el sitio web porque dicha acci�n no se realiza.
  3. Servicios basados en visitas de p�ginas: por ejemplo anuncios y monitorizaci�n de visitas tal y como Google Analytics est�n basados en el n�mero de veces que una p�gina ha sido cargada. Por tanto los cambios parciales de p�ginas hechos por AJAX no cuentan.
  4. Necesidad ocasional de ventanas emergentes (pop-ups)

Estos requisitos hacen que el uso intensivo de AJAX est� desaconsejado en sitios web de gran p�blico. Sin embargo la diferencia entre aplicaci�n web y sitio web es cada vez m�s sutil, de hecho cualquier sitio web es hoy d�a una aplicaci�n web.

spiral �Debemos renunciar a sitios web intensivos en AJAX?

NO.

Hay soluciones t�cnicas a los requisitos anteriormente mencionados.

spiral �Es posible el desarrollo de sitios web basados en una �nica P�gina Web (SPI)?

�SI!

Es el momento de realizar esta transici�n en las que todos, programadores y usuarios saldremos ganando. Tenemos la tecnolog�a y los navegadores ya est�n a la altura para conseguir este objetivo.

Para ello es preciso compatibilizar el funcionamiento de la t�cnica Single Page Interface (SPI) con los requisitos mencionados anteriormente de cualquier sitio web.

spiral Adi�s a las p�ginas bienvenidos los estados

Si en una aplicaci�n web sin JavaScript la sucesi�n de estados equivale al de p�ginas, en una aplicaci�n SPI cualquier cambio parcial de la p�gina supone un estado (o estado de "la p�gina"). Entre los estados hay que distinguir dos categor�as de estados:

  • Fundamentales
  • Secundarios

La diferenciaci�n entre ambos tipos de estados es importante, porque los estados fundamentales ser�n p�ginas web cuando sea necesario, ser�n aquellos estados que merezca la pena que sean vistos tambi�n como p�ginas web. La distinci�n entre estados fundamentales y secundarios depender� de cada sitio web.

Para entender ambos tipos de estados es conveniente considerar un ejemplo real: la validaci�n de un usuario a trav�s de login y password.

En una aplicaci�n cl�sica existir�an dos p�ginas, la propia del login la cual se recargar� cuando el login es incorrecto mostrando adem�s alg�n mensaje de error, y la p�gina de entrada correcta mostrando al usuario las posibles opciones.

En una web SPI tanto el estado donde se muestra el login inicial como el estado de entrada correcta mostrando las opciones podr�an considerarse los estados fundamentales, los estados en donde se muestran los mensajes de error de login mostrando de nuevo el formulario del login podr�an considerarse estados secundarios.

En el caso de un sitio web basado en p�ginas que se quiere convertir en una web SPI, los estados fundamentales normalmente ser�n los equivalentes a las p�ginas y los secundarios cuando a partir de un estado fundamental (la antigua "p�gina") se producen cambios menores que no merecen la pena (por ejemplo) ser memorizados como favoritos o ser procesados por un crawler.

spiral Single Page Interface y Bookmarking

Diferentes p�ginas tienen diferentes URLs, si se sigue la ruta SPI �c�mo cambiar el estado y la vez la URL para poder ser guardada como favorita sin recargar la p�gina?.

Hay un truco, y es a trav�s de la referencia del URL ("hash fragment", shebang o hashbang), la parte final del URL tras el car�cter #, que sirve para situarse en un punto concreto de la p�gina (a trav�s de un <a name="ref"></a>). Un cambio en esa parte del URL (si existe) no provoca la recarga de la p�gina, por lo que al mismo tiempo que cambiamos de estado fundamental de la p�gina podemos cambiar la referencia del URL a trav�s del objeto JavaScript window.location sin provocar una recarga. Como el URL cambia al mismo tiempo que el estado fundamental, el usuario puede memorizar en cualquier momento dicho URL como "favorito" en su navegador.

Cuando dicho usuario quiere volver en otro momento al estado memorizado como favorito directamente, el estado objetivo est� presente en la referencia del URL, se producir� una solicitud al servidor, sin embargo dicha referencia por desgracia no es enviada al servidor porque se considera que no forma parte del URL desde el punto de vista de las comunicaciones HTTP, por ello es preciso un proceso post-carga.

El servidor devolver� una p�gina inicial en el que no ha considerado el estado requerido sin embargo el objeto window.location contiene la URL completa de la p�gina cargada incluyendo la referencia. Si nada m�s cargar la p�gina se detecta la presencia de una referencia de estado, v�a JavaScript y window.location es posible reescribir la URL y parametrizarla de forma normal para que vuelva a hacerse una nueva request al servidor para que sirva la p�gina directamente en el estado requerido.

Otra opci�n, mejor que el uso de hashbangs, surge con la llegada de HTML 5, la HTML 5 History API.

spiral Single Page Interface y Search Engine Optimizaci�n (SEO)

La forma m�s sencilla de conseguir que nuestro sitio web sea procesable por los motores de b�squeda es ofrecer dos modos de navegaci�n diferentes, a los usuarios de la web como SPI, y a los robots indexadores como p�ginas.

El siguiente ejemplo de enlace muestra esta idea:

<a href="URL p�gina" onclick="return false">�</a>

Este enlace no har� nada en un navegador con JavaScript activado porque la navegaci�n est� desactivada a trav�s del "return false" del atributo onclick y sin embargo un robot indexador ignorar� el atributo onclick pues el c�digo JavaScript es ignorado, y considerar� el URL especificado como una p�gina a procesar.

En el �mbito de una aplicaci�n SPI, los URLs usados para navegaci�n de estados/p�ginas deber�n contener el estado destino, el mismo tipo de URL que usamos en bookmarks (utilizando una referencia para indicar el estado) o directamente indicando el estado como un par�metro, esta �ltima opci�n es la preferida pues evita una solicitud al servidor, por supuesto siempre es posible utilizar "pretty URLs" para este fin.

Actualmente Google ya procesa "AJAX URLs", es decir, URLs conteniendo el estado objetivo en la referencia de la URL siguiendo #! como se especifica en Making AJAX Applications Crawlable, en este caso el sitio web/aplicaci�n debe devolver la p�gina solicitada en este caso a trav�s de un par�metro _escaped_fragment_.

Al mismo tiempo el framework SPI puede a�adir c�digo espec�fico al onclick antes del return false o asociar un "event listener" al enlace registr�ndolo a trav�s de addEventListener o attachEvent dependiendo del navegador, dicho event listener podr� estar vinculada a una acci�n que se comunique con el servidor via AJAX para efectuar el cambio de estado. Cuando se pulse el enlace dicho cambio de estado no ser� una carga de una nueva p�gina pues el atributo onclick="... return false" impide el comportamiento por defecto del enlace.

La t�cnica descrita es la m�s sencilla e inmediata a trav�s de enlaces visibles compatibles con robots y con SPI, siempre es posible separar ambas funcionalidades utilizando enlaces ocultos para el usuario pero visibles para los robots junto con otro tipo de elementos "pulsables" para efectuar las transiciones de estado SPI a trav�s de JavaScript, los cuales ser�n invisibles para los robots.

Es fundamental que el framework web servidor tenga la capacidad de generar la p�gina web en el estado requerido como HTML en tiempo de carga, pues lo normal es que la transici�n de estados tras la carga se realice a trav�s de JavaScript con cambios parciales de p�gina. Esta dualidad entre renderizaci�n parcial de estados via JavaScript y como HTML en carga directa de estado son requisitos imprescindibles para conseguir un sitio web SPI y a la vez capaz de simular p�ginas.

spiral SPI y los botones Atr�s/Adelante

Los botones Atr�s/Adelante son una fuente de problemas en sitios web basados en p�ginas y deber�an ser evitados lo m�s posible. A pesar de que los usuarios finales est�n acostumbrados a evitar los botones Atr�s/Adelante cuando est�n enviando un formulario de datos (porque conlleva el riesgo de comprar dos veces el mismo producto), el uso de los botones Atr�s/Adelante es enormemente popular.

Aparentemente el paradigma SPI rompe la tradicional forma de navegar en un sitio web, porque en teor�a los botones Atr�s/Adelante no tienen sentido en SPI (no hay p�ginas) y los navegadores web no proporcionan un buen control de estos botones.

Esto no es totalmente cierto, el comportamiento de los botones Atr�s/Adelante puede ser simulado, en vez de navegaci�n por p�ginas, Atr�s/Adelante (y la navegaci�n en general por la historial del navegador) puede ser usado para cambiar el estado actual al previo/siguiente estado. En este caso un c�digo JavaScript puede detectar cuando la parte "referencia" de la URL cambia y solicita a la aplicaci�n que cambie el estado al especificado en la URL. Debido a que el navegador no cambia la p�gina, tu aplicaci�n es ahora totalmente responsable del comportamiento del Atr�s/Adelante evitando los t�picos problemas del uso de Atr�s/Adelante cuando se env�a un formulario de datos, ahora en SPI no hay tal formulario y no hay navegaci�n por p�ginas no controlada por la aplicaci�n/sitio web.

spiral SPI y los servicios basados en visitas a p�ginas

Los servicios de anuncios o los contadores de visitas a p�ginas est�n basados en cargas de p�ginas. En ambos casos es posible usar elementos ocultos <iframe> conteniendo una p�gina web con los scripts requeridos por dichos servicios.

En el caso de los servicios de anuncios tal y como Google AdSense la inserci�n din�mica del <iframe> supondr� la carga de los anuncios por lo que cada cambio de estado puede suponer una nueva carga o inserci�n din�mica del <iframe>. Google AdSense parece detectar cuando el script de AdSense es ejecutado dentro de un <iframe> y tiene en cuenta el contenido del la p�gina contenedora. Puede ser conveniente a�adir alg�n tipo de par�metro que identifique el estado fundamental que est� cargando el <iframe>.

En el caso de los scripts de visitas, podemos utilizarlos como monitorizaci�n de visitas a estados fundamentales de nuestra sitio web SPI. En este caso el <iframe> oculto contendr� una p�gina web normal que simplemente contiene los scripts de control de visitas, a trav�s de un par�metro podremos indicar al script qu� estado fundamental estamos visitando. Dicho <iframe> es conveniente que sea un elemento global que es introducido en la p�gina una sola vez. Cuando un estado fundamental es cargado a trav�s de una URL, el <iframe> de control de visitas convendr� que tenga como par�metro la informaci�n del estado siendo cargado. Tras la carga inicial cualquier cambio de estado podremos notificarlo cambiando la URL via JavaScript de acuerdo con el nuevo estado, dicho cambio provocar� una recarga del <iframe> de visitas memorizando dicha visita al estado.

spiral SPI y las ventanas pop-up

La creaci�n de una nueva ventana supone claramente una ruptura con el modelo SPI, pero no hay que ser fundamentalista, si el estado de dicha ventana no interfiere en el estado de la p�gina que la cre�, nada hay de malo en el uso de ventanas pop-up como p�ginas normales.

El problema surge cuando las acciones realizadas en una p�gina "pop-up" influyen en la p�gina padre, ya sea dicha p�gina/ventana modal o no modal, la coordinaci�n entre p�ginas es complicada. Por ejemplo no hay un est�ndar web para gestionar p�ginas web modales respecto a otra p�gina, pues el concepto de p�gina tradicionalmente ha sido siempre el de un elemento aut�nomo y por tanto su ciclo de vida es dif�cilmente coordinable desde otra p�gina.

Este problema desde hace tiempo tiene soluci�n en SPI y consiste en la simulaci�n de ventanas modales o no modales dentro de la misma p�gina web sin necesidad de crear nuevas p�ginas. En el caso de las ventanas no modales cualquier elemento HTML con posicionamiento absoluto pasa a ser una "ventana no modal" y la modalidad se consigue a trav�s del adecuado uso del posicionamiento absoluto, el control del z-index y la opacidad respecto a las capas ("layers") inferiores. Estas soluciones son las deseadas en un ambiente SPI.

Con un poco de esfuerzo, incluso el estado en el que se muestra una ventana modal puede ser un estado fundamental y por tanto procesable por los buscadores de p�ginas.

spiral Un cambio cultural del programador web

La mayor�a de los programadores (y frameworks web) piensan en una web basada en p�ginas, la eliminaci�n de las p�ginas supone un cambio radical en el modo de hacer sitios y aplicaciones web. Este cambio ya no es tan radical gracias a que la popularidad de AJAX hemos reducido el n�mero de p�ginas de nuestros sitios web y en resumen nos ha acercado poco a poco a este "nuevo" modelo de programaci�n SPI.

En la nueva web SPI desparece el tag <form> y en general la necesidad de la sesi�n usada como coordinadora de datos entre secuencias de p�ginas, debido a que el protagonista pasa a ser �nicamente la p�gina cliente con alg�n tipo de simetr�a en el servidor (la p�gina en el servidor). De hecho, la eliminaci�n de la necesidad de coordinar p�ginas a trav�s de la sesi�n elimina otra fuente de problemas tal y como es la pr�ctica de algunos usuarios de abrir varias ventanas con la misma p�gina en aplicaciones web que suelen corromper la sesi�n y la aplicaci�n en general.

La forma de programar SPI es basada en eventos de forma totalmente similar a como se hace en el escritorio en donde la gran mayor�a de las aplicaciones suelen ejecutarse dentro de la misma ventana principal y cuando existen ventanas hija, �stas son plenamente controladas por la ventana principal y verdaderamente modales.

Siguiendo la evoluci�n de paradigmas de desarrollo web, podr�amos denominar Model 4 a esta "nueva" forma de construir sitios web.

spiral Un cambio cultural del usuario?

No mucho, a trav�s del soporte de favoritos y la simulaci�n del funcionamiento de los botones Atr�s/Adelante, los usuarios finales apenas van a apreciar la diferencia entre un sitio web SPI y el mismo basado en p�ginas, es m�s lo que percibir�n es que el sitio SPI responde con mucha m�s prontitud y se eliminan los t�picos parpadeos y el "scroll" de cambio de p�gina.

spiral Viabilidad t�cnica hoy

Este manifiesto no es una declaraci�n de intenciones sino la expresi�n de la voluntad de promover una "nueva" forma de construir sitios web que es ya real. Las consideraciones t�cnicas anteriores han tenido siempre el framework web Java ItsNat como base tecnol�gica en el desarrollo de sitios web SPI. A pesar de que ItsNat fue concebido desde el primer d�a pensando en este tipo de aplicaciones, las t�cnicas anteriormente mencionadas pueden ser desarrolladas en otros framework web, o bien dichos frameworks podr�an evolucionar hacia la posibilidad de realizaci�n de este tipo de sitios web SPI con requerimientos de simulaci�n de p�ginas.

Algunas caracter�sticas deseables de los sitios web SPI para que puedan ser substitutivos de los sitios webs tradicionales basados en p�ginas, tal y como la simulaci�n de p�ginas a trav�s de estados fundamentales en carga, s�lo son posibles en frameworks web c�ntricos en el servidor, en donde la renderizaci�n HTML se realiza en el servidor en tiempo de carga. Es la posibilidad de renderizaci�n de estados fundamentales como HTML en tiempo de carga y a la vez por inserci�n parcial a trav�s de JavaScript, las caracter�sticas clave de un framework apto para la realizaci�n de sitios web SPI. Los frameworks c�ntricos en el cliente pueden tener un papel muy relevante para la realizaci�n de los llamados estados secundarios en este documento.

spiral Dos ejemplos reales real

La web innowhere.com/jnieasy

Est� construida con ItsNat en el servidor y es un buen ejemplo de sitio web SPI porque resume las caracter�sticas exigidas a una web SPI, de acuerdo con este documento, para poder ser substituta de forma satisfactoria de una web tradicional. De hecho la nueva versi�n SPI reemplaz� sin cambiar significativamente est�tica y funcionalidad, la versi�n anterior basada en p�ginas. Est� basada en hashbangs.

Caracter�sticas:

  • Single Page Interface: los botones Atr�s y adelante son simulados cambiando al estado visitado previo o siguiente.
  • Los estados fundamentales pueden ser memorizados como Favoritos (bookmarks)
  • SEO compatible: los estados fundamentales son accesibles por navegaci�n por p�ginas si desactiv�ramos JavaScript en el navegador, incluso una ventana modal
  • Compatible con el sistema de "AJAX URLs" de Google usando el formato #!, la p�gina puede ser tambi�n solicitada usando el par�metro _escaped_fragment_ de acuerdo con la convenci�n de Google. Por ejemplo este estado es procesado por Google solicitando este URL.
  • Funciona con JavaScript desactivado.
  • Muestra un banner con publicidad de Google AdSense
  • A pesar de ser SPI, la navegaci�n por los estados fundamentales es monitorizado por Google Analytics a trav�s de un <iframe> oculto cuyo URL cambia indicando el estado visitado.
  • Una simulada ventana modal evita crear una nueva p�gina, esta ventana tambi�n es accesible directamente a trav�s de un enlace directo o con la versi�n hashbang con texto ya serializado como HTML y por tanto el contenido es SEO compatible.

La web www.itsnat.org

Tambi�n construida con ItsNat en el servidor. En este caso se usa la JavaScript History API. Este es el m�s perfecto enfoque para convertir un sitio web conventional en un SPI SEO compatible. Si la History API no fuera soportada por un navegador concreto, se usa una navegaci�n paginada convencional autom�ticamente. Todos los navegadores modernos soportan la JavaScript History API. Las caracter�sticas SPI de este sitio web son b�sicamente las mismas que el ejemplo previo.

spiral El Manifiesto en otras lenguas

Ingl�s

Nota: estas traducciones pueden estar ligeramente desactualizados porque este manifiesto est� vivo y puede cambiar.

Ucraniano gracias a Mario Pozner

Ruso gracias a Andrey Geonya, puede estar ligeramente desactualizado porque este manifiesto est� "vivo".

Serbo-Croata gracias a Jovana Milutinovich

Eslovaco gracias a Knowledge Team

Alem�n gracias a Valeria Aleksandrova.

Rumano gracias a Science Team.

Macedonio gracias a Katerina Nestiv

H�ngaro gracias a Elana Pavlet

Estonio gracias a Valerie Bastiaan

spiral Enlaces al manifiesto

Noticia en JavaHispano.org

Noticia en DZone

Noticia en TheServerSide.com

Discusi�n en YCombinator.com

Autor del manifiesto: Jose Mar�a Arranz Santamar�a