Split up theme Javascript into multiple files

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 파일의 include 안에 — 어떤 경로여야 하지? 확장자가 필요한가?) 포함을 깜빡했다는 걸 발견할 때마다 속상합니다.

가장 좋은 방법은 Discourse Theme CLI 콘솔 앱을 설치하여 테마 빌드를 돕기 위해 사용하고, 이 앱으로 테마 스켈레톤(Skeleton)을 생성하는 것입니다. 그러면 서버(일반적인 프로덕션 서버)에 자동으로 업로드되고(보통) 브라우저가 자동으로 새로고침되어 디버깅이 매우 쉬워집니다.

차이가 있는지, 혹은 어떤 차이가 있는지는 잘 모르겠습니다(차이가 없다고 생각하지만, 확신은 없습니다). 저는 테마 스켈레톤에 포함된 것을 사용하는 것을 권장합니다.

all-the-themes라는 저장소가 있습니다. 이 저장소를 받아서 예제를 검색해 볼 수 있습니다. 그리고 항상 최근에 수정된 버전을 사용하는 것이 좋습니다.

3개의 좋아요

EmberJS(와 Rails)는 컨벤션에 크게 의존합니다. 대부분의 경우 이는 훌륭한 방식이지만, 이름 붙이기와 같은 사소한 부분이라도 잘못되면 극도로 짜증이 날 수 있습니다.

3개의 좋아요

참고로, api-initializers/에 대한 설명을 여기서 찾았습니다:

(이 링크는 Ember 문서로 연결되며, 그렇게 보니 이해가 되기 시작했습니다.)

여전히 한 문서에서 디렉터리 구조의 가능성을 기본적으로 나열하고 설명해 주면 좋겠습니다. (예: connectors/가 있다는 것은 알고 있습니다… 다른 것도 있나요?)

또한 참고로, Theme CLI 앱은 스켈레톤을 다음에서 가져옵니다:

여기서는 api-initializers/만 언급되어 있습니다.

(실제로 저는 Theme CLI 앱을 사용 중이지만, 이미 테마 컴포넌트의 초안을 가지고 있었기 때문에 스켈레톤 단계를 건너뛰고 사용하기 시작했습니다.)

2개의 좋아요