2

我的问题是,当该插件用于另一个插件的依赖项时,我无法在插件中运行 contentFor 方法(我知道这很困惑)。

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

为了减少人们在摄取应用程序中需要引用的依赖项的数量,我们更愿意将(not a ) 包含ember-paper为依赖项。org-componentsdevDependency

因此我们的依赖链是这样的:

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

ember-paper定义了一个contentFor方法~/index.js,它将在头部和paper-wormholediv中注入一些用于 Material 图标和字体的样式表,body-footer以供选择菜单下拉菜单和 toast 消息使用。由于我不知道的原因,当作为依赖项包含contentFor时,该方法不会执行,ember-paper如上所示。

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

所以我想了解为什么ember-paper当它被用作我们现有插件的依赖项时我无法利用它。是什么阻止了 contentFor 构建步骤的执行?在尝试解决此问题时,我应该牢记他们的最佳实践吗?

4

1 回答 1

0

多亏了 Ember 团队总是乐于助人的 Robert Jackson,我最终找到了解决这个问题的方法。

在 Ember Slack 社区寻求帮助后,Robert 让我意识到contentForember-engines 中的现有功能尚未扩展以处理此用例。他承认这是一个疏忽,他们很可能会在未来添加该功能,但他暂时为我提供了一种解决方法来添加到/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-engines 的开发路线图,或者这是否已添加到比我们当前使用的更高版本中。如前所述,Ember Slack 中的人们非常乐于助人,如果您有这些问题,他们会为您指明正确的方向。

于 2017-11-03T15:54:11.843 回答