Ces derniers mois, nous avons travaillé sur un nouveau système de construction pour le code JavaScript des plugins. Cela permettra de mettre les plugins à jour avec les changements que nous avons apportés au système de construction des thèmes en juillet 2025, lesquels s’appuient sur des technologies de navigateur plus modernes et des outils de construction JS.
Ce changement est largement compatible avec les versions antérieures. La plupart des auteurs de plugins n’auront rien à faire. ![]()
Avantages
Outre la modernisation en coulisses, ce changement apportera plusieurs avantages fonctionnels aux développeurs et hébergeurs de Discourse :
-
Les ressources des plugins sont fortement mises en cache et identifiées par plugin. Cela signifie que redémarrer votre serveur en développement ne nécessitera pas de reconstruire tous les plugins à partir de zéro.
-
Nous pouvons commencer à inclure du code précompilé pour les plugins populaires dans nos bundles de ressources existants. Lors d’une reconstruction, seuls les plugins modifiés ou nouveaux devront être construits. Cela devrait être particulièrement utile pour les machines aux ressources limitées.
-
Le code des plugins sera transpilé en un module ES natif. Cela offre une syntaxe beaucoup plus simple, une exécution plus rapide dans le navigateur et ouvre la voie à l’utilisation future de fonctionnalités comme
import()pour le découpage des bundles.
Tests / Calendrier
Nous testons ce système en interne depuis un certain temps et avons vérifié son fonctionnement sur des centaines de plugins officiels. Meta fonctionne avec le nouveau système depuis plusieurs semaines.
Si vous souhaitez l’essayer vous-même, vous pouvez définir la variable d’environnement ROLLUP_PLUGIN_COMPILER=1.
Nous prévoyons de changer le paramètre par défaut très prochainement. Il y aura une courte période pendant laquelle le nouveau système pourra être désactivé en utilisant ROLLUP_PLUGIN_COMPILER=0, au cas où des imprévus surviendraient, mais nous comptons limiter au minimum la période de transition.
Problèmes possibles avec les plugins complexes
Pour les plugins plus complexes, le nouveau système est plus strict sur certains points :
-
L’importation de modules d’administration depuis du code non-administratif déclenchera désormais une exception. Cela a toujours été déconseillé et pouvait causer des erreurs surprenantes. Désormais, cela est détecté et bloqué de manière plus délibérée.
Si vous rencontrez ce problème, vous devriez envisager de déplacer votre code de plugin dans le répertoire
admin-js(admin/assets/javascripts/...). Si vous avez vraiment besoin d’importer conditionnellement des modules d’administration, utilisez alors l’helperoptionalRequiredu cœur du système pour y parvenir. -
Les importations inter-plugins sont toujours prises en charge. Cependant, de même que pour les modules d’administration, l’importation de modules depuis un plugin qui n’est pas installé ou activé déclenchera désormais une erreur beaucoup plus explicite. Si la dépendance inter-plugins est censée être optionnelle, vous devez utiliser l’helper
optionalRequiredu cœur du système. -
Des changements subtils de chronologie peuvent causer des problèmes dans de rares cas. Maintenant que le code des plugins est compilé en modules ES natifs, tout ce qui se trouve dans la portée du module est exécuté immédiatement. Si vous aviez une logique inhabituelle dans la portée du module, elle devra peut-être être déplacée dans le code d’exécution (par exemple, à l’intérieur d’un constructeur de classe ou similaire).
Si vous rencontrez l’un de ces problèmes et avez besoin d’aide pour les résoudre, n’hésitez pas à poster ci-dessous.
Erreurs CORS / Access-Control-Allow-Origin
Si vous rencontrez des erreurs CORS après la mise à jour et que vous utilisez un CDN, vous devez exécuter une reconstruction complète via l’interface de ligne de commande (./launcher rebuild app) pour intégrer ce changement dans la configuration NGINX.
Si vous utilisez un stockage S3 (ou compatible S3) pour les ressources, vous devez configurer votre CDN pour ajouter l’en-tête de réponse Access-Control-Allow-Origin: * à toutes les ressources.