Публикация компонента TypeScript React в NPM

Вероятно, существует множество статей о том, как опубликовать библиотеку в NPM, поэтому, вероятно, нет смысла писать еще одну статью об этом. Однако, когда дело доходит до TypeScript, количество руководств по этому аспекту намного меньше. Я недавно попробовал это сделать, и, немного поработав, я здесь, чтобы поделиться тем, как я это сделал. Заявление об ограничении ответственности: я сам новичок в публикации в NPM, так что это чисто мой самоуверенный способ, который никоим образом не является единственным и абсолютно правильным.

Настройка

Мы стремимся написать простой компонент React на TypeScript и опубликовать его. Просто, понятно, без излишеств. В этом руководстве предполагается, что вы знакомы с React, TypeScript и уже можете устанавливать зависимости, используя npm или yarn. В противном случае вы можете прочитать о React и TypeScript соответственно.

Перво-наперво создайте папку проекта в вашем рабочем пространстве. В этом уроке мы создадим простой компонент hello world. После этого мы запускаем npm init в папке, чтобы создать package.json файл шаблона.

$ cd <workspace>
$ mkdir hello-world
$ cd hello-world
$ npm init

На npm init вам будет предложено ввести несколько значений для создания файла package.json. Когда будет предложено поле main, введите lib/index.js. Не стесняйтесь оставить остальные по умолчанию, нажав Enter.

Далее мы устанавливаем необходимый минимальный набор зависимостей.

$ npm i -D typescript react react-dom @types/react @types/react-dom

Затем мы приступаем к добавлению tsconfig.json, чтобы TypeScript знал, как скомпилировать наш проект.

Идея состоит в том, чтобы все исходные файлы в папке src были скомпилированы в javascript es5 в папке lib. Для свойства declaration установлено значение false, поскольку мы будем писать собственные определения в index.d.ts, чтобы разработчикам TypeScript, использующим наш компонент, не приходилось тратить дополнительное время на написание объявлений внешних модулей для нашей библиотеки.

И это почти все, что нам нужно для запуска простого проекта!

Написание компонента

Теперь мы создадим простой компонент приветствия TypeScript React.

С указанными выше файлами структура проекта должна теперь выглядеть примерно так.

node_modules
src
|- HelloWorld.tsx
|- index.ts
index.d.ts
package.json
tsconfig.json

Если вы введете следующую команду,

$ tsc

TypeScript скомпилирует исходные файлы из папки src в папку lib.

Издательский

Теперь мы более-менее готовы к публикации! Давайте сначала обновим команды сценария в package.json.

...
"scripts": {
  "build": "rm -rf ./lib && tsc",
  "prepare": "yarn build",
},
...

Для публикации запустите:

$ npm publish

Когда вызывается npm publish, npm автоматически запускает npm prepare (не рекомендуется npm prepublish) перед фактической публикацией. Поэтому перед публикацией выполните в npm prepare все необходимые команды (например, сборку, тесты и lint).

Вуаля! Если все пойдет хорошо, вы должны опубликовать пакет. Обратите внимание, что если имя проекта уже занято в NPM, вы не сможете опубликовать проект под этим именем. Чтобы проверить, занято ли уже пространство имен, попробуйте перейти по следующему URL-адресу.

https://www.npmjs.com/package/<project name>

Если вы видите сообщение NPM 404 not found с инструкциями по публикации, это означает, что пространство имен готово к использованию!

Тесты и линтинг

Чтобы проект был надежным, важны тесты и линтинг.

Тесты

Я лично использую Jest для тестирования простых компонентов, так как он работает "из коробки" и прост в настройке.

Установите следующие зависимости.

$ npm i -D jest enzyme enzyme-adapter-react-16 @types/jest @types/enzyme @types/enzyme-adapter-react-16

Примечание: не забудьте установить правильный адаптер фермента для вашей версии React!

Теперь вы можете приступить к написанию тестов для вашего компонента!

Линтинг

Я использую tslint для линтинга моего кода TypeScript. Необходимы следующие зависимости.

$ npm i -D tslint tslint-react

tslint-react содержит набор основных правил линта, готовый к использованию прямо из коробки. Затем вы можете дополнительно настроить его в файле конфигурации tslint.json. Пример файла выглядит следующим образом.

Наконец, обновите свой package.json, чтобы перед публикацией запускались тесты и lint!

...
"scripts": {
  "build": "rm -rf ./lib && tsc",
  "test": "jest",
  "lint": "tslint -c tslint.json --project tsconfig.json",
  "prepare": "yarn test && yarn lint && yarn build",
},
...

Заключение

Написать компонент TypeScript React для публикации NPM быстро и легко! С минимальными зависимостями мы можем запустить его, используя функции типизированного языка, которые предоставляет TypeScript. Ниже приведена некоторая информация для дальнейшего чтения, которая может помочь вам в вашем процессе.

npm-ссылка

Протестируйте свой пакет локально с npm link!



Обновление 19.10.2018

В tsconfig.json установка declaration в значение true избавляет от хлопот по написанию собственного определения.

Обновление 15.08.2019

Внесено изменение в генерацию package.json, чтобы поле main было заполнено lib/index.js вместо значения по умолчанию index.js.