# 我们可以在 discourse 插件中添加 ember 插件吗？（例如 ember power select）

**URL:** <https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507>\
**Category:** Development\
**Created:** [2021年三月26日 16:17 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507 "2021-03-26T16:17:46Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![JQ331](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@JQ331](https://meta.discourse.org/u/JQ331)\
**Post date:** [2021年三月26日 16:17 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/1 "2021-03-26T16:17:46Z")

</div>

我想在一个插件中添加一些 Ember 插件。

举个例子：Ember 的 [Power Select](https://ember-power-select.com/docs/the-search)。

（这有助于处理下拉菜单。Discourse 使用的是 `select-kit`，我知道它也很强大，但我发现它很难自定义，因为它在代码库中被高度抽象了。所以我打算尝试使用 Power Select。）

在普通的 Rails/Ember 应用中，我想我可以直接使用以下命令安装插件：

```plaintext
$ ember install ember-power-select

```

然后我会添加类似以下内容：

hbs 模板：

```
<PowerSelect @options={{this.names}} @onChange={{this.foo}} as |name|>
  {{name}}
</PowerSelect>

```

与之配套的 JavaScript 文件：

```plaintext
    import Controller from '@ember/controller';
    export default class extends Controller {
      names = ['Stefan', 'Miguel', 'Tomster', 'Pluto']
      foo() { }
    }

```

但 Discourse 插件并不是标准的 Rails 应用。为了让它正常运行，我是否需要做一些特殊处理？

---

<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:** [2021年三月30日 20:15 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/2 "2021-03-30T20:15:31Z")

</div>

好吧，我原本还抱着或许能从中得到些提示的期待看了这个帖子，但如今四天过去了，我们依然在这里。

> [@JQ331](#):
>
> Discourse 使用了 `select-kit`，我知道它也很强大，但我发现它很难定制，因为其在代码库中被高度抽象化了。

我在 Ember 方面还是个新手，但我相当确定，如果你能设法处理好那些“高度抽象化”的内容并遵循其规则，情况会好得多。这不仅是因为引入其他插件难以搞懂，而且后续维护也会很困难。

---

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [2021年三月30日 20:30 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/3 "2021-03-30T20:30:22Z")

</div>

> [@JQ331](#):
>
> 我想我只需使用以下命令添加该插件：
> 
> `$ ember install ember-power-select`

我们正将 Discourse 升级到 EmberCLI，目前已接近完成：

> [@EmberCLI: Coming to a Discourse near you!](https://meta.discourse.org/t/embercli-coming-to-a-discourse-near-you/143528?u=falco):
>
> We’d like to migrate Discourse’s asset pipeline over to use [EmberCLI](https://ember-cli.com/). EmberCLI is the standard way to develop Ember applications and Discourse’s approach has long been a source of confusion for people approaching our project with an Ember.js background. Background Discourse has been around long enough that it pre-dates EmberCLI’s existence, and in fact using something like the Rails asset pipeline was considered a best practice at the time. Over the years we’ve tacked on more and more to our E…

---

<div class="post-metadata">

**Author:** ![JQ331](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@JQ331](https://meta.discourse.org/u/JQ331)\
**Post date:** [2021年三月30日 20:41 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/4 "2021-03-30T20:41:49Z")

</div>

谢谢大家。

> [@Falco](#):
>
> 我们正在将 Discourse 升级到 EmberCLI，目前进展非常接近完成：

我之前就注意到过这一点，但很高兴得到确认：在该升级完成之前，无法添加 Ember 插件。听起来，一旦升级完成，添加 Ember 插件很快就会成为可能。这听起来很棒。

* * *

> [@pfaffman](#):
>
> 但我相当确信，如果你能设法处理那些“高度抽象”的内容并遵循相关规则，你的处境会好得多。

我认为这是一个有趣的问题。以下是我的两点看法：

关于使用 Discourse 的“抽象内容”与 Ember 插件：我可能错了，但在某些情况下，如果你想在插件中实现与 Discourse 现有功能不同的特定任务，使用 Ember 插件可能会_更容易_维护。我的思路如下：

* * *

这里的例子是想要在插件中添加一个全新的下拉菜单。这个区别可能很重要——我指的是在插件中尝试实现 Discourse 代码库中尚未实现的新功能，问题在于是应该从 Discourse 的方法入手，还是使用独立的插件。

很多时候你确实没有选择。例如，如果我想为话题添加一个自定义字段，我肯定会基于 Discourse 的预建方法和代码进行定制。

但如果是一个有针对性的功能模块——比如用于新目的的下拉菜单——那么情况就不同了：如果我使用 Discourse 的方法，我就得将它们适配到原本并非针对这些用途的场景中。

_选项 1_：我可以尝试从 category-chooser 等组件中看到的 select-kit 代码，将其插入到一个新的位置（与类别无关），然后尝试将其定制为我想要的下拉菜单内容，而不是类别。这就是我前面提到的那个棘手的任务。

而且这可能难以维护——因为如果 Discourse 团队改变了 category-chooser 中 select-kit 代码的工作方式，那可能会以意想不到的方式影响我新定制的下拉菜单（因为我已将其定制得与实际的 category-chooser 下拉菜单略有不同）。

_选项 2_：我可以插入一个来自 Ember 的组件，它既稳健又易于定制，并且我能相对清楚地看到代码的实际运作方式。在这种情况下，我可能会错过 Discourse 为其下拉菜单添加的新功能，但我能更容易地掌控我的下拉菜单的运作方式。因此，如果可行的话，我认为这可能是最佳选择。

_选项 3_：完全从头编写代码。这正是我目前倾向于采用的方式。代码完成后，拥有我完全理解并可自由定制的代码确实令人满意。但当然，这需要更长时间，而且（至少在初始版本中）不太可能像 Discourse 团队或 Ember 团队构建的功能那样强大和稳健。

---

<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:** [2021年九月12日 08:48 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/5 "2021-09-12T08:48:11Z")

</div>

顶一下，如果能支持 Ember 插件到主题组件就太好了……

---

<div class="post-metadata">

**Author:** ![edwardila](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/edwardila/32/217748_2.png) [@edwardila](https://meta.discourse.org/u/edwardila)\
**Post date:** [2021年九月20日 08:11 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/6 "2021-09-20T08:11:50Z")

</div>

顶一下。  
如果我们在 Discourse 中添加插件，例如执行：  
**cd app/assets/javascripts/ && yarn add LIB\_NAME**  
那么这个插件将如何在插件中可用？

---

<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:** [2022年十一月16日 08:55 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/7 "2022-11-16T08:55:13Z")

</div>

我想知道现在是否可能做到这一点？（如果可能，如何做到？）

---

<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:** [2022年十一月16日 09:49 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/8 "2022-11-16T09:49:56Z")

</div>

恐怕不行。Ember 插件可以添加到 Discourse 核心中，但不能通过插件添加。我们最终可能会添加某种方式让插件/主题指定 npm 依赖项，但这不在近期的路线图中。

---

<div class="post-metadata">

**Author:** ![StonkGodCapital](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/stonkgodcapital/32/242643_2.png) [@StonkGodCapital](https://meta.discourse.org/u/StonkGodCapital)\
**Post date:** [2022年十一月16日 20:57 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/9 "2022-11-16T20:57:16Z")

</div>

我正在为同样的事情进行谷歌搜索。

– 一个关于 @david 的附加问题，虽然目前无法通过插件使用，但如果我们是自托管的话，我们能否在核心中添加一个插件，然后在一个插件中使用它？如果可以，该怎么做？（尝试在 `app/assets/javascripts/discourse` 的 `package.json` 中添加但没有成功加载，我想是因为我遗漏了什么简单的事情。）

---

<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:** [2022年十一月16日 21:31 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/10 "2022-11-16T21:31:28Z")

</div>

> [@StonkGodCapital](#):
>
> 我们是否可以理论上将一个插件添加到核心中，然后在自托管时将其用于另一个插件？

是的，但你真的不想分叉 Discourse 然后尝试合并所有提交。所有这样做过的人都非常后悔。

嗯。但如果只有那一个文件，你可以在克隆 Discourse 后，让你的 `app.yml` 将该文件从某处复制到 `/var/www/discourse`。我想我以前这样做过，以更改站点设置中的限制。

---

<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:** [2022年十一月16日 22:01 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/11 "2022-11-16T22:01:52Z")

</div>

正如 @pfaffman 所提到的，你_或许_可以通过修改 `app.yml` 来实现。你必须确保在 `yarn install` 和 `assets:precompile` 步骤之前完成修改。

但这完全不受支持，并且可能会导致意外问题。我不推荐这样做。

顺便问一下，你希望使用哪个插件？

---

<div class="post-metadata">

**Author:** ![StonkGodCapital](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/stonkgodcapital/32/242643_2.png) [@StonkGodCapital](https://meta.discourse.org/u/StonkGodCapital)\
**Post date:** [2022年十一月22日 17:36 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/12 "2022-11-22T17:36:02Z")

</div>

我还没有深入研究，但我发现大多数流行的插件都具有 Discourse 本身已有的功能。插件的吸引力在于，它们的文档通常更好一些，而且当你遇到困难时，可用的资源也相当完善。例如，关于 ember-concurrency 有_大量_的文档和已“解决”的问题，所以如果你是一名新开发者，拥有该插件通常意味着你可以更容易地开始工作。

但正如我所说，这更多的是一种好奇，而不是一种需求。

---

<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:** [2022年十一月22日 22:51 UTC](https://meta.discourse.org/t/can-we-add-ember-add-ons-to-a-discourse-plugin-like-ember-power-select/184507/13 "2022-11-22T22:51:25Z")

</div>

> [@StonkGodCapital](#):
>
> 还没有真正深入研究，不过我发现大多数流行的插件的功能在 Discourse 本身中已经存在了

所以你这是在自找麻烦。我建议在发现现有资源不能满足你的需求之前，不要考虑任何插件。

> [@StonkGodCapital](#):
>
> 例如，有_大量_的文档和“已解决”的问题是关于 ember-concurrency 的，所以如果你是一名新开发者，拥有该插件的访问权限通常意味着你可以更容易地开始工作。

但是你不知道它是否会与 Discourse 今天或将来解决该问题的方式兼容。如果你想为 Discourse 开发，那么查看 Discourse 中事物工作方式的示例将是最佳选择。

不要成为那种在灯下找钥匙而不是在掉落钥匙的汽车下面找钥匙的人，因为你在灯下看得更清楚。
