• Bienvenido a XenForo Hispano. Somos una comunidad independiente sin vínculos comerciales ni legales con XenForo Ltd. Ofrecemos asistencia en español para su software y traducciones exclusivas de complementos oficiales y de terceros.

XF 2.3 Mejora del rendimiento en XenForo 2.3

https://ginernet.com/cdn/imagenes/banners/720x90-es.gif
En la entrada de hoy de "¿Has visto...?" para XenForo 2.3 vamos a ver cómo nos hemos centrado en mejorar el rendimiento, garantizando que tu comunidad tenga una experiencia rápida y fluida. Vamos a profundizar en los avances que hemos hecho y cómo se comparan con varias métricas de rendimiento.

Pero, antes de entrar en los cambios individuales, echemos un vistazo rápido a la línea de base: esta es nuestra puntuación de rendimiento actual calculada por Lighthouse para la lista de foros de XenForo Community:

1695829857316.png


Aquí tienes las puntuaciones de rendimiento de otros programas de foros:

1695829935511.png
1695829999713.png
1695830070970.png


Es fundamental tener en cuenta que, aunque esta puntuación proporciona una referencia de rendimiento, no es el único indicador de éxito. De hecho, los resultados pueden fluctuar ligeramente con múltiples pruebas. Un sitio puede seguir gozando de popularidad con una puntuación más baja, pero una puntuación más alta mejora innegablemente tanto la clasificación en los motores de búsqueda como la experiencia general del usuario.

Permanece atento. Pronto revelaremos la puntuación actualizada de XenForo 2.3. Pero antes de eso, sumerjámonos en los cambios que nos han traído hasta aquí, ¿sí?

Si quieres saltar a una sección en particular, utiliza los enlaces de abajo.
Alternativamente, si desea saltarse un montón de lectura, echa un vistazo a la TL;DR a continuación:

Para ver este contenido necesitaremos su consentimiento para instalar cookies de terceros.
Para obtener información más detallada, consulte nuestra página de cookies.


Ah, y si te preocupa que lo único que tengamos para mostrarte en XenForo 2.3 sean mejoras de rendimiento, no temas.

La semana que viene presentaremos una nueva función.
 

Mejoras en Font Awesome​

En casi todas las páginas que servimos actualmente, incluimos hasta cinco variantes diferentes de la biblioteca de iconos Font Awesome 5 Pro. Eso supone hasta 8.000 iconos repartidos entre sus diferentes variantes, pero en una página determinada utilizamos... mucho menos que eso. El tamaño del archivo de cada una de estas fuentes es de hasta 200 KB, con 40 KB adicionales de CSS.

Siempre hemos querido ofrecer un subconjunto de iconos mucho más pequeño, pero cuando los administradores, diseñadores de estilo y desarrolladores de complementos tienen a su disposición el conjunto completo de iconos, esto puede ser un reto. En particular, trabajar con fuentes directamente para crear un subconjunto puede resultar algo complicado.

Ya en 2019, hicimos un prototipo de algo muy similar al excelente complemento Font Awesome Manager lanzado por @Kirby, pero finalmente decidimos que este no era necesariamente el enfoque que queríamos tomar.

En XenForo 2.3 hemos desarrollado una forma totalmente nueva de subconjuntar los iconos de Font Awesome para que solo se muestren a los usuarios los iconos que realmente se utilizan en toda la instalación de XenForo y, lo que es aún mejor, ¡es totalmente automático!

Analizador de uso de iconos​

XF 2.3 ahora incluye un analizador de uso de iconos que puede analizar con precisión qué iconos se están utilizando en varios tipos de contenido, incluyendo dentro de plantillas Less, y plantillas HTML, modificaciones de plantillas, frases e incluso dentro de JavaScript.

La forma de utilizar los iconos no ha cambiado significativamente respecto a XF 2.2. Por ejemplo, si está familiarizado con el uso de, por ejemplo, <xf:fa icon="fa-comments" /> en plantillas o .m-faContent(@fa-var-comments) en plantillas Less, entonces ya está todo listo.

