Аддоны обычно используют обратный подход: аддон управляет тем, что объединяется с потребляющим приложением, через конфигурацию в потребляющем приложении.
На самом высоком уровне каждый аддон имеет точку входа, которая является 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 для получения дополнительной информации.