Preferir librerías de javascript o no: El dilema constante

Bueno, creo que este será uno más de esos tantos artículos sobre si conviene usar librerías de javascript como jQuery, MooTools u otros contra javascript puro, pero quiero dejar público mi opinión sobre el tema.

Se que jQuery y MooTools son las librerías usadas más comúnmente. No puedo dejar de darle crédito al hecho que por ser usado por una enorme comunidad, guardan el gran argumento de las correcciones a bugs y añadidos que permiten el soporte de múltiples navegadores, independientemente al sistema operativo que el usuario tenga.

Otra ventaja argumentativa es la cantidad de plugins disponibles, que aumentan drámaticamente la productividad y en su defecto, la entrega del proyecto. Es razonable puesto que no se hace necesario romperse la cabeza analizando cómo lograr tal o cual efecto si viene dado lo que me interesa lograr… y de gratis en la mayoría de los casos.

Siempre han sido argumentos válidos. Yo mismo he tenido conflictos con ciertas cosas que funcionan en un navegador y en otros no. En este caso tenemos el ejemplo de objeto.innerText, que curiosamente no funciona en el por muchos adorado Firefox (más curioso aún, sí funciona en Explorer 6 y 7). Es un bug que viene de años y Mozilla aún no determina solucionarlo, lo que forza a tener que aplicar objeto.textContent si necesitamos tomar el texto contenido en un objeto.

Razones hay demás para el uso de librerías, ¿pero de verdad son razones válidas? Mi respuesta es NO. Se que suena tajante, pero sin restar importancia a los argumentos mencionados, aprender a escribir javascript y aprender a lidiar con los problemas que presenta toma tiempo. Lo bueno del tiempo es que luego que aprendemos a escribir javascript nos volvemos productivos… aún sin una librería de javascript o plugin.

Vamos, una librería es una colección de funciones corregidas quién sabe qué cantidad de veces para mejorar su performance y/o eliminar errores. Lo mismo pasa con una función escrita en javascript puro. Si escribo una función que haga un efecto en particular, al reutlizar la misma función en otro proyecto quizás encuentre un error o se me ocurra otra alternativa para mejorarlo. Mientras más lo uso mejor… y es la misma función.

Pero no hablemos mucho, mejor un ejemplo. Imaginemos que tengo un grupo de fotografías en una página con la clase “.foto” y necesito que estas se disuelvan a 30% cuando se cargue la página. Escribimos algo así:

$(document).ready(function () 
{
  	$(".foto").fadeTo(1, 0.3);
});

Pero sólo necesito que haga tal efecto, no necesito nada más de jQuery. Es un problema, porque la versión minimizada pesa 94KB, cosa irracional a mi parecer si sólo necesito el efecto de desvanecimiento. Bueno, existen otras librerías más pequeñas como Zepto.js y XUI, pero aún así no nos permiten cosas puntuales, sino que hay que cargar todo lo que la librería ofrece.

Ese es mi tema, usar cosas puntuales para lo que necesitamos en lugar de cargar TODA UNA LIBRERIA. No olvidemos que una librería tiene X peso en KBs y si añadimos un plugin, este se suma al peso de la librería. Preferiría aplicar lo siguiente:

function trns (ob,tr)
{
	ob.style.MozOpacity = (tr / 100);
	ob.style.KhtmlOpacity = (tr / 100);
	ob.style.opacity = (tr / 100);
	ob.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + tr + ')';
	ob.style.filter = 'alpha(opacity=' + tr + ')';
	ob.style.zoom = 1;
};
 
function fadeOutClass (clase,porciento)
{
	var obAll = document.getElementsByTagName('*'), vlInt = 8, vlFX = 10, porciento = Number(porciento);
 
	for (var x = 0, c = obAll.length; x < c; x++)
	{
		if (String(obAll[x].className).indexOf(clase) != -1) fx( obAll[x] );
	};
 
	function fx (ob)
	{
		var trns = 100, int;
		xTrns(ob,trns);
 
		int = setInterval(function()
        	{
        		if (trns < porciento)
        		{
        			clearInterval(int);
        			xTrns(ob,porciento);
        		} else
        		{
        			ob.trns += (0 - trns) / vlFX;
        			xTrns(ob,trns);
        		};
        	}, vlInt);
	};
};
 
fadeOutClass('foto',30);

Listo, hace lo que necesito y es extramadamente ligero, saltándose los exagerados 94KB de toda la librería de jQuery.

Otro tema que he notado de amigos desarrolladores que usan librerías de javascript es que sólo saben escribir basados en ellas y no conocen lo que está debajo. Me parece curioso que no sepan escribir algo que de hecho escriben, pero la justificación es obvia debido a que jQuery es un lenguaje de programación en sí mismo, como lo es Ruby on Rails, aquella famosa librería para Ruby que esconde todo lo “feo” o lo que el lenguaje básico no hace.

Mi sugerencia: Está bien que escribas basado en jQuery, quizás te pueda parecer más productivo y sacar tu proyecto a tiempo, pero date tiempo de aprender lo que está debajo de la librería para tener más control de lo que haces y no verte forzado a depender de lo que otros hagan (plugins), sin recibir a cambio el soporte técnico en caso de dificultad. Al final sales ganando.

De todos modos una pregunta de cierre: ¿Cuál es la belleza o romanticismo de escribir código si no lo escribes tú? Yo prefiero escribir mis funciones y código propio porque es lo que disfruto de mi trabajo. Espero no incluir jQuery u otras librerías entre mis recursos de trabajo.

About junihh

Dominicano y maquero. Dedicado al diseño web y UI. Centrado en XHTML, XML, CSS, JavaScript y comer dulces y caramelos.
This entry was posted in JavaScript and tagged , , , , , . Bookmark the permalink.

2 Responses to Preferir librerías de javascript o no: El dilema constante

  1. Veo un detalle con tu post y es que cogiste el ejemplo mas trivial para aumentar tu argumento. jQuery es mucho mas que animaciones y chulerias, el api para los xhr es una joya, tiene el monton de utility functions (manipulacion de strings, conversiones, formateo, deteccion de features en el browser para mencionar algunos), trabaja de forma asombrosa con los data attributes de html5 y ni hablemos de lo facil que es la manipular y observar cambios en el DOM.

    Pero si, para un fade in trivial el uso de una lib estaria de mas.

    • junihh says:

      Bueno, al menos me diste la razón con lo del fade. :-D

      Es cierto, me gusta como maneja XMLHttpRequest, de hecho inicialmente usaba jQuery con ese fin y nada más, pero luego de tantas pruebas y error con mis proyectos ya tengo lo que para mi es la función perfecta, sin depender de ninguna librería. Es uno de los argumentos que uso en el post, porque cuando ejecutas una misma acción varias veces, la mejoras y perfeccionas.

      Las conversiones y formateo igual. Filtrado de objetos a partir de un type, name o clase, efectos anímaticos, cambios de estado a través de eventListener, detección de navegador (si es móvil, estándar o Explorer) son cosas que ya puedo hacer gracias a prueba-error. Hasta lo de HTML5 que mencionas, ya que con 6 líneas de código y un “for” puedo validar que los elementos existan para IE 6-7-8 sin jQuery o Modernizr.

      Otra cosa que hago es la carga asincróniza de JS y de CSS. Todos muy puntuales, sin depender de librerías