Modernizzazione dei tag script inline per template e API JS

L’utilizzo di <script type='text/discourse-plugin'> o <script type='text/x-handlebars'> nei temi è ora deprecato. Qualsiasi uso di questi tag nei temi dovrebbe essere aggiornato seguendo le istruzioni seguenti.

I tag <script> e <script type='text/javascript'> regolari non sono interessati da questa modifica.

Cronologia

Queste sono stime approssimative, soggette a modifiche

  • Maggio 2025 - Abilitati i messaggi di deprecazione della console

  • Luglio 2025 - Banner di avviso per gli amministratori abilitati

  • Fine settembre 2025 Marzo 2026 - Rimozione della funzionalità

Conversione di <script type='text/x-handlebars'>

I template introdotti con questo metodo devono essere spostati in file .hbs dedicati, oppure ristrutturati in file .gjs.

Per mantenere HBS, i template dei connettori possono essere inseriti in:

{theme}/javascripts/discourse/connectors/{outlet-name}/{connector-name}.hbs

e i template dei componenti possono essere inseriti in:

{theme}/javascripts/discourse/components/{component-name}.hbs

:warning: Da marzo 2026, anche i file .hbs sono deprecati. Dopo aver effettuato questa conversione, passare alle istruzioni in Deprecating .hbs file extension in themes and plugins

Per creare connettori e componenti nel moderno formato .gjs, consultare questo capitolo del tutorial per gli sviluppatori di temi:

Conversione di <script type='text/discourse-plugin'>

Il codice all’interno di questi tag può essere migrato in un file JavaScript dedicato.

Se si sviluppa il tema tramite l’interfaccia del pannello di amministrazione, copiare il codice fuori dal <script>, e spostarlo nella scheda JS (dove è indicato // your code here).

Se si sviluppa il tema in locale, creare un nuovo file in

{theme}/javascripts/discourse/api-initializers/init-theme.js

quindi aggiungere questo wrapper e inserire il codice nel punto indicato:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  // Your code here
});

Nei tag script, l’unico modo per importare altri moduli JS era tramite la sintassi require(). Sebbene questo funzioni ancora in un file .js, sarà presto deprecato, quindi ora sarebbe un buon momento per convertirlo in importazioni ES6 moderne. Per esempio:

- const I18n = require("discourse-i18n").default;
+ import I18n from "discourse-i18n";
- const { h } = require("virtual-dom");
+ import { h } from "virtual-dom";

Per maggiori informazioni sugli inizializzatori JS:

19 Mi Piace

Forse una domanda molto stupida, ma ho un componente tema molto molto semplice che ho inserito direttamente nella console di amministrazione sotto \u003chead\u003e:

<script type="text/x-handlebars" data-template-name="/connectors/top-notices/whos-online-below-site-header">
{{whos-online}}
</script>

Se sto seguendo correttamente questo post, significa che ora devo creare una cartella separata per il componente tema, ospitarla su GitHub e aggiungere il componente solo per qualcosa di semplice come l’aggiunta a un plugin outlet?

Spero di no, perché ciò interromperebbe la maggior parte dei miei semplici componenti tema :grimacing:

Ora c’è la scheda JS, quindi probabilmente puoi usare api.renderInOutlet ora.

1 Mi Piace

Ah, non avevo visto che fosse possibile farlo anche con i connettori/componenti, ma nell’articolo collegato ho trovato questo:

Forse più facile di quanto pensassi, grazie!

2 Mi Piace

Grazie per questo post!
Potrebbe essere una domanda molto basilare, credo:
Dato che non abbiamo una sandbox, devo essere sicuro prima di procedere.
Devo aggiornare un tema interessato, quindi ho ragione se dico che tutto il codice relativo a “Script” dalla scheda “head” deve essere spostato nella scheda JS come illustrato di seguito:

Quasi, ma non del tutto. Dovresti rimuovere i tag script e cambiare le importazioni in qualcosa come:

import { ajax } from "discourse/lib/ajax";

Quindi, incolla tutto questo nella scheda JS, all’interno:

