Wie schwierig ist die Anpassung/Erweiterung von Discourse für einen Backend-Dev?

Hallo,

Ich bin ein MLE mit etwas Backend-Erfahrung. Meine Frontend-Kenntnisse sind nicht vorhanden/ziemlich schwach.

Ich bin daran interessiert, ein kleines Forum zu hosten, das die folgenden Funktionen erfordert:

  • Beiträge einfach nach mehreren Tags filtern
  • Bestimmte Kategorien ausblenden, es sei denn, der Benutzer ist angemeldet
  • Anmeldungen müssen vom Administrator genehmigt werden
  • Möglicherweise eine Fotocollage oben auf der Website

Ist diese Art von Dingen schwierig zu machen? Ich habe mir den Code einiger Plugins angesehen, und obwohl die eigentliche Implementierung recht kurz und einfach zu lesen ist, sieht es schwierig aus, sie zu schreiben.

2 „Gefällt mir“

Ich bin im selben Boot wie du. Ich habe Erfahrung mit Node.js-Backends. Ich habe auch ein wenig mit HTML/CSS/JavaScript im Frontend gemacht, aber ich habe viel mehr Backend gemacht. Es gibt viel von dem, was wie spezialisierter Code aussieht, der spezifisch für Discourse oder Ruby ist, oder ein sehr meinungsstarker Programmierstil. Auch wenn ich JavaScript kenne, sieht die Discourse-Codebasis für mich einschüchternd und komplex aus. Ich denke ernsthaft darüber nach, meine eigene lokale KI auszuführen, in die ich die gesamte Codebasis einspeisen und ihr dann Fragen zu Dingen stellen kann, die ich tun möchte. Abgesehen davon kann ich nur vorhandenen Code, Plugins usw. lesen und versuchen, ihn bestmöglich zu verstehen. Wenn du daran interessiert bist, Wissen auszutauschen oder gemeinsam zu lernen, bin ich offen dafür :slight_smile:

1 „Gefällt mir“

Ja, es gibt eine ziemlich steile Lernkurve. Aber all die Dinge, die Sie erwähnen, existieren bereits und es wird keine Programmierung benötigt.

sind im Kern von Discourse enthalten, und

können mit vorhandenen Theme-Komponenten realisiert werden.

5 „Gefällt mir“

Ich würde für Videokurse zur Discourse-Entwicklung auf Udemy STERBEN. Sag mir einfach, wem ich Geld hinterherwerfen soll. :dollar_banknote::dollar_banknote::dollar_banknote:

2 „Gefällt mir“

Kein Basteln nötig, dies wird bereits von der API unterstützt. Und Sie können dies bereits vom Frontend aus tun! Ich habe ein „Widget“ (Glimmer Component!) erstellt, nur um das zu tun!:

Diese Komponente funktioniert in den Blöcken und Layouts der rechten Seitenleiste.

1 „Gefällt mir“

Könnte dies verwendet werden, um eine verschachtelte Hierarchie zu erstellen?

Das Forum, das ich in Betracht ziehe, richtet sich an ältere Menschen, die Discourse wie Foren noch nicht kennen.

Es wäre schön, wenn sie weiterhin verschachtelte Strukturen wie traditionelle Foren navigieren könnten.

1 „Gefällt mir“

Zur Verschachtelung Categories verwenden.

2 „Gefällt mir“

Viele Discourse-Instanzen entscheiden sich dafür, siehe:

2 „Gefällt mir“

Thema verfehlt, aber das war hier so praktisch, ich liebe unsere Funktion „Erklären mit KI“

ein MLE bezieht sich im gegebenen Kontext auf einen Machine Learning Engineer. Dies ist ein Fachmann, der sich auf die Verwendung von Daten und Algorithmen spezialisiert hat, um Modelle zu erstellen, die es Maschinen ermöglichen, Aufgaben auszuführen, ohne dass sie explizit für diese spezifischen Aufgaben programmiert werden. Sie verfügen im Allgemeinen über einen starken Hintergrund in Informatik, Statistik und Programmierung, und ihre Expertise konzentriert sich tendenziell auf die Backend-Aspekte der Technologie, wie z. B. den Aufbau und die Bereitstellung von Vorhersagemodellen und anderen Machine-Learning-Produkten. Wenn der ursprüngliche Poster „ein MLE“ erwähnt, identifiziert er sich als Machine Learning Engineer, der mit der Backend-Entwicklung vertraut ist, aber keine Erfahrung in der Frontend-Entwicklung hat.

