Dividere il Javascript del tema in file multipli

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 Mi Piace

Supponiamo che io non sappia nulla delle gerarchie di file core/plugins, perché sono venuto qui solo per creare un nuovo componente tematico. Dove dovrei cercare per scoprirlo? Quali sono le convenzioni di denominazione per le directory e i file al loro interno?

Guardando solo diversi componenti tematici in circolazione, ci sono tutti i tipi di schemi di annidamento e sottodirectory diversi in giro. Non sono riuscito a capire uno schema, o a trovare alcuna documentazione. (Ad esempio, qual è la differenza tra /initializers e /api-initializers e /pre-initializers? :crying_cat_face:)

1 Mi Piace

I file qui usano l’API. Onestamente, anche io mi sono chiesto per un po’ perché non posso mettere i file api-initializers in initializers.

Sì. È difficile da capire. Preferisco non pensare al numero di volte in cui ho passato 3 ore su qualcosa solo per scoprire che ho sbagliato il nome di qualcosa o l’ho messo nel posto sbagliato, o a volte, ho dimenticato di includerlo in uno dei tanti modi apparentemente esistenti per farlo (in plugin.rb, in un include in un file js - quale percorso? Ho bisogno di un’estensione?)

La cosa migliore è usare Installa l’app console Discourse Theme CLI per aiutarti a creare temi e far creare uno scheletro di tema per te. E rende il debug molto facile poiché lo carica automaticamente sul tuo server (un normale server di produzione) e (di solito) ricarica automaticamente il tuo browser.

Non ho idea di quale sia o se ci sia una differenza (non credo? Ma ho poca idea). Userei quello che si trova nello scheletro del tema.

C’è un repository chiamato all-the-themes. Puoi scaricarlo e cercarlo per trovare esempi. E usa sempre quello che è stato modificato più di recente.

3 Mi Piace

Gran parte di EmberJS (e Rails) si basa sulla Convenzione. Questo è ottimo la maggior parte delle volte, ma può essere incredibilmente frustrante quando si sbaglia anche solo leggermente, ad esempio con la denominazione.

3 Mi Piace

Per completezza, ho trovato una spiegazione di api-initializers/ qui:

(E questo lo collega alla documentazione di Ember, e poi inizia ad avere senso.)

Sarebbe comunque utile avere un’enumerazione/spiegazione di base delle possibili strutture di directory in un unico documento. (Ad esempio, so che connectors/ è una cosa… ce ne sono altre?)

Inoltre, per completezza: l’app Theme CLI preleva lo scheletro da:

Menziona solo api-initializers/.

(Sto effettivamente usando l’app Theme CLI, ma ho iniziato a usarla dopo aver già iniziato un componente tema, quindi avevo saltato il passaggio dello scheletro.)

2 Mi Piace