DEV Community

Mánu Fosela
Mánu Fosela

Posted on

Desarrollo Web y Web Components

Disclaimer

Lo que vierto en este post es mi opinión. Mi punto de vista. Mi percepción. Desde mi experiencia y mis sesgos. Y sobre todo desde mi ignorancia en muchos campos.

Sobre mi y mis inicios como desarrollador

Llevo programando para la web desde 1997.
A parte de HTML, CSS y Javascript, he pasado por varios lenguajes: CGIs en C, ASP, JSP, PHP, Java, Perl y Ruby si no recuerdo mal. Algunos durante unos meses otros durante años.
He trabajado con bases de datos MSSQL, MySQL, Oracle, IBMDb2 y MongoDB.
Y he trabajado con servidores IIS, Apache, Tomcat y Nginx.
Desde siempre Windows (era un mal necesario) y Linux (era un suplicio a principios de siglo)

He visto cómo hemos pasado de que un desarrollador/equipo web fuera responsable de todo a la especialización más exquisita.
Aprendí a hacer testing, TDD, metodología XP y pair programing en 2007. Hacia 2008 con el boom de Javascript y Jquery, empecé a especializarme más en Javascript, aunque no fue hasta 2010 cuando pasé a ser “oficialmente” FrontEnd Developer, a pesar de que mis dotes de diseño dejan mucho que desear.
Y dejé de tocar la parte back y configuración de servidores. Dejé de subir a producción por FTP y empecé a usar control de versiones con CVS y Subversion.

Luego empezaron a aparecer librerías como Backbone y arrancó el boom de los frameworks del front, las llamadas AJAX y el desarrollo de APIs que alimentaban esos frontales “mágicos”

Por cierto, AJAX empecé a usarlo hacia 2007 cuando existía ¡¡desde 2002!! Y yo usando iframes ocultos, leyendo información y cargándola en la página principal, una “guarrada”... pero es que antes era otra epoca ;)

En 2015 me enganché a los web-components, con Polymer en su versión 0.8 y a la espera de que los ansiados estándares vieran su primera versión que no llegó hasta 3 años después.
Y aunque siempre he probado, y hecho alguna aplicación que otra, en todos los frameworks típicos, nunca me han entusiasmado en exceso.
Sí. Mola. Facilitan. Ahorran tiempo (una vez les coges el punto). Unifican los grandes desarrollos. La curva de aprendizaje puede venir hecha al incorporarte a un equipo. Y sobre todo hacen mucha “magia” que se puede traducir en desarrollo mas rápido y menos dolores de cabeza, pero ¿necesitaba usarlos?

Empiezo la polémica

Creo que en los proyectos grandes donde he trabajado, o he visto trabajar desde que ejerzo como manager, está plenamente justificado el uso de un framework, pero ¿Y en un blog? ¿Y en una web de contenidos? ¿Y en algunos juegos? En internet veo muchas webs que son contenidos y creo que no necesitan un framework para desarrollarlas.

¿Que se pueden usar frameworks? Correcto. ¿Que no penaliza? Bueno, depende. A nivel de lo que es una página web, solo hace falta hacer “botón derecho” (lo siento no uso Mac), “ver código fuente de la página” y ver en dicho código fuente “atrocidades” que ni DreamWeaver en sus mejores momentos…
Porque o bien no hay contenido, ya que se genera dinámicamente, y por tanto es contenido invisible a los crawlers de los buscadores, o bien lo que se escupe aparece “ofuscado”, cuando una web de contenido, justo lo que se tiene que leer perfectamente es el contenido, con sus tags HTML, usando la semántica de las etiquetas HTML (cuantos años luché al principio por una web Semántica)
O eso creí entender allá por 1997 cuando leí mi primer libro de HTML.

Y lo de que no es necesario usar un framework para generar contenido como un blog parece que se están dando cuenta la comunidad.
Por eso ¿Qué está pasando últimamente? Que alguien “descubre” el SSR (Server Side Rendering)
Y empiezan a aparecer frameworks sobre los frameworks para hacer lo que se hacía desde siempre, generar el contenido de la página desde en el servidor y que el navegador haga la petición y le envíe dicho contenido, eso sí, ahora usando toooooda la lógica del framework sobre otro framework. Volvemos a los inicios, pero complicándolo.
¿Por qué? Quizás porque lo no sabemos hacer de otra manera. Es lo que nos han enseñado.