Il nostro sito Discourse (ospitato da Discourse) sta attualmente generando la seguente barra di errore (che è ciò che mi ha portato a questo thread):

Non sono a conoscenza di aver apportato alcuna personalizzazione al tema ‘Light’ da parte nostra e, guardando la sua pagina di amministrazione, non vedo nulla che suggerisca che si tratti di altro se non del predefinito fornito dal sistema (ma potrei facilmente perdermi qualcosa).

Per un sito ospitato come il nostro, è probabile che si risolva da solo nel tempo o richiede un’azione da parte nostra?

Grazie,
-Brad

Dovrai intervenire per risolvere questo problema: non sparirà da solo.

Ho dato una rapida occhiata al tuo sito in Chrome DevTools e sembra che il codice pertinente sia correlato all’aggiunta della lingua ‘chapel’ a highlightjs.

Se visiti il tuo tema ‘Light’ e fai clic su ‘modifica codice’, dovresti trovarlo sotto una delle schede HTML. Quindi puoi seguire le istruzioni nell’OP di questo argomento per spostarlo nella scheda ‘JS’.

1 Mi Piace

Grazie @david! Avevo dimenticato che avevamo apportato alcune personalizzazioni per ottenere l’evidenziazione di Chapel e non sono sicuro che sarei arrivato da solo dal banner di errore, quindi apprezzo l’assistenza e i suggerimenti.

-Brad

1 Mi Piace

Ho un semplice file .html:

<script type='text/x-handlebars' data-template-name='/connectors/below-site-header/oprs-top-container'>
    <div id='WW_T_D_1' class='oprs-top-leaderboard'></div>
</script>

Sono un po’ confuso riguardo ai diversi modi per eseguire questa migrazione. Apprezzerei se qualcuno mi spiegasse cosa fare. Grazie

Basta renderInOutlet al connettore

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  api.renderInOutlet("below-site-header", <template>
    <div id='WW_T_D_1' class='oprs-top-leaderboard'></div>
  </template>);
});
2 Mi Piace

Grazie. Ho provato e non ha funzionato :confused:

Questa è la mia struttura e questi sono

below-site-header.js


export function test() {
    let test2 = document.querySelector('.test');
    console.log('test ', test2);
}

E below-siteheader-connectors.hbs


<div></div>

Sono nuovo in questo, quindi qualsiasi aiuto è apprezzato. Ho preso questo repository da uno sviluppatore precedente.

Ciao, potresti condividere il link al tuo repository Github? Grazie!

Quindi ho inserito il mio piccolo script “make-avatar-bigger” nella scheda JS (da Desktop - ), e funziona abbastanza semplicemente, ma c’è almeno un modo rapido e “sporco” per far sì che si applichi solo su Desktop? Anche i miei avatar mobili sono ora grandi e sembra piuttosto sciocco.

Il codice di riferimento è:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  api.changeWidgetSetting('post-avatar', 'size', '70');
});

Hmm… forse aggiustare questo con CSS?

3 Mi Piace

Ha funzionato perfettamente, grazie!

1 Mi Piace

Solo un promemoria amichevole: changeWidgetSetting su post-avatar è un’API deprecata e verrà rimossa presto.

Forse dovresti cambiare il tuo codice in questo

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  const site = api.container.lookup("service:site");
  if (!site.mobileView) {
    api.modifyClass("component:post/avatar", (SuperClass) =>
      class extends SuperClass {
        get size() {
          return "70";
        }
      }
    );
  }
});
5 Mi Piace

Penso che ci sia anche un componente #ufficiale per questo? Avatar Size and Shape

Non sono sicuro che si adatti al caso d’uso particolare, ma sembra che dovrebbe (con il bonus aggiunto che qualcuno lo correggerà se avrà bisogno di aggiornamenti :slight_smile:)

7 Mi Piace

Sono passato da “quick 'n dirty” a ufficialmente supportato, grazie a tutti!

4 Mi Piace

Da notare per chi ha componenti legacy (che utilizzano una gestione separata Desktop/Mobile) che la scheda JS è disponibile solo nella sezione Common - si spera che questo risparmi ad altri qualche ricerca :slight_smile:

1 Mi Piace