Quanto è "difficile" modificare/estendere Discourse per uno sviluppatore backend

Alcune riflessioni a riguardo.

Sviluppo di corsi a pagamento su Discourse

L’idea di corsi relativi allo sviluppo di Discourse su una piattaforma come Udemy o Coursera è interessante. Sospetto che i problemi principali siano che non ci sono molte persone al di fuori del team di Discourse che sarebbero qualificate per creare un corso sullo sviluppo di Discourse e che il numero potenziale di studenti per un corso è piuttosto ridotto. Detto questo, sono sicuro che un buon corso relativo allo sviluppo di temi o plugin di Discourse potrebbe ottenere abbastanza studenti nel tempo da rendere lo sforzo di creare un corso degno di nota.

C’è anche un possibile problema: far pagare per i corsi di Discourse potrebbe andare contro lo spirito di questo forum. Sto solo speculando a riguardo, però.

Tutorial di sviluppo Discourse

Penso che l’osservazione che l’implementazione effettiva di molti plugin, temi e componenti tematici di Discourse sia piuttosto semplice sia corretta. Come per lo sviluppo per altre piattaforme, il problema è superare la barriera iniziale di non capire come le parti si incastrano. Il team di Discourse (o altri sviluppatori qualificati) potrebbe aiutare in questo scrivendo alcuni tutorial che ti guidino attraverso l’intero processo di creazione di temi, componenti tematici e plugin funzionali. Ad esempio, una guida passo passo per creare qualcosa come il componente tematico Discourse Placeholder.

Mi rendo conto che ciò richiederebbe un grande investimento di tempo, quindi dovrebbe essere allineato con gli obiettivi di business di Discourse.

Risorse attualmente disponibili

Con un po’ di ricerca, ci sono molte buone informazioni sullo sviluppo di Discourse su questo forum. Guardare esempi di codice dal repository GitHub di Discourse è anche un ottimo modo per imparare.

Uno strumento recente da non trascurare è GitHub Copilot. Se strutturi il tuo ambiente di sviluppo nel modo giusto, può essere utile per farti un’idea di come sviluppare temi e plugin di Discourse. Per lo sviluppo di temi Discourse, l’approccio migliore che ho trovato è sviluppare il tema (utilizzando la Discourse Theme CLI) nella directory principale della mia installazione locale di Discourse. Strutturare le cose in questo modo dà a Copilot un facile accesso alla codebase di Discourse. (Nota che per lo sviluppo di plugin, la cartella plugins è già nella directory principale /discourse.) (Nota anche, potrei sbagliarmi sul fatto che Copilot acceda effettivamente alla codebase di Discourse che ho caricato nel mio IDE. In ogni caso, è utile avere il codice principale di Discourse disponibile per il mio riferimento.)

Per evitare distrazioni e anche per concentrarmi sull’uso di Copilot come strumento di apprendimento, disattivo i completamenti di Copilot nel mio IDE (VS Code) e interagisco con Copilot solo tramite chat. Ecco un esempio del tipo di assistenza che può fornire. (shopify.js è il file creato dalla Theme CLI nella directory /javascripts/discourse/api-initializers/ del mio tema.)

Conversazione con Copilot

scossar: Puoi spiegare cosa sta facendo l’esportazione predefinita in shopify.js? È essenzialmente il codice boilerplate fornito da Discourse quando viene creato un tema con il gem discourse_theme. Ho modificato il codice boilerplate in modo che registri ogni cambio di pagina. Capisco la chiamata a api.onPageChange, ma non ho una chiara comprensione di come l’oggetto api venga iniettato nel mio codice.

GitHub Copilot: L’oggetto api viene iniettato nel tuo codice tramite la funzione withPluginApi che viene chiamata nel metodo initialize dell’oggetto restituito da apiInitializer.

Ecco una versione semplificata di ciò che sta accadendo:

  1. Quando Discourse si avvia, esegue tutti gli initializer.
  1. La funzione apiInitializer crea un initializer che viene eseguito dopo l’initializer \"inject-objects\".
  1. Quando questo initializer viene eseguito, chiama la funzione withPluginApi, passando i parametri version, cb e opts.
  1. La funzione withPluginApi controlla se la versione corrente di Discourse è compatibile con la versione specificata. In caso affermativo, chiama la funzione di callback (cb) e passa l’istanza PluginApi come argomento. Questo oggetto PluginApi è l’oggetto api che vedi nel tuo codice.

Quindi, l’oggetto api è un’istanza di PluginApi, e ti viene passato tramite la funzione withPluginApi. Questo oggetto fornisce una serie di metodi che ti consentono di interagire con Discourse, come onPageChange, che stai già utilizzando.

scossar: Quindi la funzione che è il secondo argomento dell’esportazione predefinita in shopify.js è la funzione di callback accettata da apiInitializer?

GitHub Copilot: Sì, è corretto. Il secondo argomento di apiInitializer è una funzione di callback. Questa funzione viene chiamata con l’istanza PluginApi come argomento quando l’initializer viene eseguito (supponendo che la versione corrente di Discourse sia compatibile con la versione specificata). È così che l’oggetto api viene reso disponibile nel tuo file shopify.js.

Una volta che ho risolto questo…

scossar: …Un altro pensiero, api.decorateCooked potrebbe essere utilizzato per iniettare un iframe di valutazione ospitato su un’applicazione esterna (ad esempio, ospitato dall’app Shopify che sto sviluppando)?

GitHub Copilot: Sì, puoi usare api.decorateCooked per iniettare un iframe in un post. Ecco un esempio approssimativo di come potresti farlo:

api.decorateCooked($elem => {
  const postId = $elem.data('post-id');
  const iframe = document.createElement('iframe');
  iframe.src = `https://your-app.com/ratings?post_id=${postId}`;
  iframe.width = '100%';
  iframe.height = '200'; // regola secondo necessità
  $elem.append(iframe);
}, { id: 'rating-iframe' });

In questo esempio, api.decorateCooked viene utilizzato per aggiungere un iframe a ogni post. L’origine dell’iframe è impostata su un URL della tua applicazione esterna, con l’ID del post incluso come parametro di query. Dovresti sostituire 'https://your-app.com/ratings' con l’URL effettivo della tua pagina di valutazione.

Tieni presente che questo è un esempio semplificato. Potrebbe essere necessario modificarlo per adattarlo alle tue esigenze e dovresti assolutamente aggiungere la gestione degli errori e altre precauzioni necessarie per garantire che funzioni correttamente e in modo sicuro.

Non è ragionevole a questo punto aspettarsi che Copilot scriva tutto il tuo codice, ma è un ottimo strumento per imparare a scrivere codice Discourse.