En los últimos meses, hemos estado trabajando en un nuevo sistema de compilación para el código JavaScript de los complementos. Esto actualizará los complementos a las modificaciones que realizamos en el sistema de compilación de temas en julio de 2025, las cuales se basan en tecnologías de navegador más modernas y en herramientas de construcción de JS.
Este cambio es en gran medida compatible hacia atrás. La mayoría de los autores de complementos no necesitarán hacer nada. ![]()
Beneficios
Además de la modernización interna, este cambio aportará varias ventajas funcionales a los desarrolladores y administradores de Discourse:
-
Los activos de los complementos se almacenan en caché de forma intensiva y se indexan por complemento. Esto significa que reiniciar el servidor en desarrollo no requerirá reconstruir todos los complementos desde cero.
-
Podremos comenzar a incluir código precompilado para complementos populares en nuestros paquetes de activos existentes. Durante una reconstrucción, solo se tendrán que compilar los complementos modificados o nuevos. Esto debería ser especialmente útil para máquinas con recursos limitados.
-
El código de los complementos se transpilá a un módulo ES nativo. Esto aporta una sintaxis mucho más simple, una ejecución más rápida en el navegador y habilita el uso futuro de elementos como
import()para la división de paquetes en el futuro.
Pruebas / Cronograma
Hemos estado probando este sistema internamente durante algún tiempo y hemos verificado su funcionalidad en cientos de complementos oficiales. Meta ha estado funcionando con el nuevo sistema durante semanas.
Si deseas probarlo tú mismo, puedes establecer la variable de entorno ROLLUP_PLUGIN_COMPILER=1.
Tenemos previsto cambiar la configuración predeterminada muy pronto. Habrá un breve período durante el cual el nuevo sistema podrá desactivarse usando ROLLUP_PLUGIN_COMPILER=0, en caso de imprevistos, pero nuestra intención es mantener el período de transición al mínimo.
Posibles problemas con complementos complejos
Para los complementos más complejos, hay algunos aspectos en los que el nuevo sistema es más estricto:
-
Importar módulos de administración desde código no administrativo ahora generará una excepción. Esto siempre se ha recomendado evitar, ya que podía causar errores inesperados. Ahora se detecta y bloquea de manera más deliberada.
Si te encuentras con este problema, deberías considerar si tu código de complemento estaría mejor ubicado en el directorio
admin-js(admin/assets/javascripts/...). Si realmente necesitas importar condicionalmente módulos de administración, debes utilizar el helperoptionalRequiredel núcleo para lograrlo. -
Las importaciones entre complementos aún son compatibles. Sin embargo, de manera similar a los módulos de administración, importar módulos de un complemento que no está instalado o habilitado ahora generará un error mucho más evidente. Si la dependencia entre complementos se pretende que sea opcional, debes utilizar el helper
optionalRequiredel núcleo. -
Cambios sutiles en la temporización pueden causar problemas en casos raros. Ahora que el código de los complementos se compila a módulos ES nativos, cualquier cosa en el ámbito del módulo se ejecuta de manera eagerly (inmediata). Si tenías alguna lógica inusual en el ámbito del módulo, es posible que debas moverla al código de tiempo de ejecución (por ejemplo, dentro de un constructor de clase o similar).
Si te encuentras con alguno de estos problemas y necesitas ayuda para resolverlos, no dudes en publicar un comentario a continuación.
Errores de CORS / Access-Control-Allow-Origin
Si experimentas errores de CORS después de la actualización y utilizas una CDN, debes ejecutar una reconstrucción completa de la CLI (./launcher rebuild app) para incorporar este cambio en la configuración de NGINX.
Si utilizas almacenamiento S3 (o compatible con S3) para los activos, debes configurar tu CDN para agregar el encabezado de respuesta Access-Control-Allow-Origin: * a todos los activos.