ember-cli和Ember Addon依赖链

时间:2017-08-07 16:11:44

标签: ember.js ember-cli ember-addon

我的问题是,当这个插件在另一个插件的依赖项中使用时,我无法获取插件中的contentFor方法(令我感到困惑)。

我的组织有一个内部的ember插件,我们用它来为我们的ember应用程序分发常见的样式,图像和组件。我将该插件称为org-components。我们决定采用材料设计,因此我们选择使用ember-paper和现有的插件。

为了减少人们在摄取应用程序中需要引用的依赖项数量,我们希望将ember-paper作为org-components的依赖项(而不是devDependency)。

因此,我们的依赖链如此:

ember-paper -> org-components -> ember-engine

ember-papercontentFor中定义了一个~/index.js方法,它会为头部中的材质图标和字体注入几个样式表,并将paper-wormhole div注入body-footer用于选择菜单下拉菜单和Toast消息。由于我不知道的原因,contentFor方法在ember-paper被包含为依赖项时不会执行,如上所示。

当我将两个组件都包含为单独的依赖项时,将执行contentFor方法,并且按预期工作: ember-paper -> ember-engine org-components -> ember-engine

所以我希望了解为什么当它被用作我们现有插件的依赖项时,我无法利用ember-paper插件。是什么阻止了contentFor build步骤的执行?在尝试解决这个问题时,我应该记住他们的最佳做法吗?

1 个答案:

答案 0 :(得分:0)

我最终能够找到解决这个问题的方法,这要归功于Ember团队的罗伯特杰克逊。

在Ember Slack社区请求帮助之后,Robert让我意识到ember-engine中现有的contentFor功能还没有扩展到处理这个用例。他承认这是一个疏忽,他们很可能会在将来添加功能,但目前他为我提供了一个解决方法,可以添加到/lib/engine-addon.js

options.contentFor = function(type, config) {
  let deprecatedHooks = ['app-prefix', 'app-suffix', 'vendor-prefix', 'vendor-suffix'];
  if (deprecatedHooks.indexOf(type) > -1) {
    // ember-engines does not support the deprecated contentFor hooks
    return '';
  }

  let content = [];
  if (type === 'head') {
    let engineConfig = this.engineConfig(config.environment, {});
    let escapedConfig = escape(JSON.stringify(engineConfig));

    content = content.push(
        `<meta name="${options.name}/config/environment" content="${escapedConfig}" />`
    );
  }

  content = this.addons.reduce((content, addon) => {
    let addonContent = addon.contentFor ? addon.contentFor(type, config, content) : null;
    if (addonContent) {
      return content.concat(addonContent);
    }

    return content;
  }, content);

  return content.join('\n');
};

也可以Gist

的形式提供

我没有跟上ember-engine的开发路线图,或者是否已将其添加到我们当前使用的更高版本中。如前所述,Ember Slack中的人员非常乐于助人,如果您有这些问题,他们会指出正确的方向。