Sin embargo, algunos enfoques ya no funcionarán. Por ejemplo, usar <i class="fas fa-comments"></i> ya no funcionará. Estos usos no se analizarán y no darán lugar a que se muestre un icono. Debido a esto, hay una nueva sintaxis para el uso en frases.

Consulte la tabla siguiente para ver ejemplos:

TipoCódigo
Plantillas / modificaciones de plantillas
HTML:
<xf:fa icon="fas fa-comments" />
Plantillas Less
Less:
.m-faContent(@fa-var-solid-comments);
JavaScript
JavaScript:
XF.Icon.getIcon('solid', 'fa-comments')
Frases
Código:
{icon:fas::comments}

Tenemos la intención de entrar un poco más en detalle en torno al analizador de uso de iconos en un próximo "¿Has visto...?" centrado en los desarrolladores, pero por ahora es importante señalar que el analizador de uso puede, por supuesto, ampliarse con el fin de apoyar el análisis en tipos de contenido personalizados y otros escenarios, incluyendo iconos específicos de carcasas especiales.

Renderizado de iconos​

¿Qué hacemos con los iconos analizados? Bueno, en lugar de trabajar con un formato de archivo de fuente algo torpe, utilizamos la información para producir una hoja de Sprite SVG. En realidad, no sólo una, sino una para cada uno de los estilos de Font Awesome 5 Pro - light, solid, regular y duotone y cada una de ellas contiene sólo los iconos que analizamos en esos estilos.

Por ejemplo, aquí está toda la extensión de la hoja de Sprite que generamos para el estilo solid, por defecto:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Font Awesome Pro by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license (Commercial License)
-->
<svg xmlns="http://www.w3.org/2000/svg">

    <symbol id="check-circle" viewBox="0 0 512 512">
        <path d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"/>
    </symbol>
    <symbol id="exclamation-circle" viewBox="0 0 512 512">
        <path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/>
    </symbol>
</svg>

Esto sólo se carga en las páginas que realmente utilizan esos iconos pero, lo que es aún mejor, es que mientras que antes cargábamos un archivo de fuente completo de 137 KB, esta hoja de sprites pesa apenas 726 bytes.

En total, el tamaño de archivo que cargábamos por defecto para los iconos de la página de inicio del foro era de unos 400 KB, y ahora será inferior a 40 KB.
 

Rendimiento de JavaScript​

Ahora debemos centrar nuestra atención en JavaScript y examinar el ahorro potencial de rendimiento que hemos incorporado allí.

Aplazamiento defer para JavaScript​


Los estándares de JavaScript han cambiado mucho a lo largo de los años. No hace tanto tiempo que la mejor práctica consistía en mover las etiquetas <script> a la parte inferior del HTML para retrasar lo máximo posible la ejecución del código del lado del cliente, con el fin de garantizar que se pudiera analizar primero la mayor parte del contenido de la página antes de que se cargara el código JavaScript cada vez más complejo y bloqueara el resto del análisis de la página.

Afortunadamente, JavaScript y la mayoría de los navegadores modernos admiten la nueva directiva defer en las etiquetas <script>, lo que nos permite volver a colocarlas en la parte superior del DOM.

Esto permite que el navegador empiece a descargar los scripts un poco antes, a la vez que aplaza su ejecución hasta que se cargue el resto del DOM.

Carga lenta de los gestores de JS​

En versiones anteriores de XenForo, una gran parte de nuestro código JavaScript se consideraba el "núcleo" de JavaScript, compilado en un único archivo que se cargaba en cada página. En XenForo 2.3 hemos creado un sistema para cargar de forma lenta los manejadores más utilizados cuando son necesarios. Todavía están agrupados en controladores de form, action, structure y tooltip, pero en lugar de que todos estos controladores se carguen en cada página, ahora se cargan y registran sólo si son necesarios en la página actual.