5 „Gefällt mir“

Ein paar Gedanken dazu.

Entwicklung bezahlter Discourse-Kurse

Die Idee von Kursen zur Discourse-Entwicklung auf einer Plattform wie Udemy oder Coursera ist interessant. Ich vermute, die Hauptprobleme sind, dass es nicht viele Leute außerhalb des Discourse-Teams gibt, die qualifiziert wären, einen Kurs in Discourse-Entwicklung zu erstellen, und dass die potenzielle Anzahl von Studenten für einen Kurs recht gering ist. Das heißt, ich bin sicher, dass ein guter Kurs zur Entwicklung von Discourse-Themes oder Plugins im Laufe der Zeit genügend Studenten finden könnte, um die Erstellung eines Kurses lohnenswert zu machen.

Es gibt auch ein mögliches Problem, dass die Gebühr für Discourse-Kurse gegen den Geist dieses Forums verstoßen könnte. Aber das ist nur Spekulation.

Discourse-Entwicklungstutorials

Ich denke, die Beobachtung, dass die tatsächliche Implementierung vieler Discourse-Plugins, Themes und Theme-Komponenten recht einfach ist, ist korrekt. Wie bei der Entwicklung für andere Plattformen besteht das Problem darin, die anfängliche Hürde zu überwinden, nicht zu verstehen, wie die Teile zusammenpassen. Das Discourse-Team (oder andere qualifizierte Entwickler) könnte dabei helfen, indem es einige Tutorials schreibt, die Sie durch den gesamten Prozess der Erstellung funktionaler Themes, Theme-Komponenten und Plugins führen. Zum Beispiel eine Schritt-für-Schritt-Anleitung zur Erstellung einer Theme-Komponente wie Discourse Placeholder.

Ich erkenne an, dass dies eine große Zeitinvestition erfordert, daher müsste es mit den Geschäfts Zielen von Discourse übereinstimmen.

Aktuell verfügbare Ressourcen

Mit ein wenig Suche gibt es viele gute Informationen zur Discourse-Entwicklung in diesem Forum. Das Betrachten von Codebeispielen aus dem Discourse GitHub-Repository ist ebenfalls eine großartige Lernmöglichkeit.

Ein aktuelles Tool, das nicht ignoriert werden sollte, ist GitHub Copilot. Wenn Sie Ihre Entwicklungsumgebung richtig einrichten, kann es hilfreich sein, ein Gefühl dafür zu bekommen, wie man Discourse-Themes und Plugins entwickelt. Für die Entwicklung von Discourse-Themes ist der beste Ansatz, den ich gefunden habe, das Theme (mit dem Discourse Theme CLI) im Stammverzeichnis meiner lokalen Discourse-Installation zu entwickeln. Die Strukturierung auf diese Weise gibt Copilot einfachen Zugriff auf die Discourse-Codebasis. (Beachten Sie, dass sich für die Plugin-Entwicklung der Ordner plugins bereits im Stammverzeichnis /discourse befindet.) (Beachten Sie auch, dass ich falsch liegen könnte, was die tatsächliche Zugänglichkeit des Discourse-Codes durch Copilot betrifft, den ich in meiner IDE geladen habe. In jedem Fall ist es hilfreich, den Kern-Discourse-Code zu Referenzzwecken verfügbar zu haben.)

Um Ablenkungen zu vermeiden und mich auf die Nutzung von Copilot als Lernwerkzeug zu konzentrieren, deaktiviere ich Copilot Completions in meiner IDE (VS Code) und interagiere nur über den Chat mit Copilot. Hier ist ein Beispiel für die Art von Unterstützung, die es bieten kann. (shopify.js ist die Datei, die vom Theme CLI in dem Verzeichnis /javascripts/discourse/api-initializers/ meines Themes erstellt wurde.)

Konversation mit Copilot

_scossar: Können Sie erklären, was der Standardexport in shopify.js tut? Es ist im Wesentlichen der Boilerplate-Code, der von Discourse bereitgestellt wird, wenn ein Theme mit dem discourse_theme-Gem erstellt wird. Ich habe den Boilerplate-Code geändert, sodass er jeden Seitenwechsel protokolliert. Ich verstehe den Aufruf von api.onPageChange, aber ich habe kein klares Verständnis davon, wie das api-Objekt in meinen Code injiziert wird.

GitHub Copilot: Das api-Objekt wird über die Funktion withPluginApi in Ihren Code injiziert, die in der initialize-Methode des Objekts aufgerufen wird, das von apiInitializer zurückgegeben wird.

Hier ist eine vereinfachte Version dessen, was passiert:

  1. Wenn Discourse startet, führt es alle Initialisierer aus.
  1. Die Funktion apiInitializer erstellt einen Initialisierer, der nach dem Initialisierer "inject-objects" ausgeführt wird.
  1. Wenn dieser Initialisierer ausgeführt wird, ruft er die Funktion withPluginApi auf und übergibt die Parameter version, cb und opts.
  1. Die Funktion withPluginApi prüft, ob die aktuelle Discourse-Version mit der angegebenen Version kompatibel ist. Wenn ja, ruft sie die Callback-Funktion (cb) auf und übergibt die PluginApi-Instanz als Argument. Dieses PluginApi-Instanz ist das api-Objekt, das Sie in Ihrem Code sehen.

Das api-Objekt ist also eine Instanz von PluginApi und wird Ihnen von der Funktion withPluginApi zur Verfügung gestellt. Dieses Objekt bietet eine Reihe von Methoden, mit denen Sie mit Discourse interagieren können, wie z. B. onPageChange, das Sie bereits verwenden.

_scossar: Die Funktion, die das zweite Argument des Standardexports in shopify.js ist, ist also die Callback-Funktion, die von apiInitializer akzeptiert wird?

GitHub Copilot: Ja, das ist richtig. Das zweite Argument von apiInitializer ist eine Callback-Funktion. Diese Funktion wird mit der PluginApi-Instanz als Argument aufgerufen, wenn der Initialisierer ausgeführt wird (vorausgesetzt, die aktuelle Discourse-Version ist mit der angegebenen Version kompatibel). So wird das api-Objekt in Ihrer shopify.js-Datei verfügbar gemacht.

Nachdem ich das geklärt hatte…

_scossar: …Ein anderer Gedanke, könnte api.decorateCooked verwendet werden, um einen Ratings-Iframe einzufügen, der auf einer externen Anwendung gehostet wurde (zum Beispiel gehostet von der Shopify-App, die ich entwickle)?

GitHub Copilot: Ja, Sie können api.decorateCooked verwenden, um einen Iframe in einen Beitrag einzufügen. Hier ist ein grobes Beispiel, wie Sie das tun könnten:

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'; // nach Bedarf anpassen
  $elem.append(iframe);
}, { id: 'rating-iframe' });

In diesem Beispiel wird api.decorateCooked verwendet, um jedem Beitrag einen Iframe anzuhängen. Die Quelle des Iframes wird auf eine URL Ihrer externen Anwendung gesetzt, wobei die Beitrags-ID als Abfrageparameter enthalten ist. Sie würden 'https://your-app.com/ratings' durch die tatsächliche URL Ihrer Ratings-Seite ersetzen.

Bitte beachten Sie, dass dies ein vereinfachtes Beispiel ist. Möglicherweise müssen Sie es an Ihre Bedürfnisse anpassen und Sie sollten definitiv Fehlerbehandlung und andere notwendige Vorsichtsmaßnahmen hinzufügen, um sicherzustellen, dass es korrekt und sicher funktioniert.

Es ist zu diesem Zeitpunkt nicht realistisch zu erwarten, dass Copilot Ihren gesamten Code schreibt, aber es ist ein großartiges Werkzeug, um zu lernen, wie man Discourse-Code schreibt.

Ich würde denken, dass weniger Kategorien und weniger Hierarchie für ältere Menschen einfacher wären.

Es sei denn, Sie haben viel Traffic, der nur für sehr wenige Menschen von Interesse ist, benötigen Sie wahrscheinlich nicht viele Kategorien.