# Когда переключать темы/плагины на \`.gjs\`?

**URL:** https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063
**Category:** Development
**Created:** [13.Июнь.2025 10:15:31 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063 "2025-06-13T10:15:31Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Июнь.2025 10:15:31 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/1 "2025-06-13T10:15:31Z")

</div>

Дэвид, есть ли планы прекратить поддержку «разделённых» компонентов и файлов без расширения .gjs на каком-то этапе?

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [13.Июнь.2025 10:19:45 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/2 "2025-06-13T10:19:45Z")

</div>

Скорее всего, да. Похоже, что Ember будет поддерживать отдельные файлы js/hbs в обозримом будущем, но нам может иметь смысл перейти на новый формат раньше, чтобы упростить системы сборки тем и плагинов.

Если мы решим отказаться от hbs, мы пройдем весь обычный цикл устаревания и сделаем соответствующие объявления, так что это не станет неожиданностью.

Для тем и плагинов, использующих нашу стандартную конфигурацию линтинга, файлы `.hbs` уже запрещены, и у нас есть [автоматизированный инструмент](https://meta.discourse.org/t/automatically-updating-themes-and-plugins-to-gjs-file-format/368051?u=david) для перехода на gjs. Мы почти завершили обновление всех тем и плагинов, принадлежащих CDCK, с помощью этого инструмента.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [13.Июнь.2025 13:56:45 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/3 "2025-06-13T13:56:45Z")

</div>

Итак, просто для подтверждения (чтобы я мог отредактировать свои компоненты js/hbs): компоненты hbs не поддерживаются в скелетоне темы, и настоятельно рекомендуется перенести их в gjs?

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [13.Июнь.2025 13:58:33 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/4 "2025-06-13T13:58:33Z")

</div>

Файлы Hbs продолжают «поддерживаться» (то есть они будут работать, и мы не будем этого менять без цикла устаревания)

Но да, настоятельно рекомендуется использовать `.gjs` для нового кода и начать миграцию существующих тем и плагинов. Наиболее актуальная конфигурация линтинга в шаблонах будет обеспечивать выполнение этой рекомендации, если вы явно не откажетесь от правила `require-strict-mode` линтера ember-template-lint.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [13.Июнь.2025 13:59:06 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/5 "2025-06-13T13:59:06Z")

</div>

А, теперь понятно. Спасибо за уточнение!

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Июнь.2025 14:00:12 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/6 "2025-06-13T14:00:12Z")

</div>

Я считаю, что в любом случае Glimmer Components могут быть в 3–5 раз быстрее, так что это определённо хорошая практика? (при условии, что вы не перегружаете их множеством дополнительных отслеживаний)

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [13.Июнь.2025 14:02:13 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/7 "2025-06-13T14:02:13Z")

</div>

Компоненты Glimmer значительно быстрее классических компонентов, да!

Но формат файлов `.gjs` не обязательно означает, что это компонент Glimmer. У нас всё ещё есть сотни классических компонентов в ядре, которые теперь все конвертированы в формат файлов `.gjs` (название сбивает с толку, я знаю 😅).

Кодмод, который мы выполняем, только конвертирует формат файлов из `js`/`hbs` в `.gjs`. Он не меняет тип компонента — это было бы почти невозможно полностью автоматизировать.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Июнь.2025 14:04:02 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/8 "2025-06-13T14:04:02Z")

</div>

> [@david](#):
>
> Но формат файла `.gjs` не обязательно означает, что это компонент Glimmer.

Справедливо, но часто стоит приложить усилия, если вы как раз занимаетесь ручной рефакторизацией.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [13.Июнь.2025 15:09:49 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/9 "2025-06-13T15:09:49Z")

</div>

> [@david](#):
>
> Но формат файла `.gjs` не обязательно означает, что это компонент Glimmer.

О боже. Я только подумал, что начинаю понимать.

> [@david](#):
>
> (название запутывает, я знаю 😅)

Значит, это не только у меня! 🎉

Делает ли это его компонентом Glimmer?

И если так, то даже если это просто шаблон, добавление класса ускоряет его работу по сравнению с `.gjs`, содержащим только `<template>Мои важные слова</template>`?

```plaintext
export default class MyCoolComponent extends Component {

```

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Июнь.2025 15:11:14 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/10 "2025-06-13T15:11:14Z")

</div>

Вот это:

```plaintext
import Component from "@glimmer/component";

```

(и последующее соблюдение стандартов Glimmer, таких как геттеры)

> [@pfaffman](#):
>
> `export default class MyCoolComponent extends Component {`

Это, как я полагаю, просто «объявление нативного класса».

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [13.Июнь.2025 15:17:29 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/11 "2025-06-13T15:17:29Z")

</div>

> [@merefield](#):
>
> Вот именно:
> 
> ```plaintext
> import Component from "@glimmer/component";
> 
> ```

Ага! Значит, чтобы использовать импортированную часть компонента, всё ещё нужно объявить класс.

Огромное спасибо!

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [13.Июнь.2025 16:39:24 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/12 "2025-06-13T16:39:24Z")

</div>

Моя главная проблема здесь заключается в том, что в `hbs` я могу просто обратиться к компоненту из другого тематического компонента, так как мне не нужен явный импорт. Однако в `gjs` мне необходимо его импортировать, и я не знаю, как обратиться к компоненту, определенному в другом тематическом компоненте.

Все существующие реализации, которые я изучил, либо a) всё ещё используют `hbs`, либо b) используют инъекцию на основе JavaScript.

Как это сделать?

---

<div class="post-metadata">

### Author: ![manuel](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/manuel/32/468169_2.png) [@manuel](https://meta.discourse.org/u/manuel)
#### Post date: [13.Июнь.2025 16:50:12 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/13 "2025-06-13T16:50:12Z")

</div>

> [@pfaffman](#):
>
> И если это так, то даже если это просто шаблон, добавление класса ускоряет его выполнение по сравнению с `.gjs`, который содержит только `<template>Мои важные слова</template>`?

В этом случае я получаю рекомендацию eslint:

> <https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/no-empty-glimmer-component-classes.md>

В ней предлагается добавлять класс только тогда, когда он действительно нужен, иначе это может даже замедлить работу.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [13.Июнь.2025 16:53:35 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/14 "2025-06-13T16:53:35Z")

</div>

> [@pfaffman](#):
>
> Делает ли это его компонентом Glimmer?

В порядке возрастания производительности:

- Классический компонент:

- Компонент Glimmer:

- Компонент Glimmer только с шаблоном:

> [@manuel](#):
>
> Это подразумевает, что класс следует добавлять только при необходимости, иначе это будет даже медленнее.

💯 точно

> [@RGJ](#):
>
> Я не знаю, как сослаться на компонент, определённый в другом компоненте темы.

В настоящее время темы не могут импортировать из других тем. Тот факт, что были возможны межтемовые зависимости через магическое разрешение по имени, не было задумано специально 😅

Могли бы вы подробнее описать ваш случай использования, возможно, в другой теме? Это то, с чем мы ещё не сталкивались (пока) ни в одной из наших собственных тем.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [13.Июнь.2025 17:54:41 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/15 "2025-06-13T17:54:41Z")

</div>

> [@david](#):
>
> Могли бы вы подробнее рассказать о вашем случае использования, возможно, в отдельной теме? Мы пока не сталкивались с чем-то подобным ни в одной из наших собственных тем.

Кажется, у вас это уже есть… (right-sidebar-blocks).

На прошлой неделе мой основной кейс заключался в принудительном упорядочивании нескольких компонентов темы, использующих один и тот же плагин-оутлет. Хотя CSS-файлы загружаются в алфавитном порядке, JS-файлы компонентов темы загружаются в числовом порядке. В итоге мне пришлось удалять компоненты темы и добавлять их заново в нужном мне порядке, одновременно пытаясь избежать всех проблем с CSS, которые это вызывало.

Затем я понял, что могу просто удалить коннектор в каждом из них и создать новый компонент темы, который будет содержать всё это в едином коннекторе для этого плагина-оутлета:

```plaintext
<ComponentFromTC1 />
<ComponentFromTC4 />
<ComponentFromTC3 />
<ComponentFromTC2 />

```

Это работает очень хорошо. А потом я подумал: «О, мне нужно сделать это `gjs`, чтобы не переделывать всё через несколько месяцев». И тут 🤯

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [13.Июнь.2025 18:19:39 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/16 "2025-06-13T18:19:39Z")

</div>

> [@david](#):
>
> Не могли бы вы подробнее рассказать о вашем случае использования, возможно, в отдельной теме? Мы пока не сталкивались с чем-то подобным ни в одной из наших собственных тем.

У вас был клиент, который хотел сделать это при переходе к вам. Я не помню деталей.

> [@RGJ](#):
>
> Кажется, у вас есть… (right-sidebar-blocks).

Я только что сделал форк этого решения для текущего клиента, который только что запустил свой проект. Они хотели добавить несколько других типов блоков. Я пробовал создать сестринскую тему, которая решала бы задачу только с помощью CSS, но в итоге пришлось отказаться и сделать форк. Не совсем уверен, мог ли быть найден другой путь.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [13.Июнь.2025 19:55:16 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/17 "2025-06-13T19:55:16Z")

</div>

> [@pfaffman](#):
>
> Они хотели добавить ещё несколько видов блоков

Но…

> [@Discourse](#):
>
> Вы также можете использовать другие компоненты Ember в качестве блоков, вам просто нужно указать правильное имя. Например, в ядре есть компонент Ember `signup-cta`, и вы можете использовать его в боковой панели как есть. Обратите внимание, что вы не можете использовать компоненты, которые требуют набора параметров, но вы _можете_ создать свой собственный компонент Ember в отдельной теме и ссылаться на него в настройках `blocks` боковой панели просто по его имени.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [13.Июнь.2025 20:33:36 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/18 "2025-06-13T20:33:36Z")

</div>

Это отличные новости, кроме того, что я не понял этого раньше. Я вроде бы помню, что видел это, и также помню обсуждение этой проблемы, когда кто-то предложил мне сделать форк, но теперь я уверен, что мне это не нужно.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [13.Июнь.2025 20:35:35 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/19 "2025-06-13T20:35:35Z")

</div>

Хм… [Discourse Bars 🍻 🍸 (a sidebar framework)](https://meta.discourse.org/t/discourse-bars-a-sidebar-framework/298216) … использует ту же систему, и у меня не возникало проблем.

Смысл всего этого в том, что вы можете использовать компоненты из других тем или плагинов (и это работает).

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [16.Июнь.2025 15:33:46 UTC](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063/20 "2025-06-16T15:33:46Z")

</div>

right-sidebar-blocks и discourse-tc-bars используют резолвер Ember для поиска компонентов по имени. В данный момент это работает и не устарело.

В `.hbs` это делается так: `{{component "some-name"}}`, а в (g)js можно сделать так: `resolveRegistration("component:some-name")`.

Однако, если мы говорим о долгосрочной перспективе, то нам следует стремиться избегать поиска компонентов через резолвер Ember. Как только мы в конечном итоге включим флаг «static invokables» в Embroider, резолвер станет пустым.

Это направление, которое, как я считаю, необходимо принять для right-sidebar-blocks и других подобных случаев совместного использования компонентов между темами/плагинами:

> <https://github.com/discourse/discourse-right-sidebar-blocks/pull/84>
>
> In the near future, runtime resolution of components via the ember resolver will… no longer be possible. This commit introduces a dedicated list of Right Sidebar Blocks components, and allows other themes/plugins to register additional ones.
> 
> This also avoids the issue of normal component names clashing with rsb block names, so specific handling of cases like \`custom-html-rsb\` is no longer necessary.
> 
> Other themes/plugins can register new blocks via the new \`right-sidebar-blocks\` value transformer
> 
> \`\`\`js
> api.registerValueTransformer(
> "right-sidebar-blocks",
> ({ value: blocks }) =\> blocks.set("my-amazing-block", MyAmazingBlock)
> );
> \`\`\`
> 
> For now, resolution of components via the Ember resolver is still supported, but will print a deprecation message to the console with upgrade instructions.

[Next page](https://meta.discourse.org/t/when-to-switch-themes-plugins-to-gjs/370063.md?page=2)
