Написание модулей NPM в Typescript


Я работаю над своим первым модулем NPM. Я кратко работал с typescript раньше, и большая проблема заключалась в том, что для многих модулей не было доступных файлов определения. Поэтому я подумал, что было бы неплохо написать мой модуль в typescript.

однако, я не могу найти никакой информации о лучшем способе сделать это. Я нашел этот вопрос "могу ли я написать пакет npm в coffeescript? " где люди предлагают только публиковать файлы javascript. Но в отличие от файлы coffeescript, файлы typescript могут быть действительно полезны, если они используются в приложении typescript.

должен ли я включать файлы Typescript при публикации модуля NPM, или я должен публиковать только файлы javascript и предоставлять сгенерированные .D. TS файлы для DefinitelyTyped?

7 84

7 ответов:

вот пример модуля узла, написанный в TypeScript:https://github.com/basarat/ts-npm-module

вот пример проекта TypeScript, который использует этот пример модуля https://github.com/basarat/ts-npm-module-consume

в основном вам нужно:

  • компилировать с commonjs и declaration:true
  • создать .d.ts file

а то

  • у вас есть ide читать сгенерированный .d.ts.

Atom-TypeScript просто обеспечивает хороший рабочий процесс вокруг этого:https://github.com/TypeStrong/atom-typescript#packagejson-support

это более поздний ответ с использованием TypeScript 1.8.10:

моя структура проекта:

|
|--- src
|--- test
|--- dist     <= My gulp file compiles and places the js, sourcemaps and .d.ts files here
|      |--- src
|      |--- test
|--- typings
.gitignore
.npmignore
gulpfile.js
package.json
README.md
tsconfig.json
tslint.json
typings.json

я добавил следующее в .npmignore чтобы избежать включения посторонних файлов и сохранить минимум, чтобы пакет был импортирован и работал:

node_modules/
*.log
*.tgz

src/
test/
gulpfile.js
tsconfig.json
tslint.json
typings.json
typings
dist/test

мой .gitignore есть:

typings

# ignore .js.map files
*.js.map
*.js
dist

мой package.json есть:

"main": "dist/src/index.js",
"typings":  "dist/src/index.d.ts",

теперь я бегу: npm pack

результирующий файл (при распаковке) имеет следующие структура:

|
|--- dist
|       |--- src
|              |
|              index.js
|              index.js.map
|              index.d.ts
|
package.json
README.md

теперь я иду в проект, где я хочу использовать это в качестве библиотеки и типа: npm install ./project-1.0.0.tgz

он успешно установлен.

теперь я создаю файл index.ts в моем проекте, где я только что установил НПМ import Project = require("project");

введя Project. дает мне варианты Intellisense, которые были целью всего этого упражнения.

надеюсь, что это поможет кому-то еще в использовании их проектов npm TypeScript в качестве внутренних библиотек в их большие проекты.

PS: я считаю, что такой подход компиляции проектов в модули npm, которые могут быть использованы в других проектах, напоминает .dll на .NET мире. Я вполне мог представить себе проекты, организованные в решении в VS-коде, где каждый проект создает пакет npm, который затем может использоваться в другом проекте в решении в качестве зависимости.

так как мне потребовалось довольно много времени, чтобы понять это, я * в случае если кто-то застрял здесь.

я также опубликовал его для закрытой ошибки на: https://github.com/npm/npm/issues/11546


этот пример был загружен в Github:vchatterji/tsc-seed

рекомендуемый способ в 2018 году с Typescript 2.x:

  • создать свой проект, как обычно (с тестами и все)
  • добавить declaration: true до tsconfig.json для создания typings.
  • экспорт API через index.ts
  • на package.json, укажите на сгенерированные типы. Например, если ваш outDir и dist, затем добавить "types": "dist/index.d.ts" к вашему пакету json.
  • создать .npmignore в игнор ненужные файлы (например, источник).
  • опубликовать в npm с npm publish. Используйте спецификации semver для обновлений (исправление / исправление ошибок npm version patch, не нарушая дополнения npm version minor, нарушение изменений api npm version major)

так как это заставило меня некоторое время просеять все устаревшие ресурсы по этой теме в интернете (например, на этой странице...) Я решил завернуть его в how-to-write-a-typescript-library С последней работой минимальный пример.

Я в основном следую предложению Варун Чаттерджи

но я хотел бы показать полный пример с модульным тестированием и охватом кода и опубликовать его в npm и импортировать их с помощью javascript или typescript

этот модуль написан с использованием typescript 2.2 и важно настроить prepublish крючок для компиляции кода с помощью tsc прежде чем опубликовать его npm

https://github.com/sweetim/haversine-position

https://www.npmjs.com/package/haversine-position

можно использовать autodts для обработки распределения и использования .d.ts файлы из npm также без поддержки из IDE Atom.

autodts generate будет связывать все ваши собственные .d.ts файлы вместе для публикации на npm, и autodts link обрабатывает ссылки на другие установленные пакеты, которые не всегда могут быть непосредственно под node_modules в более крупном проекте разделить на несколько подпакетов.

обе команды считывают свои настройки из package.json и tsconfig.json в "Конвенции над конфигурацией " стиль.

здесь еще один ответ на stackoverflow и A блоге С более подробной информацией.

вместо определения типа следует опубликовать исходные источники машинописного текста. В package.json пусть свойство 'types' указывает на *.файл ТС.

*.d.ts хорошо аннотировать существующие JS-библиотеки, но как потребитель я бы предпочел прочитать код typescript, чем переключаться между определениями типов и нисходящим, сгенерированным JS-кодом.

в Lossless мы создали инструмент one stop TypeScript dev для пакетов npm:https://gitzone.gitlab.io/npmts/