テーマの Javascript を複数のファイルに分割

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

core/plugins のファイル階層について何も知らない場合、新しいテーマコンポーネントを作成するためにここに来たとしたら、どこを見ればわかるでしょうか?ディレクトリやその中のファイルの命名規則は何ですか?

流通しているさまざまなテーマ/コンポーネントを見ていると、さまざまなネストスキームやサブディレクトリが飛び交っています。パターンを把握したり、ドキュメントを見つけたりすることができませんでした。(例: /initializers/api-initializers/pre-initializers の違いは何ですか? :crying_cat_face:)

「いいね!」 1

ここにあるファイルはAPIを使用します。私もしばらくの間、なぜapi-initializersファイルをinitializersに置けないのか疑問に思っていました。

ええ。理解するのは難しいですね。3時間かけて何かを作り上げたのに、名前を間違えたり、間違った場所に置いたり、あるいは、それを(plugin.rbで、jsファイルに含める際に、どのパスを使うべきか?拡張子が必要か?)など、多くの方法があるうちの1つに含め忘れたりしたことを思い出すのは、考えたくありません。

一番良いのは、DiscourseテーマCLIコンソールアプリをインストールしてテーマの作成を支援する を使用して、テーマのスケルトンを作成してもらうことです。そして、それは自動的に本番サーバー(普通の古い本番サーバー)にアップロードし、(通常は)ブラウザを自動的にリロードしてくれるので、デバッグが非常に簡単になります。

違いがあるのかどうか(あると思いませんが、あまりよく分かりません)は分かりません。テーマのスケルトンにあるものを使用します。

all-the-themes というリポジトリがあります。それを取得して、例を検索することができます。そして、常に最近変更されたものを使用してください。

「いいね!」 3

EmberJS(およびRails)の多くは、慣習に依存しています。これはほとんどの場合素晴らしいことですが、たとえわずかな間違い、例えば命名規則を間違えただけでも、信じられないほどイライラすることがあります。

「いいね!」 3

FWIW、api-initializers/ についてはこちらで説明を見つけました。

(そして、それがEmberのドキュメントに接続され、意味が通るようになります。)

それでも、ディレクトリ構造の可能性について、基本的な列挙/説明を1つのドキュメントで確認できると良いでしょう。(例えば、connectors/ があることは知っていますが、他にもありますか?)

また、FWIW:Theme CLI アプリはスケルトンを以下からプルします。

そこには api-initializers/ についてしか言及されていません。

(実際、Theme CLI アプリを使用していますが、すでにテーマコンポーネントの初期段階を作成した後で使い始めたため、スケルトンのステップはスキップしました。)

「いいね!」 2