ember-cli и метод contentFor в цепочке зависимостей Ember Addon

Моя проблема в том, что я не могу запустить метод contentFor в аддоне, когда этот аддон используется в зависимости от другого аддона (я знаю, это сбивает с толку).

В моей организации есть собственный аддон ember, который мы используем для распространения общих стилей, изображений и компонентов для наших ember-приложений. Я буду называть этот аддон org-components. Мы решили использовать материальный дизайн, поэтому мы решили использовать ember-paper вместе с с нашим существующим дополнением.

Чтобы уменьшить количество зависимостей, на которые люди должны будут ссылаться в принимающих приложениях, мы бы предпочли включить ember-paper в качестве зависимости org-components (а не devDependency).

Таким образом, наша цепочка зависимостей выглядит так:

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

ember-paper имеет метод contentFor, определенный в ~/index.js, который будет внедрять пару таблиц стилей для значков и шрифтов Material в заголовок и paper-wormhole div в body-footer для использования в раскрывающихся меню выбора и всплывающих сообщениях. По неизвестным мне причинам метод contentFor не выполняется, когда ember-paper включен в качестве зависимости, как показано выше.

Когда я включаю оба компонента как отдельные зависимости, метод contentFor выполняется, и все работает так, как ожидалось: ember-paper -> ember-engine org-components -> ember-engine

Поэтому я пытаюсь понять, почему я не могу использовать аддон ember-paper, когда он используется как зависимость от нашего существующего аддона. Что мешает выполнению шага сборки contentFor? Является ли их передовой практикой, о которой я должен помнить, пытаясь решить эту проблему?


person robabby    schedule 07.08.2017    source источник
comment
как ember-paper включается в ваш аддон org-components в случае, если он не работает?   -  person Dhaulagiri    schedule 28.08.2017


Ответы (1)


В конце концов я смог найти решение этой проблемы благодаря всегда готовому помочь Роберту Джексону из команды Ember.

После обращения за помощью к сообществу Ember Slack Роберт сообщил мне, что существующая функциональность contentFor в ember-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-движков или за тем, было ли это добавлено в более позднюю версию, чем та, которую мы используем в настоящее время. Как уже отмечалось, люди из Ember Slack очень полезны и укажут вам правильное направление, если у вас возникнут эти вопросы.

person robabby    schedule 03.11.2017