Ember-cli-build, исключая компоненты ember addon

Я использую "основной" тлеющий аддон в шаблоне, с

npm link core-addon

Этот аддон содержит общие компоненты, помощники, маршруты...

Есть ли способ исключить некоторые из этих компонентов в файле ember-cli-build?

Я уже попробовал следующее в ember-build-cli в моем шаблонном проекте, что, вероятно, неправильно:

const EmberApp = require('ember-cli/lib/broccoli/ember-app');
const environment = EmberApp.env();
module.exports = function (defaults) {
    let app = new EmberApp(defaults, {
        funnel: {
                enabled:true,
                exclude:['core-addon/pods/components/pages/**/*']
            },
    });
return app.toTree();
};

Ember версия: 3.5.0 Ember cli версия 3.5.0 версия узла 8.11.3

1 ответ

Решение

Аддоны обычно используют обратный подход: аддон управляет тем, что объединяется с потребляющим приложением, посредством конфигурации в потребляющем приложении.

На самом высоком уровне каждый аддон имеет точку входа, которая является index.js файл сидит в корневой директории аддона. Аддон предоставляет определенные параметры конфигурации, из которых он читает config/environment.js потребляющего приложения при установке.

Я думаю, что действительно хорошим примером для вас будет ember-bootstrap, Посмотрите на их параметры конфигурации и, более конкретно, blacklist вариант. Они позволяют потребляющему приложению устанавливать только подмножество компонентов начальной загрузки. Кроме того, проект поддерживает начальную загрузку 3 или начальную загрузку 4, но приложение-потребитель не получает и того, и другого! Работа сделана в index.js

Давайте посмотрим, как они заносят в черный список (то есть исключают) определенные компоненты, добавляемые в приложение-потребитель:

treeForApp(tree) {
  tree = this.filterComponents(tree);
  return this._super.treeForApp.call(this, tree);
},
filterComponents(tree) {
  let whitelist = this.generateWhitelist(this.bootstrapOptions.whitelist);
  let blacklist = this.bootstrapOptions.blacklist || [];

  // exit early if no opts defined
  if (whitelist.length === 0 && blacklist.length === 0) {
    return tree;
  }

  return new Funnel(tree, {
    exclude: [(name) => this.excludeComponent(name, whitelist, blacklist)]
  });
}

где this.excludeComponent в его основе лежит логическая функция возвращающего фильтра, которая возвращает true, если черный список содержит ее в случае черного списка (для исключения). treeForApp Функция возвращает дерево для всех файлов приложения, т.е. что будет объединено с аддоном app DIR в потребляющем приложении:

Потребляющие приложения ember-cli-build будет выглядеть примерно так:

//your-bootstrap-app/ember-cli-build.js

module.exports = function(defaults) {
  let app = new EmberApp(defaults, {
    'ember-bootstrap': {
      blacklist: ['bs-popover', 'bs-accordion']
    }
  });

  return app.toTree();
};

и результат будет не bs-popover и нет bs-accordion доступны в дереве приложений приложений-потребителей. Эти варианты получены в index.js файл вроде так:

let options =Object.assign({}, defaultOptions, app.options['ember-bootstrap']);
this.bootstrapOptions = options;

Посмотрите это общее руководство по созданию аддонов и более продвинутые API для получения дополнительной информации.

Другие вопросы по тегам