Я работаю над своим первым модулем NPM. Я кратко работал с typescript раньше, и большая проблема заключалась в том, что для многих модулей не было файлов определения. Поэтому я подумал, что было бы неплохо написать мой модуль в typescript.
Однако я не могу найти никакой информации о том, как это сделать. Я нашел этот связанный вопрос "Могу ли я написать пакет npm в coffeescript?", где люди предлагают только публикацию файлов javascript. Но в отличие от файлов coffeescript файлы typescript могут быть полезны, если они используются в приложении typescript.
Должен ли я включать typescript файлы при публикации модуля NPM, или я должен публиковать только файлы javascript и предоставлять сгенерированные файлы .d.ts определенному типу?
Вот пример модуля Node, написанного в TypeScript: https://github.com/basarat/ts-npm-module
Вот пример проекта TypeScript, который использует этот примерный модуль https://github.com/basarat/ts-npm-module-consume
В основном вам необходимо:
commonjs
и declaration:true
.d.ts
И затем
.d.ts
.Atom- TypeScript просто обеспечивает хороший рабочий процесс вокруг этого: https://github.com/TypeStrong/atom-typescript#packagejson-support
Рекомендуемый способ в 2018 году с Typescript 2.x:
declaration: true
в tsconfig.json
чтобы сгенерировать типизацию.index.ts
package.json
укажите ваши сгенерированные наборы. Например, если ваш outDir
является dist
, добавьте "types": "dist/index.d.ts"
в ваш пакет json.package.json
укажите свой основной входной файл. Например, если ваш outDir
- это dist
а основной входной файл - index.js
, добавьте "main": "dist/index.js"
в ваш package.json..npmignore
чтобы игнорировать ненужные файлы (например, источник).npm publish
. Использование спецификаций semver для обновлений (исправление/исправление ошибки исправления npm version patch
, неразрывные добавления npm version minor
, критические изменения api npm version major
)Так как у меня появилось время, чтобы просмотреть все устаревшие ресурсы по этой теме в Интернете (например, на этой странице...), я решил обернуть его в библиотеку "как написать текст" с современный рабочий минимальный пример.
.npmignore
чтобы сообщить npm, какие файлы игнорировать при публикации (файлы .ts
), и .gitignore
чтобы указать git, какие файлы игнорировать ( dist/
)
Это более свежий ответ, используя 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
в моем проекте, где я только что установил npm
import Project = require("project");
Ввод Project.
дает мне опции Intellisense, которые были точкой всего этого упражнения.
Надеюсь, это поможет кому-то другому использовать свои проекты TypeScript npm как внутренние библиотеки в своих больших проектах.
PS: Я считаю, что такой подход скомпилирования проектов к модулям npm, которые можно использовать в других проектах, напоминает .dll
в мире .NET
. Я вполне мог представить проекты, которые организуются в решении VS VS, где каждый проект создает пакет npm, который затем может использоваться в другом проекте в решении как зависимость.
Поскольку мне потребовалось немало времени, чтобы понять это, я разместил его на случай, если кто-то застрял здесь.
Я также разместил его для закрытой ошибки: https://github.com/npm/npm/issues/11546
Этот пример загружен в Github: vchatterji/tsc-seed
В основном я следую предложению Варун Чаттерджи
Но я хотел бы показать полный пример модульного тестирования и покрытия кода и опубликовать его в npm
и импортировать их с помощью javascript
или typescript
Этот модуль написан с использованием typescript 2.2
, и важно настроить привязку prepublish
для компиляции кода с помощью tsc
, прежде чем публиковать его до npm
Вы должны опубликовать исходные источники typescript вместо определения типа. В package.json
свойство 'types' указывает на файл *.ts.
*.d.ts
хороши для аннотирования существующих JS-библиотек, но, как потребитель, я бы лучше прочитал код typescript, чем переключение между определениями типов и сгенерированным JS-кодом с пониженным уровнем.
*.d.ts
является рекомендуемым способом сделать это, хотя я согласен с вами, если вы *.ts
файлы *.ts
, typescriptlang.org/docs/handbook/declaration-files/…
Вы можете использовать autodts, чтобы обрабатывать распространение и использование файлов .d.ts
от npm и без поддержки от Atom IDE.
autodts generate
свяжет все ваши собственные файлы .d.ts
для публикации на npm, а autodts link
обрабатывает ссылки на другие установленные пакеты, которые могут не всегда находиться под node_modules
в более крупном проекте, разбитом на несколько подпакетов.
Обе команды считывают свои настройки из package.json
и tsconfig.json
в стиле "условная конфигурация".
Там еще один ответ о stackoverflow и сообщение в блоге с более подробной информацией.
В Lossless мы создали один инструмент TypeScript dev для пакетов npm: https://gitzone.gitlab.io/npmts/