我们可以在 discourse 插件中添加 ember 插件吗?(例如 ember power select)

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

举个例子:Ember 的 Power Select

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

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

$ ember install ember-power-select

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

hbs 模板:

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

与之配套的 JavaScript 文件:

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

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

3 个赞

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

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

1 个赞

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

谢谢大家。

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


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

关于使用 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 团队构建的功能那样强大和稳健。

3 个赞

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

6 个赞

顶一下。
如果我们在 Discourse 中添加插件,例如执行:
cd app/assets/javascripts/ && yarn add LIB_NAME
那么这个插件将如何在插件中可用?

我想知道现在是否可能做到这一点?(如果可能,如何做到?)

2 个赞

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

2 个赞

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

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

1 个赞

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

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

2 个赞

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

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

顺便问一下,你希望使用哪个插件?

2 个赞

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

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

1 个赞

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

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

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