Nos enseñan a usar algunas herramientas, pero no nos enseñan a pensar cuándo se deben usar dichas herramientas.
Como se suele decir: “Te enseñan a usar un martillo y todo son clavos”
¿Te enseñan el framework AcojoJS? Todo son aplicaciones con AcojoJS. Sin pararnos a pensar si es la solución idónea para nuestro problema. Funciona, ¿no?

Quizás porque no nos enseñan más.
Quizás porque no nos ponemos a pensar.
Quizás porque va todo tan deprisa que nos falta tiempo para aprender.

Porque aprendemos a usar un martillo, es decir a programar, y ¡ale! a clavar todo lo que pille, aunque sea un tornillo o un cristal.

Y es cierto. Aprendes lo suficiente para usar ese martillo con suficiente destreza. Pero nada más.
Aunque seamos conscientes de que la caja de herramientas es gigante y la cantidad de herramientas casi infinita, nos quedamos con nuestro martillo.

Pero sobre todo, creo que no se fomenta el buscar soluciones adecuadas a los problemas, si no a usar nuestra solución a cualquier problema.
Es decir, adaptamos problemas a nuestras soluciones, complicando más el problema.

Esto me pasó en uno de mis equipos, cuando nos plantearon un proyecto en el que teníamos vía libre para utilizar lo que quisiéramos. Greenfield Project lo llaman.
Pregunté:

  • ¿Qué usamos? Todos al unísono:
  • Vue! Vue! Vue!

Mi pregunta era para implicar al equipo en el análisis del problema y buscar la solución adecuada, que facilitara el trabajo y la entrega a tiempo.
Pero mi sorpresa fue mayúscula cuando con un mínimo de información sobre el proyecto, todos pedían a Barrabás, en este caso Vuerrabás :P
Menos mal que en este caso no hice como Poncio Pilato, aunque si me lleve un Soponcio Parrato :P

Este es solo un claro ejemplo de a lo que nos conduce el mundo del desarrollo actual, del que me siento parte y responsable.

WebComponents

Y ya metidos en faena, quiero también reivindicar a los denostados, en algunos círculos, web-components estándar, incluidos en muchos frameworks, pero sin pertenecer a ninguno.

Y sobre todo quiero plantear mi disconformidad con el uso que se hace de ellos con el “Atomic Design”, es decir, crear componentes atómicos, que pueden usarse solos o como parte de un componente de orden superior, conocidos como “moléculas”. Y que estos últimos a la vez puedan conformar “organismos” de componentes…

No se. Me chirría. Siempre he visto los web-components como etiquetas HTML, como un <UL> o un <TABLE> o <DIV> solo que “haga más cosas”. Igual que crearon el tag <VIDEO>, que es realmente el concepto de un web-component aplicado: permite insertar vídeo en la web de manera sencilla, con su controlador del vídeo, la pantalla de vídeo, admitiendo diferentes formatos y fuentes…

Y veo bien web-components que aporten “cosas” que no hay. Un lector de QR. Un campo de formulario para votar con estrellas. Un reloj digital. Un calendario. Un menú. Hay mil ejemplos de necesidades.

¿Pero es un componente un ente formado por un <h1>, un <h2> y un <IMG> donde además ninguno de los 3 elementos tiene que aparecer siempre, pudiendo incluso llegar a ser solamente uno de ellos…?

El argumento suele ser “es que se repite”, “es que así es flexible”, “es que si no ¿cómo lo hacemos?”

Pues puede ser un componente web, cierto. Pero también puede no serlo. Si usas un framework quizás no te quede más remedio. O si no te han enseñado a cómo hacerlo sin que lo sea.

Bajo mi punto de vista, si usas web-components y estás generando páginas estáticas, aunque se alimente el contenido de una base de datos, al fin y al cabo, ese ente de <h1><h2><img> es simplemente una plantilla HTML.

