Contents
Introducción y enfoque general
Eliminar jQuery del frontend de WordPress y mover todo a vanilla JavaScript puede mejorar el rendimiento, reducir la carga de recursos y modernizar la base de código. Pero hacerlo sin romper el tema y los plugins requiere un plan: auditar dependencias, crear sustitutos cuando haga falta, probar progresivamente y mantener una vía de retorno.
Resumen de la estrategia segura
- Auditar dónde se usa jQuery (tema, plugins, scripts personalizados).
- No quitar jQuery de golpe: usar enfoque progresivo y condicional.
- Reemplazar funcionalidades por código vanilla o por pequeños shims sólo cuando sea seguro.
- Probar en entornos de desarrollo y staging con monitorización de errores (console, Query Monitor).
- Tener plan de rollback (re-enqueue de jQuery si algo falla).
1. Auditoría: saber quién usa jQuery
Antes de tocar nada, identifica los consumidores de jQuery. Técnicas:
- Buscar en el código: grep/rg/IDE por (, jQuery(, .on(, .ajax(.
- Usar Query Monitor (plugin) para ver qué scripts se cargan y dependencias.
- Revisar consola del navegador para errores relacionados con jQuery tras cambios.
- Revisar en el frontend: abrir Network → Scripts y ver si jquery o jquery-migrate están cargados y quién los solicita.
2. Enfoques posibles (pros y contras)
- Dequeue completo: más limpio, pero riesgo alto si plugins dependen de jQuery.
- Shim mínimo: registrar una librería ligera que provea lo básico (, jQuery) — útil si sólo se usan funciones simples.
- Solo theme en vanilla: dejar jQuery para plugins y reemplazar scripts del tema por vanilla menor riesgo.
- Eliminar jQuery-migrate: baja fricción, mejora rendimiento y seguridad sin romper dependencias directas.
3. Cómo eliminar jQuery del frontend (código)
Ejemplo seguro que elimina jQuery sólo en frontend y solo si ningún script registrado requiere explícitamente esa dependencia (comprobación adicional recomendable). Inserta en functions.php de tu tema hijo o plugin de funcionalidad:
// php add_action(wp_default_scripts, function(scripts) { if (!is_admin()) { // Evitar quitar jquery en admin if (isset(scripts->registered[jquery])) { // Opcional: eliminar migrate también si no es necesario if (isset(scripts->registered[jquery-migrate])) { scripts->remove(jquery-migrate) } // Remover jquery del frontend scripts->remove(jquery) } } })
Nota: wp_default_scripts permite manipular registros antes de que se impriman. Este ejemplo remueve jquery y jquery-migrate en frontend. Sin embargo, si un plugin está registrado con dependencia jquery, WordPress puede registrar la dependencia y lanzar errores si no está disponible. Por eso conviene:
- Detectar dependencias con wp_scripts()->registered y wp_script_is.
- O bien registrar un stub (script vacío o shim) para satisfacer dependencias sin cargar la librería completa.
Registrar un shim mínimo (satisfacer dependencias sin jQuery real)
Un shim puede definir window.jQuery y window. con características mínimas si confías en que los consumidores solo usan selectores simples y add/removeClass. A continuación un ejemplo de la estrategia: registrar un archivo jquery-shim.js que define /jQuery como envoltorio alrededor de querySelectorAll y algunos métodos básicos.
// php add_action(wp_enqueue_scripts, function() { if (is_admin()) return // Si decides usar shim en vez de la librería completa: wp_register_script(jquery-shim, get_stylesheet_directory_uri() . /assets/js/jquery-shim.js, array(), 1.0, true) // Remover jQuery real y encolar shim en su lugar wp_deregister_script(jquery) wp_enqueue_script(jquery-shim) })
Contenido de ejemplo para assets/js/jquery-shim.js (muy básico, adaptarlo según lo que realmente necesites):
// javascript (function(window, document) { use strict function (selector, context) { context = context document var nodes = context.querySelectorAll(selector) // devolver un objeto con métodos comunes return new Dollar(nodes) } function Dollar(nodes) { this.nodes = nodes } Dollar.prototype.each = function(cb) { Array.prototype.forEach.call(this.nodes, function(el, idx) { cb.call(el, idx, el) }) return this } Dollar.prototype.addClass = function(name) { this.each(function() { this.classList.add(name) }) return this } Dollar.prototype.removeClass = function(name) { this.each(function() { this.classList.remove(name) }) return this } Dollar.prototype.on = function(evt, handler) { this.each(function() { this.addEventListener(evt, handler) }) return this } Dollar.prototype.off = function(evt, handler) { this.each(function() { this.removeEventListener(evt, handler) }) return this } // Exponer mínimamente window. = window.jQuery = })(window, document)
Advertencia: este shim es únicamente para casos muy simples. Muchas librerías y plugins usan API avanzadas de jQuery (promises, .ajax, deferreds, manipulación compleja del DOM, etc.). Un shim insuficiente puede causar fallos silenciosos.
4. Reemplazar funcionalidades comunes: equivalencias jQuery → vanilla
Lista de conversiones frecuentes con ejemplos prácticos.
Document ready
// javascript // jQuery: // jQuery(function(){ / ... / }) // Vanilla: document.addEventListener(DOMContentLoaded, function() { // ... })
Selección y recorrido
// javascript // jQuery: (.items).each(function(i, el){ ... }) // Vanilla: document.querySelectorAll(.items).forEach(function(el, i) { // ... })
Agregar/ quitar clases
// javascript // jQuery: el.classList vs (el).addClass(x) element.classList.add(mi-clase) element.classList.remove(mi-clase) element.classList.toggle(mi-clase)
Manejo de eventos y delegación
// javascript // jQuery: (parent).on(click, .btn, handler) // Vanilla: document.querySelector(#parent).addEventListener(click, function(e) { if (e.target.matches(.btn)) { handler.call(e.target, e) } })
AJAX con fetch (reemplazando .ajax / .post)
// javascript // jQuery: // .post(ajaxurl, data, function(res){ ... }, json) // Vanilla con fetch: fetch(ajaxurl, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded charset=UTF-8 }, body: new URLSearchParams(data) }) .then(function(resp){ return resp.json() }) .then(function(json){ / ... / }) .catch(function(err){ console.error(err) })
Serializar formularios
// javascript // jQuery: (form).serialize() // Vanilla: function serializeForm(form) { return new URLSearchParams(new FormData(form)).toString() }
Animaciones simples
Reemplazar fadeIn/fadeOut por transiciones CSS y toggles con classList para mantener rendimiento y accesibilidad.
/ css / .fade { transition: opacity .25s ease opacity: 0 pointer-events: none } .fade.is-visible { opacity: 1 pointer-events: auto }
5. Localización de scripts (wp_localize_script) y datos desde PHP
wp_localize_script funciona igual con scripts en vanilla conserva su uso para inyectar variables desde PHP. Ejemplo:
// php add_action(wp_enqueue_scripts, function() { wp_enqueue_script(theme-main, get_stylesheet_directory_uri()./assets/js/main.js, array(), 1.0, true) wp_localize_script(theme-main, themeData, array( ajaxUrl => admin_url(admin-ajax.php), nonce => wp_create_nonce(theme_nonce) )) })
// javascript // acceder desde vanilla: fetch(themeData.ajaxUrl, { method: POST, headers: {Content-Type: application/x-www-form-urlencoded charset=UTF-8}, body: new URLSearchParams({ action: mi_accion, _ajax_nonce: themeData.nonce }) })
6. Caso práctico: pasar un script del tema a vanilla
Ejemplo: tema que usa jQuery para un toggle de menú. Código jQuery original y su versión en vanilla.
// javascript // jQuery original: // jQuery(function() { // (.btn-menu).on(click, function(e) { // e.preventDefault() // (.nav).toggleClass(is-open) // }) // }) // Vanilla: document.addEventListener(DOMContentLoaded, function() { document.querySelectorAll(.btn-menu).forEach(function(btn) { btn.addEventListener(click, function(e) { e.preventDefault() var nav = document.querySelector(.nav) if (nav) nav.classList.toggle(is-open) }) }) })
7. Políticas de compatibilidad y polyfills
Antes de eliminar jQuery, evalúa la compatibilidad de navegadores objetivo. Algunas APIs modernas pueden requerir polyfills:
- Element.prototype.closest y matches
- classList (antiguos IE)
- fetch (usar polyfill o fallback a XMLHttpRequest)
- Promise (para código que use promesas)
Incluir polyfills sólo si realmente necesitas soporte para navegadores antiguos. Para sitios actuales, la mayoría de features funcionan en navegadores modernos.
8. Pruebas y checklist antes de producción
- Realizar cambios en entorno de desarrollo y staging.
- Activar Query Monitor y revisar warnings/errores JS en consola.
- Probar flujos críticos: formularios, carrito (e-commerce), login, widgets dinámicos.
- Verificar plugins clave: sliders, galerías, constructores, formularios (Contact Form, WooCommerce etc.).
- Probar en varios navegadores y dispositivos móviles.
- Medir impacto en carga con Lighthouse, WebPageTest o GTmetrix.
- Tener un backup y plan de rollback (re-enqueue de jQuery) listo si algo falla.
9. Errores comunes y cómo solucionarlos
- Plugins que lanzan Uncaught ReferenceError: jQuery is not defined: registrar shim o no quitar jQuery hasta que el plugin se actualice o tenga alternativa.
- Funciones avanzadas no disponibles: revisar si usan .Deferred, .when, animate, plugins de terceros en esos casos la migración a vanilla es más compleja o inviable a corto plazo.
- Problemas con dependencias registradas: algunos scripts están registrados con dependencia jquery. Puedes forzar su re-registro sin dependencia solo si entiendes su comportamiento.
10. Buenas prácticas finales
- Prioriza eliminar jQuery solo en el tema, mantén jQuery si plugins lo necesitan.
- Extrae y modulariza tu JavaScript usa ES6 y un bundler (esbuild, webpack, Rollup) si conviene.
- Usa defer y async en scripts donde sea seguro para mejorar performance.
- Evita crear shims que imiten toda la API de jQuery mejor migrar funciones concretas a vanilla y mantener jQuery donde su coste de migración sea alto.
- Documenta los cambios: qué scripts se migraron y por qué, para futuras referencias.
Recursos útiles
- wp_enqueue_script — WordPress Developer
- MDN Web Docs (alternativas y ejemplos de APIs nativas)
Conclusión
Eliminar jQuery del frontend de WordPress es perfectamente viable y beneficioso si se hace de forma planificada: auditar dependencias, migrar gradualmente, usar shims solo cuando sea necesario y probar exhaustivamente. En la mayoría de proyectos modernos, mantener jQuery únicamente para plugins legacy mientras migras el código del tema a vanilla es la estrategia menos arriesgada y más eficiente.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |