Los jueves exploramos la historia tech y las lecciones del pasado. Hoy recordamos jQuery, la biblioteca que democratizó JavaScript y definió una era completa del desarrollo web.
El Mundo Antes de jQuery (2000-2006)
El Infierno de la Compatibilidad:
Desarrollar JavaScript cross-browser era una pesadilla épica. Cada navegador tenía su propia implementación:
// Para agregar un event listener en 2005
function addEvent(element, event, handler) {
if (element.addEventListener) {
// Firefox, Safari, Opera
element.addEventListener(event, handler, false);
} else if (element.attachEvent) {
// Internet Explorer
element.attachEvent('on' + event, handler);
} else {
// Browsers muy antiguos
element['on' + event] = handler;
}
}
// Para hacer AJAX
function createXMLHttpRequest() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
return null;
}
}
}
return null;
}
El Código Verboso Era Normal:
// Seleccionar elementos en JavaScript vanilla (2005)
var elements = [];
var allDivs = document.getElementsByTagName('div');
for (var i = 0; i < allDivs.length; i++) {
if (allDivs[i].className.indexOf('highlight') !== -1) {
elements.push(allDivs[i]);
}
}
// Modificar contenido
for (var j = 0; j < elements.length; j++) {
elements[j].style.backgroundColor = '#yellow';
elements[j].innerHTML = 'Contenido actualizado';
}
La Revolución jQuery (2006-2015)
John Resig Cambió Todo:
En enero de 2006, John Resig lanzó jQuery con una propuesta radical: “Write Less, Do More”
El mismo código anterior con jQuery:
// Seleccionar y modificar elementos
$('.highlight')
.css('background-color', '#yellow')
.html('Contenido actualizado');
// AJAX simplificado
$.get('/api/data', function(response) {
$('#content').html(response);
});
// Animaciones fluidas
$('#menu').slideDown('slow');
Las Innovaciones que Cambiaron Todo:
1. Selector Engine Poderoso:
// Selectores CSS nativos antes de que existieran en browsers
$('div > p:first-child')
$('[data-attribute*="value"]')
$(':nth-child(odd)')
2. Method Chaining:
$('#element')
.addClass('active')
.fadeIn(300)
.css('color', 'red')
.click(function() { alert('¡Clicked!'); });
3. Cross-browser Abstractions:
// Un solo API para todos los browsers
$('#button').on('click', handler); // vs addEventListener/attachEvent
$.ajax({ url: '/api', type: 'POST' }); // vs XMLHttpRequest hell
El Impacto Masivo (2008-2012)
Estadísticas del Dominio:
- 2010: 46% de los top 10k sitios usaban jQuery
- 2012: 78% de los top 100k sitios lo tenían instalado
- Peak (2013): 84% de market share entre bibliotecas JS
El Ecosistema que Nació:
Plugins Icónicos:
// jQuery UI - Interfaces ricas
$('#dialog').dialog({ modal: true });
$('#datepicker').datepicker();
$('#sortable').sortable();
// Plugins de la comunidad
$('#carousel').bxSlider();
$('#gallery').lightbox();
$('#form').validate();
Nuevos Patrones de Desarrollo:
// El patrón $(document).ready()
$(document).ready(function() {
// Código de inicialización
initializeApp();
});
// Namespace pattern para plugins
(function($) {
$.fn.myPlugin = function(options) {
return this.each(function() {
// Plugin logic
});
};
})(jQuery);
Por Qué jQuery Triunfó Tanto
1. Solving Real Pain Points:
// Before jQuery: Browser detection hell
if (navigator.userAgent.indexOf('MSIE') !== -1) {
// IE-specific code
} else if (navigator.userAgent.indexOf('Firefox') !== -1) {
// Firefox-specific code
}
// With jQuery: Feature detection abstraction
if ($.support.opacity) {
// Use native opacity
} else {
// Use IE filters
}
2. Learning Curve Mínima:
// Si sabías CSS, ya sabías jQuery selectors
$('div.container > p:first-child') // CSS selector
document.querySelector('div.container > p:first-child') // Llegó años después
3. Comunidad y Documentación Excepcional:
- API Documentation clara y con ejemplos
- Plugin Registry con miles de extensiones
- Community Support activa y welcoming
- CDN Hosting gratuito que facilitó adopción
Then vs Now: Comparación Brutal
Manipulación del DOM:
// jQuery (2010)
$('#items').append('<li>New item</li>');
// Vanilla JS (2010)
var li = document.createElement('li');
li.innerHTML = 'New item';
document.getElementById('items').appendChild(li);
// Vanilla JS (2025)
document.getElementById('items').insertAdjacentHTML('beforeend', '<li>New item</li>');
AJAX Requests:
// jQuery
$.ajax({
url: '/api/users',
type: 'GET',
dataType: 'json',
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
// Modern Fetch API
fetch('/api/users')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
Animations:
// jQuery
$('#box').animate({
left: '250px',
opacity: 0.5
}, 1000);
// Modern CSS + JS
document.getElementById('box').style.transition = 'all 1s ease';
document.getElementById('box').style.transform = 'translateX(250px)';
document.getElementById('box').style.opacity = '0.5';
El Declive y las Razones (2015-presente)
Los Browsers Se Pusieron al Día:
// jQuery advantage (2010)
$('#element')
// Native equivalents arrived (2015+)
document.querySelector('#element')
document.querySelectorAll('.class')
element.addEventListener('click', handler)
fetch('/api/endpoint')
Frameworks Modernos Cambiaron el Paradigma:
React Approach:
// jQuery way: Imperative DOM manipulation
$('#counter').text(count);
$('#button').on('click', function() {
count++;
$('#counter').text(count);
});
// React way: Declarative state management
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
Performance y Bundle Size:
// jQuery 3.x: ~87KB minified
// Modern alternative: ~0KB (native APIs)
// Bundle size comparison (2025)
jQuery: 87KB
Vanilla JS: 0KB
React: ~40KB (runtime)
Vue: ~35KB (runtime)
Lecciones Duraderas de jQuery
1. Developer Experience Matters More Than Technical Purity:
jQuery no era la biblioteca más rápida ni la más “correcta”, pero era la más pleasant de usar.
2. Abstractions Should Hide Complexity, Not Create It:
// Good abstraction
$('.items').hide();
// Over-abstraction (que algunos frameworks hicieron después)
this.viewController.renderState.setVisibility(false, {
selector: '.items',
transition: 'fadeOut'
});
3. Timing is Everything:
jQuery llegó en el momento perfecto:
- Browsers eran inconsistentes (solucionó compatibility)
- AJAX era nuevo y complicado (lo simplificó)
- CSS3 no existía (añadió animaciones)
- ES5+ no existía (proporcionó utilities)
4. Community Beats Technology:
La documentación, plugins, y comunidad de jQuery eran su mayor asset, no el código.
Lo Que jQuery Nos Enseñó Para Hoy
Para Library Authors:
- API Design: Consistency y predictability sobre features
- Documentation: Examples > technical specs
- Community: Foster ecosystem, no solo create tool
Para Developers:
- Know Your Tools: Entender qué problemas resuelve cada herramienta
- Evolve Gradually: No need to rewrite everything immediately
- Fundamentals First: jQuery devs que entendían JS vanilla se adaptaron mejor
jQuery en 2025: ¿Obsoleto o Clásico?
Still Makes Sense For:
- Legacy codebases con años de jQuery code
- Rapid prototyping cuando no quieres setup moderno
- Server-rendered apps sin build process complejo
- Learning JavaScript (controversial pero válido)
Modern Alternatives:
// jQuery-like modern libraries
import { $ } from 'cash-dom'; // 6KB jQuery alternative
import bling from 'bling.js'; // Minimal DOM manipulation
// Native modern approaches
const $ = document.querySelector.bind(document);
const $$ = document.querySelectorAll.bind(document);
Reflexión Final: El Legacy de jQuery
jQuery fue más que una biblioteca; fue una revolution in developer happiness. Demostró que hacer el desarrollo más pleasant y productive era un objetivo válido en sí mismo.
Hoy, cuando usamos:
- Method chaining en APIs modernas
- CSS selectors en
querySelector
- Promise-based async patterns
- Fluent interfaces en bibliotecas
Estamos heredando patterns que jQuery popularizó o inspiró.
El Paradox of Success:
jQuery fue tan exitoso que hizo obsoleto su propio propósito. Los browsers adoptaron sus mejores ideas, y los frameworks modernos superaron sus limitaciones.
Pero esa es la marca de una gran tecnología: no es medida por cuánto tiempo dura, sino por cuánto cambia el landscape para mejor.
Conversación Nostálgica
¿Recuerdan su primer proyecto con jQuery? ¿Cuál fue el “momento wow” que los enamoró de la biblioteca?
¿Qué plugin de jQuery era su favorito? lightbox, validator, slider, datepicker… todos tenemos esos que usábamos en cada proyecto.
¿Cuándo decidieron hacer la transición? ¿Fue gradual o un big bang migration?
¿Qué biblioteca actual creen que tendrá el mismo impacto histórico que jQuery? ¿React? ¿Vue? ¿Algo que aún no existe?
jQuery nos enseñó que la mejor tecnología no siempre es la más avanzada, sino la que hace que los developers sean más happy y productive. Esa lección sigue siendo relevante en 2025.
Próxima semana: “De Internet Explorer 6 a Chrome: La Guerra de los Browsers que Cambió la Web”
#ThrowbackThursday #jQuery #HistoriaJavaScript #DeveloperExperience #FrontendEvolution #LegacyCode