Y puedo tener plantillas con combinaciones de esos 3 elementos, si realmente se llaman a todas las combinaciones de los mismos, porque si no, emplear tiempo en tenerlo “por si acaso” es tontería. Ese es otro de los grandes problemas del mundo del desarrollo que da para otro post.

Volviendo al problema planteado. Creo que siempre y cuando sean una simple presentación de tags HTML agrupados, sin ninguna funcionalidad, es una simple plantilla.
Si tuviera funcionalidad, entonces sí podría tener sentido que fuera un web-component. O si tuviera un diseño especial, que pueda chocar con el diseño global y necesite encapsular dicho diseño, también podría ser un web-component.

Es decir, creo que un web-component, la razón de crearlo es cuando:

  1. Se puede reutilizar.
  2. Tiene una presentación que no existe ya en un tag HTML
  3. Tiene una funcionalidad que le da entidad y sentido.
  4. Tiene una parte de su presentación/diseño abstraído del entorno donde se use.

Si no cumple alguno de esos puntos, debo analizar si realmente necesito diseñar un web-component o tengo alguna alternativa.

Y siguiendo esta premisa, por lo tanto para mi no tiene sentido un web-component no visual, que solo aporte funcionalidad, como a veces he visto los llamados “data managers”.

Para mi eso es un tag HTML que ya existe. Se llama <script>. Creo una “librería” con la funcionalidad que necesito. El API que he convenido. Y todo el que lo necesite lo usa. No veo la necesidad de hacerlo mediante un web-component.

Comunicación entre web-components.

Otra "unpopular opinion". Siempre se dice, yo de hecho lo he preguntado en alguna entrevista, ¿Cómo se comunican los componentes? Y quien se lo sabe, repite el mantra: “De padres a hijos mediante propiedades, de hijos a padres mediante eventos”

Bueno, desde el “Atomic Design” quizás ese mantra sí tiene sentido.
Pero si concibes los web-components cómo “tags” autónomos, que pueden convivir y estar anidados dentro de otros, pero independientes, la comunicación debería ser siempre mediante eventos. O mediante prospección.

O sea, aunque puede haber dependencias entre web-components, como la hay en un <table> con un <tr> y este con un <td> o un <ul> con un <li>. Pero realmente puedes usarlos por separado, aunque su funcionamiento no sea el esperado o no sea correcto.

Soy más partidario de un “Phenotypic Design” para los web-components. Es decir, diseñar los web-components basándonos en el conjunto de características visibles como resultado de la interacción entre su tipo y el medio.

Los tags HTML están clasificados por su tipo: Fundación, Formato, Formulario, Marco, Imagen, Audio, Enlace, Lista, Tabla, Estilo, Meta información y Programa.
¿Por qué no seguir esta clasificación y ampliarla para los web-components si es necesario?

Usando el concepto de “parientes” he visto siempre que ineludiblemente terminamos acoplando componentes padres, madres, hijos, sobrinas, abuelas y tíos todos entre sí, como buena familia. Pero ese no es el fin de los web-components, ya que solemos perder re-utilización fuera de la “familia”, creando verdaderas “mafias”.

Un web-component, por estar anidado dentro de otro no tiene porque crear una relación padre-hijo. Para mi tienen que crear una relación simbiótica. Y las hay de muchos tipos. Pueden ser un alga-hongo, creando un web-component de más valor. Árbol-ardilla, donde uno usa al otro para darle “cobijo”.
Creo que aporta una visión más amplia, menos limitante, donde es más fácil de mantener la individualidad, y por tanto la re-utilización de web-components en diferentes entornos, aplicaciones o webs.

Indexabilidad de los web-components

Otro tema que me ha preocupado siempre es que la encapsulación que hace el shadow DOM en los web-components que hace que su contenido no sea indexable y por tanto desaparece al darle a “ver código fuente de la página”, siendo invisible para los crawlers.

Pero esto creo que también es por un mal uso que le estamos dando a los web-components.