Esto representa un ahorro considerable en la mayoría de las cargas de página, garantizando que las páginas se carguen lo más rápidamente posible.
 

Adiós a jQuery​

Después de formar parte de nuestro producto desde el principio, ha llegado el momento de decir adiós a jQuery.

jQuery es una biblioteca de JavaScript que encapsula una gran cantidad de funcionalidad nativa de JavaScript en un conjunto alternativo de funciones con una liberal rociada de azúcar sintáctico.

JavaScript y los estándares de los navegadores han evolucionado significativamente a lo largo de la historia de XenForo. Hubo un momento en que hubiera sido impensable utilizar otra cosa. En un pasado no muy lejano, jQuery era prácticamente esencial incluso para poder encontrar un elemento específico con un nombre de clase específico, o para poder soportar las aparentemente interminables peculiaridades de las ahora antiguas versiones de Internet Explorer y otros.

Además, es una librería considerable, con un peso de más de 30 KB que se añaden a cada carga de página, y ¿cuánto de esa librería estábamos usando realmente?

Bueno, como desarrollador que personalmente revisó y reescribió casi 40.000 líneas de código, mucho menos de lo que se podría pensar. Y de las características de lenguaje de jQuery que estábamos utilizando, muchas cosas son un simple cambio directo a una función nativa de JavaScript que, hace mucho tiempo, podría no haber existido en absoluto, o demasiado nueva para haber obtenido suficiente soporte del navegador.

Reconocemos que habrá algunos puntos de dolor para los desarrolladores existentes que tienen el código basado en jQuery, pero, en verdad, siempre y cuando usted no está manteniendo en cualquier lugar cerca de las 40.000 líneas de código que estamos, debe ser una transición relativamente suave. Pero, si te quedas completamente atascado, siempre puedes volver a añadir jQuery si lo deseas, pero te recomendamos evitarlo si puedes. Y eliminar jQuery como dependencia puede comenzar ahora si está planeando hacer cambios al código existente antes de que XenForo 2.3 sea lanzado. Desaconsejamos encarecidamente escribir código nuevo que utilice directamente la funcionalidad de jQuery en este momento.

Si es necesario, podemos entrar en más detalles técnicos más adelante sobre los cambios que hemos hecho, pero aquí hay algunos puntos destacados.

Nota: La siguiente sección se adentra bastante en los detalles de desarrollo, así que pasa a la siguiente sección si esto no te interesa.

Variables de ámbito de bloque​

Aunque no está estrictamente relacionado con jQuery, vale la pena señalar que ya no usamos var para definir variables en favor de let y const. Esto hace que el ámbito de las variables sea más claro y que el código sea menos propenso a errores y más predecible.

Seleccionar elemento(s)​

La selección de elementos del DOM es probablemente la operación más frecuente que se realiza en JavaScript y, por lo tanto, se trata de un cambio significativo que, aunque ligeramente más verboso, hace que el código sea mucho más claro y menos propenso a errores.

jQuery / XF 2.2​

JavaScript:
var $element = $('.someClassName')
if ($element.length)
{
   // you have an object containing one or more elements; you can call various methods which will interact with this element or elements
}

JavaScript / XF 2.3​

JavaScript:
const element = document.querySelector('.someClassName')
if (element)
{
    // you have an instance of HTMLElement, if more elements exist with the same selector, you have the first element
}

// ... or

const elements = document.querySelectorAll('someClassName')
if (elements.length)
{
    // you have a NodeList object containing one or more HTMLElement objects
}

Funciones de flecha​

De nuevo, aunque no están relacionadas con jQuery, ahora verás que las funciones de flecha se utilizan tanto como sea posible. Además de ser sintácticamente más fáciles de usar que las funciones anónimas tradicionales, no crean nuevos enlaces para palabras clave como this.

jQuery / XF 2.2​

JavaScript:
var self = this
var callback = function (foo)
{
    self.doSomething(foo)
}

JavaScript / XF 2.3​

JavaScript:
const callback = (foo) =>
{
    this.doSomething(foo)
}

