Ember.js — это мощный фреймворк для создания масштабируемых и современных веб-приложений. Одной из его уникальных особенностей является способность расширять функциональность с помощью аддонов. Аддоны Ember позволяют добавлять новые возможности и модули в приложение, улучшая его гибкость и расширяемость. Создание собственных аддонов предоставляет разработчикам мощный инструмент для упрощения задач и решения специфических проблем, возникающих в процессе работы над проектами.
Аддоны в Ember.js могут быть использованы для множества целей: добавление новых компонентов, помощников, маршрутов, сервисов, middleware и других полезных инструментов. Создание собственного аддона позволяет централизовать повторно используемый функционал, что упрощает его поддержку и облегчает масштабирование проекта.
Аддоны могут быть как общедоступными, так и специфичными для определённого проекта. Важной частью экосистемы Ember является то, что для публикации аддона достаточно следовать ряду стандартов, установленных сообществом. Это позволяет разработчикам делиться своими решениями с другими и пользоваться готовыми инструментами.
Структура аддона Ember.js следуют стандартному шаблону, который обеспечит совместимость с системой сборки и зависимостями фреймворка. Она включает несколько ключевых директорий и файлов:
addon/ — основная директория, где
располагаются все исходные коды аддона.addon/components/ — компоненты,
которые будут использоваться в приложении.addon/services/ — сервисы, которые
могут быть инжектированы в другие части приложения.app/ — код, который будет доступен в
самом приложении.tests/ — тесты для проверки
функциональности аддона.package.json — конфигурационный файл,
который содержит метаинформацию о проекте и его зависимости.Пример структуры:
my-addon/
├── addon/
│ ├── components/
│ │ └── my-component.js
│ ├── services/
│ │ └── my-service.js
│ └── index.js
├── app/
│ ├── components/
│ │ └── my-component.js
│ └── services/
│ └── my-service.js
├── tests/
│ └── unit/
│ └── services/
│ └── my-service-test.js
├── package.json
└── README.md
Для создания нового аддона можно использовать CLI-инструмент
ember-cli. Он предоставляет простой способ инициализировать
структуру аддона с предустановленными шаблонами.
ember addon my-addon
Эта команда создаст основу для нового аддона с минимальными файлами и настройками. В процессе разработки можно добавлять компоненты, сервисы, хелперы и другие элементы.
Один из основных способов расширения функциональности Ember — это создание кастомных компонентов. Эти компоненты могут быть использованы в любом приложении, которое подключит ваш аддон. Структура компонента стандартна:
// addon/components/my-component.js
import Component from '@glimmer/component';
export default class MyComponent extends Component {
get message() {
return 'Привет из компонента!';
}
}
В приложении компонент будет доступен через путь
{{my-component}}. Этот компонент можно будет использовать
как обычный Ember-компонент.
// app/templates/application.hbs
<MyComponent />
Сервисы в Ember позволяют создавать долгоживущие объекты, которые могут быть инжектированы в другие части приложения. Это идеально подходит для работы с состоянием приложения или взаимодействием с внешними API.
Пример сервиса, предоставляющего методы для работы с API:
// addon/services/api-service.js
import Service from '@ember/service';
import { tracked } from '@glimmer/tracking';
export default class ApiService extends Service {
@tracked data = null;
async fetchData() {
const response = await fetch('/api/data');
this.data = await response.json();
}
}
Для использования этого сервиса в компоненте или контроллере необходимо просто инжектировать его:
// app/components/my-component.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class MyComponent extends Component {
@service apiService;
get data() {
return this.apiService.data;
}
}
Аддоны могут зависеть от других библиотек или аддонов, что помогает
добавлять функциональность без необходимости reinventing the wheel. Все
зависимости управляются через файл package.json.
Пример добавления зависимости:
{
"dependencies": {
"ember-fetch": "^8.0.0"
}
}
После добавления зависимости, необходимо выполнить команду
npm install или yarn для загрузки и установки
нужных пакетов.
Правильное тестирование — важная часть разработки аддонов. Ember предоставляет встроенные инструменты для тестирования компонентов, сервисов и других элементов аддонов с использованием таких библиотек, как QUnit и ember-cli-mocha.
Пример теста для сервиса:
// tests/unit/services/api-service-test.js
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Service | api-service', function(hooks) {
setupTest(hooks);
test('fetchData работает правильно', async function(assert) {
let service = this.owner.lookup('service:api-service');
await service.fetchData();
assert.ok(service.data, 'Данные загружены');
});
});
Важным моментом является использование setupTest для
подготовки среды тестирования, что позволяет изолировать и корректно
протестировать функциональность сервиса или компонента.
После завершения разработки аддона можно публиковать его для использования другими разработчиками. Для этого необходимо использовать репозиторий на GitHub и следовать стандартам Ember для публикации аддонов. Также важно убедиться, что в аддоне есть документация, описывающая, как его использовать.
Чтобы опубликовать аддон на NPM, достаточно выполнить команду:
npm publish
Перед этим следует убедиться, что файл package.json
правильно настроен и все зависимости корректны.
Создание аддонов — это отличный способ повысить продуктивность разработки и создать повторно используемые, стандартизированные решения, которые помогут решать общие задачи, возникающие в процессе работы над Ember-приложениями.