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 🙂 |
