2015-06-19 2 views
74

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

Однако я не могу найти никакой информации о том, как это сделать. Я нашел этот связанный вопрос «Can I write npm package in coffeescript?», где люди предлагают только публикацию файлов javascript. Но, в отличие от файлов coffeescript, файлы машинописных файлов могут быть полезны, если они используются в приложении для машинописного текста.

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

+0

Полезные заметки: Я написал проект, [копия] (https://github.com/styfle/copee), а также [сообщение в блоге] (https://medium.com/@styfle/es6-modules -today-with-typescript-22969cd360f0), чтобы провести вас через настройку TS-проекта, чтобы генерировать определения типов вместе с целями CJS и ESM перед публикацией в npm. Это позволит максимально использовать использование узлов и браузеров в будущем. – styfle

ответ

70

Вот модуль выборки Node написан в машинописном: https://github.com/basarat/ts-npm-module

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

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

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

А потом

  • Попросите язь поизучать .d.ts.

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

+0

Необходимо обновить привязку Atom-TypeScript (привязка уже не действительна). –

+0

@basarat, в ts-npm-module вы используете «версию»: «1.5.0-alpha». Я предполагаю, что это версия машинописного текста, с которой вы переписываете. Имеет ли значение оставить это? (это не делается автоматически плагином Atom). Если используется версия, потребуется ли другим пользователям использовать точную версию для пересылки (или только более новых)? (или, может быть, это версия tsconfig.json?) – justin

+0

Есть ли у вас какой-либо вариант использования модулей в зависимости от других библиотек? Чтобы избежать проблемы с дублированием определения, вам нужно настроить 'tsconfig.json', но это кажется слишком ручным, на мой взгляд. –

4

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

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

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

Существует another answer на stackoverflow и blog post с более подробной информацией.

53

Это более свежий ответ с использованием 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");

Typing Project. дает мне возможности Intellisense, который был точкой всего этого упражнения.

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

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

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

Я также разместил его на закрытый жук по адресу: https://github.com/npm/npm/issues/11546


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

+0

Вы могли бы загрузить пример на github? Это очень поможет!:) –

+3

Пример был загружен в Github: https://github.com/vchatterji/tsc-seed –

+0

Как его можно использовать в проектах без типов? – SuperUberDuper

3

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

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

+0

+1 Это должен быть принятый ответ. Зачем создавать файлы .d.ts, если вы можете напрямую указывать файлы .ts !? – Precastic

+1

Компилятор TypeScript, похоже, пока не подходит для этого. См. Эту проблему. Https://github.com/Microsoft/TypeScript/issues/14479 –

+1

в настоящее время, включая '* .d.ts', является рекомендуемым способом сделать это, хотя я согласен с вами в преимуществах, связанных с' * .ts' файлы, https: //www.typescriptlang.org/docs/handbook/declaration-files/publishing.html – Tim

5

я в основном следовать предложению по Varun Chatterji

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

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

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

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

+1

Это очень полезный пример, спасибо за обмен! В настоящее время я также пытаюсь получить возможность создавать пакеты таким образом. –

+1

С июля 2017 года это лучшая структура проекта, с которой я столкнулся. Спасибо Tim и Varun Chatterji – adgang

43

Рекомендуемый способ в 2017 году с машинопись 2.x:

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

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

+0

Должен ли я проверить js на исходный контроль? Или npm сохраняет свою собственную версию кода? – Olian04

+0

@ Olian04 Вы скажете создать файл '.npmignore', чтобы сообщить npm, какие файлы игнорировать при публикации (файлы' .ts') и '.gitignore', чтобы сообщить git, какие файлы игнорировать (' dist/') – Purag

Смежные вопросы