Presentazione di un nuovo sistema di build per i plugin

Negli ultimi mesi, abbiamo lavorato a un nuovo sistema di compilazione per il codice JavaScript dei plugin. Questo porterà i plugin ad essere aggiornati rispetto alle modifiche che abbiamo apportato al sistema di compilazione dei temi nel luglio 2025, le quali si basano su tecnologie browser più moderne e strumenti di compilazione JS.

Questa modifica è in gran parte retrocompatibile. La maggior parte degli autori di plugin non dovrà fare nulla. :tada:

Vantaggi

Oltre alla modernizzazione “dietro le quinte”, questa modifica porterà una serie di vantaggi funzionali agli sviluppatori e agli hoster di Discourse:

  1. Gli asset dei plugin sono fortemente memorizzati nella cache e sono indicizzati su base per-plugin. Ciò significa che il riavvio del server in fase di sviluppo non richiederà la ricompilazione di tutti i plugin da zero.

  2. Possiamo iniziare a includere codice precompilato per i plugin popolari nei nostri attuali bundle di asset. Durante una ricompilazione, sarà necessario compilare solo i plugin modificati/nuovi. Questo dovrebbe essere particolarmente utile per le macchine con risorse limitate

  3. Il codice del plugin verrà trasformato in un modulo ES nativo. Ciò comporta una sintassi molto più semplice, un’esecuzione più veloce nel browser e sblocca l’uso futuro di elementi come import() per la suddivisione dei bundle in futuro.

Test / Tempistiche

Abbiamo testato questo sistema internamente per un po’ di tempo e ne abbiamo verificato la funzionalità su centinaia di plugin ufficiali. Meta sta utilizzando il nuovo sistema da settimane.

Se desideri provarlo tu stesso, puoi impostare la variabile d’ambiente ROLLUP_PLUGIN_COMPILER=1.

Prevediamo di cambiare l’impostazione predefinita molto presto. Ci sarà un breve periodo in cui il nuovo sistema potrà essere disabilitato utilizzando ROLLUP_PLUGIN_COMPILER=0, in caso di sorprese, ma intendiamo mantenere il periodo di transizione al minimo.

Possibili problemi con plugin complessi

Per i plugin più complessi, ci sono alcune cose per cui il nuovo sistema è più rigoroso:

  1. L’importazione di moduli di amministrazione da codice non di amministrazione solleverà ora un’eccezione. Questo è sempre stato sconsigliato e causerebbe errori sorprendenti. Ora viene rilevato e bloccato in modo più deliberato.

    Se riscontri questo problema, dovresti considerare se il tuo codice plugin sarebbe meglio collocato nella directory admin-js (admin/assets/javascripts/...). Se hai davvero bisogno di importare moduli di amministrazione condizionalmente, dovresti utilizzare l’helper optionalRequire del core per ottenerlo.

  2. Le importazioni tra plugin sono ancora supportate. Tuttavia, analogamente ai moduli di amministrazione, l’importazione di moduli da un plugin non installato/abilitato solleverà ora un errore molto più evidente. Se la dipendenza tra plugin è destinata ad essere facoltativa, dovresti utilizzare l’helper optionalRequire del core

  3. Sottili modifiche temporali possono causare problemi in rari casi. Ora che il codice del plugin viene compilato in moduli ES nativi, qualsiasi cosa nello scope del modulo viene eseguita in modo sollecito. Se avevi una logica insolita nello scope del modulo, potrebbe essere necessario spostarla nel codice di runtime (ad esempio, all’interno di un costruttore di classe o simile)

Se riscontri uno di questi problemi e hai bisogno di aiuto per risolverli, non esitare a pubblicare qui sotto.

5 Mi Piace