Отдача сообществу
Отдача сообществу — идея, которая мне очень нравится. Я считаю очень важным делиться своими знаниями и результатами, я сам многому научился у других разработчиков.
В этой статье я делюсь своим процессом публикации библиотек Angular и демонстрационным приложением, которое использует эти библиотеки. Я настоятельно рекомендую вам выработать привычку делиться своей работой (например, кодом, результатами и идеями). Это может быть повторно используемый компонент, такой как компонент пользовательского интерфейса, или инструмент, подобный тому, который я использую в качестве примера для этой статьи, или просто какой-нибудь изящный маленький трюк. Вот статья, в которой более подробно рассказывается о преимуществах публикации пакетов npm:
Недавно я создал несколько декораторов для отладки @ngrx/component-stores и опубликовал их в виде библиотеки Angular на npmjs.org, чтобы другим разработчикам было проще их использовать.
В этом пошаговом руководстве я объясню, как я создал библиотеку, а также демо-приложение для нее, и как я опубликовал библиотеку на npmjs.org и демо-приложение на StackBlitz.
Вы можете найти полный исходный код библиотеки и демо-приложение на моем Github. Вы также можете попробовать демо-приложение на StackBlitz.
📋Оглавление
Мое руководство охватывает следующие темы:
- Как создать многопроектное рабочее пространство
- Как сгенерировать библиотеку и скелеты демонстрационного приложения в рабочей области
- Детали реализации библиотеки
- Зависимости и одноранговые зависимости
- Внедрение демо-приложения
- Как собрать библиотеку и запустить демо-приложение
- Как опубликовать библиотеку на npmjs.org
- Как запустить демо-приложение на StackBlitz
Создание многопроектного рабочего пространства
В качестве первого шага мы создаем многопроектное рабочее пространство для нашей библиотеки и демонстрационного приложения. Создайте рабочее пространство:
ng new ngx-ngrx-component-store-debug-tools --no-create-application
Создайте библиотеку ngx-ngrx-component-store-debug-tools
в рабочей области:
cd ngx-ngrx-component-store-debug-tools ng generate library ngx-ngrx-component-store-debug-tools
Затем сгенерируйте приложение demo
в рабочей области:
ng generate application demo
Генератор задает следующие вопросы:
- Хотите добавить маршрутизацию Angular? Н
- Какой формат таблицы стилей вы хотели бы использовать? СКСС
По завершении команды ng generate
мы находим в нашей рабочей области два новых каталога проекта: каталогprojects/demo
для приложения и каталог projects/ngx-ngrx-component-store-debug-tools
для библиотеки. Генератор также устанавливает несколько дополнительных пакетов.
Реализация нашей библиотеки
У нас есть module
, component
и service
в каталоге src/lib
библиотеки. Эти файлы полезны для созданиякомпонента или службы многократного использования. Поскольку наша цель — поделиться несколькими декораторами и служебными функциями, удалите эти файлы и создайте файл src/lib/ngx-ngrx-component-store-debug-tools.ts
:
Публичный API библиотеки экспортируется через файл src/public-api.ts
, так что давайте его обновим. Мы удаляем существующие экспорты и экспортируем только файл, созданный на предыдущем шаге:
Мы также расширяем файл projects/ngx-ngrx-component-store-debug-tools/package.json
, добавляя атрибуты description
, repository
, keywords
, author
, license
и bugs
:
Зависимости и одноранговые зависимости
Наша библиотека имеет следующие зависимости:
tslib
— добавляется генератором, так как это необходимо для работы библиотеки Angularrecursive-diff
иrxjs
Как правило, мы должны добавлять наши зависимости как одноранговые зависимости. Однако два менеджера пакетов, npm
и yarn
, по-разному обрабатывают одноранговые зависимости: npm
устанавливает их по умолчанию, а yarn
— нет.
Поскольку крайне маловероятно, что кто-то использует recursive-diff
в приложении Angular, я добавил его в качестве зависимости к package.json
, поэтому и npm
, и yarn
установят этот пакет автоматически.
Если мы хотим добавить пакет recursive-diff
в качестве одноранговой зависимости, приложения, использующие нашу библиотеку, должны включить пакет recursive-diff
в свой файл packages.json
, чтобы наша библиотека работала.
Мы добавляем пакет rxjs
в качестве одноранговой зависимости, поскольку каждое приложение Angular использует rxjs
, поэтому наша библиотека может использовать пакет rxjs
, установленный приложением.
Я предлагаю вам прочитать следующие две статьи, чтобы глубже понять, как работают зависимости и одноранговые зависимости:
Внедрение демо-приложения
В каталоге /projects/demo/src/app/card
создаем простой компонент карточки с хранилищем компонентов, и используем декораторы из библиотеки. Мы можем просто импортировать нашу библиотеку, а затем использовать ее декораторы:
Файл /tsconfig.json
содержит следующие path
:
"paths": { "ngx-ngrx-component-store-debug-tools": [ "dist/ngx-ngrx-component-store-debug-tools" ] },
Таким образом, по умолчанию import { LogUpdater, LogEffect } from "ngx-ngrx-component-store-debug-tools"
импортирует встроенную версию библиотеки из каталога dist/ngx-ngrx-component-store-debug-tools
.
Я предлагаю изменить путь к файлу projects/ngx-ngrx-component-store-debug-tools/src/public-api.ts
, чтобы нам не пришлось собирать библиотеку перед запуском демо-приложения:
"paths": { "ngx-ngrx-component-store-debug-tools": [ "projects/ngx-ngrx-component-store-debug-tools/src/public-api.ts" ] },
Применяя этот параметр, если мы изменим исходный код библиотеки, демонстрационное приложение автоматически перекомпилируется.
Сборка библиотеки и запуск демо-приложения
Мы создаем нашу библиотеку с помощью команды ng build ngx-ngrx-component-store-debug-tools
, она создает библиотеку в каталоге dist/ngx-ngrx-component-store-debug-tools
.
Если путь ngx-ngrx-component-store-debug-tools
в файле tsconfig.json
указывает на собранную библиотеку, мы должны пересобирать библиотеку после каждого изменения исходного кода. Однако мы можем автоматизировать этот процесс, применив команду ng build ngx-ngrx-component-store-debug-tools --watch
, она автоматически перестраивает нашу библиотеку при изменении исходного кода.
Используйте команду ng serve demo
для запуска демонстрационного приложения.
Публикация библиотеки
Прежде чем опубликовать библиотеку, я создал учетную запись npmjs.org здесь. Я настроил двухфакторную аутентификацию и вошел в командную строку с помощью команды npm login
.
Затем я перешел в каталог dist/ngx-ngrx-component-store-debug-tools
и опубликовал библиотеку с помощью команды npm publish
.
Если я хочу обновить свою уже опубликованную библиотеку, я обновляю номер версии пакета в файле projects/ngx-ngrx-component-store-debug-tools/package.json
, затем собираю и публикую пакет.
Запуск демо-приложения на StackBlitz
Когда я попытался запустить свое многопроектное рабочее пространство, я столкнулся со следующими проблемами:
- StackBlitz плохо справляется с многопроектными рабочими пространствами Angular.
- демо содержит TailwindCSS, но компоненты внутри приложения были показаны без каких-либо стилейна StackBlitz
Чтобы обойти первую проблему (многопроектные рабочие пространства), я создал однопроектное рабочее пространство, применив команду ng new ngx-ngrx-component-store-debug-tools-demo
, и скопировал в него демонстрационное приложение из каталога project/demo/src
. Вы можете найти его полный исходный код здесь.
Файл проекта package.json
ссылается на библиотеку как на простую зависимость:
{ "name": "ngx-ngrx-component-store-debug-tools-demo", ... "dependencies": { ... "ngx-ngrx-component-store-debug-tools": "^0.0.6", ... }, ... }
Что касается второй проблемы, то для того, чтобы TailwindCSS работал на StackBlitz, я добавил в файл index.html
следующий тег <script>
:
<!doctype html> <html lang="en"> <head> ... <!-- We need this on StackBlitz --> <script src="https://cdn.tailwindcss.com"></script> ... </head> <body> ... </body> </html>
🎉Ура!
Итак, теперь у нас есть полностью работающая, опубликованная библиотека Angular, неплохо, не правда ли? Я призываю вас повторить мой процесс, показанный выше! Дайте мне знать, если вы столкнулись с какими-либо проблемами или знаете какие-либо хитрости, было бы здорово дополнить эту статью дополнительными советами и советами!
👨💻Об авторе
Меня зовут Gergely Szerovay, я работаю руководителем отдела фронтенд-разработки. Преподавание (и изучение) Angular — одна из моих страстей. Я ежедневно просматриваю контент, связанный с Angular — статьи, подкасты, выступления на конференциях и так далее.
Если вам интересен мой ежемесячный сборник отличных ресурсов по Angular, подпишитесь на мою публикацию под названием Angular Addicts. Предыдущие выпуски можно прочитать здесь.
И если вы недавно видели хорошую статью, твит или другой ресурс, связанный с Angular, сообщите мне об этом здесь, в комментариях, или отправьте мне сообщение в Twitter! Возможно, я расскажу об этом в следующем выпуске Angular Addicts!
Кроме того, пожалуйста, дайте мне знать, какие другие темы Angular вас интересуют, у меня есть много черновиков статей здесь, на Medium, ожидающих публикации.