Au cours des derniers mois, nous avons travaillé sur un nouveau système de compilation pour le code JavaScript des plugins. Cela mettra les plugins à jour avec les changements que nous avons apportés au système de compilation des thèmes en juillet 2025, qui s’appuient sur des technologies de navigateur et des outils de compilation JS plus modernes.
Ce changement est largement rétrocompatible. La plupart des auteurs de plugins n’auront rien à faire. ![]()
Avantages
En plus de la modernisation en coulisses, ce changement apportera un certain nombre d’avantages fonctionnels aux développeurs et hébergeurs de Discourse :
-
Les actifs des plugins sont fortement mis en cache et sont indexés par plugin. Cela signifie que le redémarrage de votre serveur en développement n’obligera pas à reconstruire tous les plugins à partir de zéro.
-
Nous pouvons commencer à inclure du code précompilé pour les plugins populaires dans nos bundles d’actifs existants. Lors d’une reconstruction, seuls les plugins modifiés/nouveaux devront être compilés. Ceci devrait être particulièrement utile pour les machines aux ressources contraintes.
-
Le code du plugin sera transpilé en un module ES natif. Cela apporte une syntaxe beaucoup plus simple, une exécution plus rapide dans le navigateur, et débloque l’utilisation future de choses comme
import()pour la division de bundles à l’avenir.
Tests / Calendrier
Nous testons ce système en interne depuis un certain temps et avons vérifié sa fonctionnalité sur des centaines de plugins officiels. Meta fonctionne avec le nouveau système depuis des 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 la valeur par défaut très bientôt. Il y aura une brève période où le nouveau système pourra être désactivé en utilisant ROLLUP_PLUGIN_COMPILER=0, en cas de surprise, mais nous avons l’intention de maintenir la période de transition au minimum.
Problèmes possibles avec les plugins complexes
Pour les plugins plus complexes, il y a quelques points sur lesquels le nouveau système est plus strict :
-
L’importation de modules d’administration depuis du code non-admin lèvera désormais une exception. Cela a toujours été déconseillé, et causait des erreurs surprenantes. Maintenant, c’est détecté et bloqué de manière plus délibérée.
Si vous rencontrez ce problème, vous devriez envisager si le code de votre plugin serait mieux placé dans le répertoire admin-js (
admin/assets/javascripts/...). Si vous avez vraiment besoin d’importer conditionnellement des modules d’administration, vous devriez utiliser l’aideoptionalRequiredu cœur pour y parvenir. -
Les importations inter-plugins sont toujours prises en charge. Cependant, de manière similaire aux modules d’administration, l’importation de modules à partir d’un plugin qui n’est pas installé/activé lèvera désormais une erreur beaucoup plus évidente. Si la dépendance inter-plugin est censée être optionnelle, vous devriez utiliser l’aide
optionalRequiredu cœur. -
Des changements subtils de synchronisation peuvent causer des problèmes dans de rares cas. Maintenant que le code du plugin est compilé en modules ES natifs, tout ce qui se trouve dans la portée du module est exécuté avec empressement. Si vous aviez une logique inhabituelle dans la portée du module, elle pourrait devoir ê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 à publier ci-dessous.