Si tengo por ejemplo un web-component de un menú de navegación, que al final puede ser un tag <nav> al que le hemos dado una funcionalidad especial en base a unos requisitos, incluso diferente en diferentes resoluciones pantalla, y al que le hemos dado un diseño concreto.
¿Por qué no utilizar el light-dom, es decir, el dom dentro del web-component, leer este en el ciclo de creación del mismo, y pintarlo conforme a los requisitos que necesitamos?
Estaríamos dando el contenido al crawler y encapsulando maquetación, diseño y funcionalidad. ¡Voila!

Porque otra aberración que veo bastante por ahí es pasar información a un web-component mediante un json ¡¡¡que insertamos como atributo!!!
¿Por qué no generar esa información en el light-dom con HTML semántico, indexable y accesible y luego “darle forma” en el web-component?

Es cierto que puede penalizar algo el tiempo de renderizado, pero no más si lo que tienes que leer es un json o una lista de elementos como atributo para pintarlos.
Y ademaś existen técnicas para poner un “loader” o añadir una animación de fade-in después del primer renderizado.

Por otro lado, si metemos el contenido del web-component en el light-dom, en el remoto caso de que no funcionara javascript, incluso podríamos asegurarnos de que la página tuviera contenido ya que el light-dom se renderiza, aunque probablemente se verá como “HTML feo” al no cargar el CSS de los componentes y no tener CSS para esos elementos HTML del light-dom.

Ejemplo de componente nav-list
En el repo de git se puede ver la evolución según versiones.

Mis conclusiones

  • No nos enseñan a buscar soluciones a los problemas, sino a usar las soluciones que conocemos ante cualquier problema.
  • Crear un web-component cuando:
    • Se puede reutilizar.
    • Tenga una presentación que no existe ya en un tag HTML
    • Tenga una funcionalidad que le da entidad y sentido.
    • Tenga necesidad de abstraer presentación/diseño del entorno donde se use.
  • Relación entre componentes simbiótica frente a la “familiar”
  • Comunicación entre componentes mediante eventos.
  • “Phenotypic Design” frente a “Atomic Design”
  • Utilizar el light-dom cuando sea posible, para insertar contenido al web-component y hacerlo indexable

Y si has leído hasta aquí ¡gracias! :)
Nos vemos por la comunidad.

Top comments (3)

Collapse
 
danifornells profile image
Daniel Fornells

Excelentes reflexiones, felicidades.

Sobre la comunicación ↓PROPS - ↑EVENTS, coincidimos en que props nos sirve en algunos casos, pero tiene carencias evidentes:

  • ✅ Recibir valores serializables y simples: booleanos, strings, numéricos*, fechas*
  • ⚠️ Recibir datos estructurados: arrays, objetos. Tampoco soy muy fan de parsear un JSON obtenido del valor de un atributo. Que alternativas tenemos? Datalist para arrays? Volvemos al XML para objetos?
  • ‼️ Invocar métodos del componente. Un buen ejemplo sería el botón de next en tu ejemplo. Una prop booleana que una vez ejecutada desaparece 💩? Un evento custom con un listener por instancia de componente? Un protocolo de eventos por vendor con un sólo listener cómo bus en cada página? Botones invisibles y accionables en el componente?

Me encantaría que el estándard tuviera respuestas objetivas a esas casuísticas. Hace tiempo que no le echo el ojo, pero me da que no estan resueltas aún. Mientras tanto, algunos frameworks sobrepasan esas expectativas con creces. Me da que el HTML tiende a ser transpilado de por vida ya.

Collapse
 
manufosela profile image
Mánu Fosela

Gracias Daniel!
Sí, también es cierto que son solo reflexiones y que todo es cuestionable. Dependemos de tantos factores!! Y no existen balas de plata por desgracia. Pero si mantenemos el espíritu crítico y buscamos soluciones es probable que poco a poco vayamos haciendo una web mejor, accesible e indexable :)
Feliz año!

Collapse
 
pabline profile image
Pablo

Muy buen post Manu! Gran análisis de los problemas que nos creamos nosotros mismos al complicarnos por querer usar cierto framework cuando muchas veces no es necesario.