// ...or

const callback = (foo) => this.doSomething(foo)

Gestión de eventos​

Algunas funcionalidades proporcionadas por jQuery eran difíciles de dejar atrás, y la mayoría de esos métodos realmente útiles han sido reescritos y portados a vanilla JavaScript como métodos adicionales a nuestro objeto XF. No menos importante es la gestión de eventos de jQuery que soporta eventos namespaced y proporciona una forma más intuitiva de eliminar oyentes de eventos de un elemento que no requiere una referencia a la devolución de llamada del evento original.

jQuery / XF 2.2​

JavaScript:
var $element = $('.someClassName')
$element.on('namespace.click', function (e)
{
   e.preventDefault()
    $element.off('namespace.click')
});

JavaScript / XF 2.3​

JavaScript:
const element = document.querySelector('.someClassName')
if (element)
{
    XF.on(element, 'namespace.click', e =>
    {
        e.preventDefault()
        XF.off(element, 'namespace.click')
    })
}

AJAX​

Esto no ha cambiado mucho desde XenForo 2.2 porque todavía tenemos una envoltura XF.ajax() para usar como método de ayuda pero, entre bastidores, en lugar de usar el método $.ajax() de jQuery (que es una envoltura alrededor de XMLHttpRequest) hemos migrado para usar la más moderna API Fetch.

Lo principal a tener en cuenta aquí es que los métodos Promise disponibles a partir del resultado de llamar a XF.ajax() tienen nombres ligeramente diferentes a los que tenían con jQuery.

jQuery / XF 2.2​

JavaScript:
var t = this
XF.ajax('some-url', data, callback)
    .always(function ()
    {
        t.loading = false
    })

JavaScript / XF 2.3​

JavaScript:
XF.ajax('some-url', data, callback)
    .finally(() =>
    {
        this.loading = false
    })

Almacenamiento de datos arbitrarios para un elemento​

Algunas de las características de jQuery, aunque potentes, a veces pueden parecer incoherentes o ambiguas. Una de estas características es el método de datos disponible en los objetos jQuery. Dependiendo de su uso, puede manifestar diferentes comportamientos. Considere el siguiente ejemplo:

jQuery / XF 2.2​

JavaScript:
var $element = $('.someClassName').first() // <span class="someClassName" data-foo="1"></span>

var foo = $element.data('foo') // reads the data-foo attribute from the element in the DOM

var bar = $element.data('bar') // attempts to read the data-bar attribute from the element which doesn't exist, but the internal data store may have a value set

$element.data('bar', [1, 2, 3]) // sets the bar key in the internal data store to an array

$element.data('foo', '100') // the foo entry in the internal data store for this element now returns 100, ignoring the data-foo attribute which remains unchanged in the actual DOM

En XenForo, sigue existiendo la necesidad de almacenar datos arbitrarios, especialmente datos que no siempre son una cadena. Sin embargo, nuestros enfoques actuales son más predecibles y coherentes:

JavaScript / XF 2.3​

JavaScript:
const element = document.querySelector('.someClassName') // <span class="someClassName" data-foo="1"></span>

const foo = element.dataset.foo // reads the data-foo attribute from the DOM

element.dataset.foo = '100' // sets the data-foo attribute in the DOM

XF.DataStore.set(element, 'bar', [1, 2, 3]) // a new XF.DataStore class is introduced for reading / storing arbitrary, non-string data

const bar = XF.DataStore.get(element, 'bar') // returns an array: [1, 2, 3]

Objetivos del controlador​

Tenemos una variable especial que pasamos a todos los manejadores de elementos/eventos que actualmente es this.$target. Tenga en cuenta que esto se convierte en this.target en XF 2.3 ya que convencionalmente el prefijo $ en los nombres de variables se utiliza normalmente para denotar un objeto jQuery. En XF 2.3 this.target representa un objeto HTMLElement.

Para encontrar hijos del objetivo, esto es un poco más consistente con vanilla JavaScript que con jQuery:

