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

86

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

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

Должен ли я включать typescript файлы при публикации модуля NPM, или я должен публиковать только файлы javascript и предоставлять сгенерированные файлы .d.ts определенному типу?

  • 0
    Полезные заметки: я написал проект, copee , вместе с сообщением в блоге, чтобы помочь вам настроить проект TS для выдачи определений типов вместе с целями CJS и ESM перед публикацией в npm. Это максимально увеличит использование с node.js и браузерами в будущем.
Теги:
npm

7 ответов

78
Лучший ответ

Вот пример модуля 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

  • 0
    Якорная ссылка Atom-TypeScript должна быть обновлена (якорь больше не действителен).
  • 0
    @basarat, в ts-npm-module вы используете "версию": "1.5.0-альфа". Я предполагаю, что это версия Typescript, которую вы используете. Имеет ли значение это оставить? (это не делается автоматически плагином Atom). Если используется версия, потребуют ли другие пользователи точной версии для переноса (или только более новой)? (или, может быть, это версия tsconfig.json?)
Показать ещё 4 комментария
57

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

  • Создайте свой проект как обычно (с тестами и всем остальным)
  • Добавьте declaration: true в tsconfig.json чтобы сгенерировать типизацию.
  • Экспортируйте API через 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 с помощью npm publish. Использование спецификаций semver для обновлений (исправление/исправление ошибки исправления npm version patch, неразрывные добавления npm version minor, критические изменения api npm version major)

Так как у меня появилось время, чтобы просмотреть все устаревшие ресурсы по этой теме в Интернете (например, на этой странице...), я решил обернуть его в библиотеку "как написать текст" с современный рабочий минимальный пример.

  • 0
    Должен ли я проверить JS в систему контроля версий? Или npm сохраняет свою версию кода?
  • 0
    @ Olian04 Вы указываете создать файл .npmignore чтобы сообщить npm, какие файлы игнорировать при публикации (файлы .ts ), и .gitignore чтобы указать git, какие файлы игнорировать ( dist/ )
Показать ещё 1 комментарий
55

Это более свежий ответ, используя 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

  • 0
    Не могли бы вы загрузить пример на GitHub? Это очень поможет! :)
  • 3
    Пример был загружен на Github: github.com/vchatterji/tsc-seed
Показать ещё 1 комментарий
5

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

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

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

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

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

  • 1
    Это очень полезный пример, спасибо, что поделились! В настоящее время я также пытаюсь освоить создание пакетов таким способом.
  • 1
    По состоянию на июль 2017 года, это лучшая структура проекта, с которой я сталкивался. Благодаря Тиму и Варуну Чаттерджи
5

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

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

  • 1
    Компилятор TypeScript пока не подходит для этого. Посмотрите эту проблему github.com/Microsoft/TypeScript/issues/14479
  • 1
    в настоящее время включение *.d.ts является рекомендуемым способом сделать это, хотя я согласен с вами, если вы *.ts файлы *.ts , typescriptlang.org/docs/handbook/declaration-files/…
4

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

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

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню