Theme Javascript in mehrere Dateien aufteilen

Complex theme javascript can be split into multiple files, to keep things nicely organised.

To use this functionality, simply add files to the /javascripts folder in your theme directory. These files can not be edited from the Discourse UI, so you must use the Theme CLI or source the theme from git.

Javascript files are treated exactly the same as they are in core/plugins, so you should follow the same file/folder structure. Theme files are loaded after core/plugins, so if the filenames match, the theme version will take precedence.


As an example, you can now accomplish Using Plugin Outlet Connectors from a Theme or Plugin by adding a single file to your theme:

/javascripts/my-theme/connectors/discovery-list-container-top/add-header-message.gjs

import Component from "@glimmer/component"; import { service } from
"@ember/service"; export default class HeaderMessage extends Component {
@service currentUser;

<template>
  Welcome
  {{this.currentUser.username}}
</template>
}

To use the JS API, create an initializer:

/javascripts/discourse/api-initializers/init-theme.gjs

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

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

If you need a totally different .js asset (e.g. for a web worker), check out this topic.


This document is version controlled - suggest changes on github.

27 „Gefällt mir“

Angenommen, ich weiß nichts über die Dateihierarchien von Core/Plugins, da ich nur hierher gekommen bin, um eine neue Theme-Komponente zu erstellen. Wo kann ich das herausfinden? Was sind die Namenskonventionen für Verzeichnisse und die darin enthaltenen Dateien?

Wenn ich mir verschiedene zirkulierende Themes/Komponenten ansehe, gibt es alle möglichen unterschiedlichen Verschachtelungsschemata und Unterverzeichnisse. Ich konnte kein Muster erkennen oder keine Dokumentation finden. (z. B. Was ist der Unterschied zwischen /initializers, /api-initializers und /pre-initializers? :crying_cat_face:)

1 „Gefällt mir“

Dateien hier verwenden die API. Ich habe mich ehrlich gesagt auch eine Weile gefragt, warum kann ich die api-initializers-Dateien nicht in initializers legen?

Ja. Es ist schwer, das nachzuvollziehen. Ich möchte lieber nicht darüber nachdenken, wie oft ich 3 Stunden an etwas gearbeitet habe, nur um festzustellen, dass ich etwas falsch benannt oder falsch platziert habe, oder manchmal vergessen habe, es auf eine der scheinbar vielen Arten einzuschließen, wie das möglich ist (in plugin.rb, in einem include in einer js-Datei – welcher Pfad? Brauche ich eine Erweiterung?)

Am besten verwenden Sie Installieren Sie die Discourse Theme CLI Konsolenanwendung, um Ihnen beim Erstellen von Themes zu helfen und lassen Sie es ein Theme-Skelett für Sie erstellen. Und es macht das Debugging sehr einfach, da es automatisch auf Ihren Server (einen ganz normalen Produktionsserver) hochgeladen wird und (normalerweise) Ihren Browser automatisch neu lädt.

Keine Ahnung, was oder ob es einen Unterschied gibt (ich glaube nicht? Aber ich habe wenig Ahnung). Ich würde das verwenden, das sich im Theme-Skelett befindet.

Es gibt ein Repository namens all-the-themes. Sie können es herunterladen und darin nach Beispielen suchen. Und verwenden Sie immer das, das in letzter Zeit häufiger geändert wurde.

3 „Gefällt mir“

Ein Großteil von EmberJS (und Rails) basiert auf Konvention. Das ist meistens großartig, kann aber unglaublich frustrierend sein, wenn man etwas auch nur leicht falsch macht, z. B. bei der Benennung.

3 „Gefällt mir“

FWIW, ich habe hier eine Erklärung von api-initializers/ gefunden:

(Und das verbindet es mit den Ember-Dokumenten, und dann ergibt es Sinn.)

Es wäre trotzdem schön, eine grundlegende Aufzählung/Erklärung der möglichen Verzeichnisstrukturen in einem Dokument zu haben. (Ich weiß zum Beispiel, dass es connectors/ gibt… gibt es noch mehr?)

Außerdem, FWIW: Die Theme CLI-App zieht das Skelett von:

Sie erwähnt nur api-initializers/.

(Ich benutze tatsächlich die Theme CLI-App, habe aber damit angefangen, nachdem ich bereits die Anfänge einer Theme-Komponente hatte, sodass ich den Skeleton-Schritt übersprungen hatte.)

2 „Gefällt mir“