jQuery / XF 2.2​

JavaScript:
var $child = this.$target.find('.someChild').first() // returns the first child element which matches the someChild class

JavaScript / XF 2.3​

JavaScript:
const child = this.target.querySelector('.someChild') // returns the first child element which matches the someChild class; this will be a HTMLElement; note it uses the same querySelector method rather than a separately named method

Apoyo a la migración​

Aunque, como es comprensible, algunos de los métodos personalizados de XF 2.3 no estarán disponibles hasta el lanzamiento, te animamos a que empieces a migrar todo el código posible ahora para utilizar vanilla JavaScript siempre que sea posible.

Si crees que necesitas ayuda para convertir el código a vanilla JavaScript, tenemos aproximadamente 40.000 líneas de experiencia entre todos e intentaremos responder a las preguntas en el foro de discusiones de desarrollo de XenForo siempre que podamos.
 

Mejora del rendimiento de CSS con HTTP/2+​

Para los servidores web que ejecutan HTTP/2 o superior, una de las principales ventajas es la compatibilidad con la multiplexación. La multiplexación permite gestionar varias solicitudes de recursos (como JavaScript y CSS) al mismo tiempo, lo que reduce la sobrecarga y aumenta la velocidad de carga de las páginas.

En XenForo 2.3, hemos optimizado esta funcionalidad refinando cómo se hacen las peticiones CSS.
  • El CSS principal, que es consistente en todas las páginas, continúa siendo agrupado en una sola petición.
  • El CSS específico de plantillas o páginas individuales se solicitará ahora por separado, en lugar de agruparse.
Para una representación más clara de estos cambios, véase más abajo.

Antes:​

HTML:
<link rel="stylesheet" href="css.php?css=public:normalize.css,public:fa.css,public:variations.less,public:core.less,public:app.less" />
<link rel="stylesheet" href="css.php?css=public:node_list.less,public:notices.less,public:share_controls.less,public:extra.less" />

Después:​

HTML:
<link rel="stylesheet" href="css.php?css=public:normalize.css,public:fa.css,public:variations.less,public:core.less,public:app.less" />
<link rel="stylesheet" href="css.php?css=public:node_list.less" />
<link rel="stylesheet" href="css.php?css=public:notices.less" />
<link rel="stylesheet" href="css.php?css=public:share_controls.less" />
<link rel="stylesheet" href="css.php?css=public:extra.less" />

Al realizar estas peticiones de forma individual y separar el CSS de los demás, se permite que las plantillas individuales se almacenen en caché y se reutilicen de forma más eficaz en diferentes páginas.
 

Redoble de tambores, por favor...​

Anteriormente hemos hablado de varias optimizaciones realizadas en XenForo 2.3, cada una con el objetivo de elevar nuestra puntuación de rendimiento Lighthouse:

Cambio a hojas de Sprite SVG para Font Awesome, reduciendo la necesidad de cargar fuentes web completas.
  • Introducción del aplazamiento nativo para las etiquetas <script>.
  • Implementación de lazy loading para los manejadores JS.
  • Reducción del tamaño de la página eliminando jQuery como dependencia.
  • Aprovechamiento de la potencia de la multiplexación HTTP/2 y desagregación de CSS.
Con estas mejoras, XenForo 2.3 ostenta una mejora significativa con respecto a la puntuación Lighthouse de 84 de XenForo 2.2. Cada mejora desempeña un papel fundamental, desde las técnicas avanzadas de carga de JavaScript hasta la optimización del tamaño de la respuesta y el aprovechamiento de las capacidades de los servidores web modernos.

Pero la prueba, como suele decirse, está en el pudín:

1695838454958.png


Este alto rendimiento se observa sistemáticamente en todo el software:

1695838301111.png
1695838332768.png


Aunque estamos tentadoramente cerca de una puntuación perfecta de 100, anticipe aún más refinamientos con la introducción del nuevo estilo en XenForo 3.0.
 
Volver
Arriba