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 для получения дополнительной информации.