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

Ciao,

Sono un MLE con una certa esperienza nel backend. Le mie competenze frontend sono inesistenti/abbastanza deboli.

Sono interessato a ospitare un piccolo forum che richiede le seguenti funzionalità:

  • Filtra i post per più tag in modo semplice
  • Alcune categorie devono essere nascoste a meno che l’utente non sia loggato
  • Le iscrizioni richiedono l’approvazione dell’amministratore
  • Potenziale carosello di foto in cima al sito

Questo tipo di cose è difficile da fare? Ho esaminato il codice di alcuni plugin e, sebbene l’implementazione effettiva sia piuttosto breve e semplice da leggere, sembra difficile da scrivere.

2 Mi Piace

Sono nella stessa barca. Ho esperienza con il backend nodejs. Ho fatto anche un po’ di html/css/javascript sul frontend, ma ho fatto molto di più sul backend. C’è molto di quello che sembra codice specializzato specifico per discourse o ruby o uno stile di codifica molto opinabile, anche se conosco javascript, la codebase di discourse mi sembra intimidatoria e complessa. Sto pensando seriamente di provare a eseguire la mia IA locale in cui posso inserire l’intera codebase e poi farle domande per le cose che voglio fare. Oltre a ciò, tutto ciò che posso fare è leggere il codice esistente, i plugin, ecc. e cercare di capirne il più possibile. Se sei interessato a condividere conoscenze o a provare a imparare insieme, sono aperto a questo :slight_smile:

1 Mi Piace

Sì, c’è una curva di apprendimento piuttosto ripida. Ma tutte le cose che menzioni esistono già e non sarà necessaria alcuna codifica.

sono nel core di Discourse, e

possono essere realizzati con componenti tematici esistenti.

5 Mi Piace

Ucciderei per alcuni corsi video sullo sviluppo di discourse su Udemy. Dimmi solo a chi devo dare i soldi. :dollar_banknote::dollar_banknote::dollar_banknote:

2 Mi Piace

Non c’è bisogno di armeggiare per questo, è già supportato dall’API. E puoi già farlo dal front end! Ho creato un “widget” (Glimmer Component!) solo per farlo:

Questo componente funziona nei blocchi e nei layout della barra laterale destra.

1 Mi Piace

Potrebbe essere utilizzato per creare una gerarchia nidificata.

Il forum che sto considerando si rivolge a persone anziane che non hanno mai visto discussioni come i forum prima d’ora.

Sarebbe bello per loro poter ancora navigare in strutture nidificate come i forum tradizionali.

1 Mi Piace

Per annidare usa Categorie.

2 Mi Piace

Molte istanze di Discourse scelgono questa opzione, vedi:

2 Mi Piace

Fuori tema, ma è stato così utile qui, adoro la nostra funzione “spiega usando l’IA”

un MLE nel contesto dato si riferisce a un Machine Learning Engineer. Si tratta di un professionista specializzato nell’utilizzo di dati e algoritmi per costruire modelli che consentono alle macchine di eseguire attività senza essere esplicitamente programmate per tali attività specifiche. Generalmente hanno una solida base in informatica, statistica e programmazione, e la loro esperienza tende a concentrarsi sugli aspetti backend della tecnologia, come la creazione e il dispiegamento di modelli predittivi e altri prodotti di machine learning. Quando l’autore originale menziona “un MLE”, si identifica come un Machine Learning Engineer che ha familiarità con lo sviluppo backend ma che manca di esperienza nello sviluppo frontend.

5 Mi Piace

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.

Penserei che avere meno categorie e meno gerarchia sarebbe più facile per le persone anziane.

A meno che tu non abbia molto traffico di interesse per pochissime persone, probabilmente non hai bisogno di molte categorie.