Машинопись - преобразование импорта для распределения npm

Я работаю над пакетом NPM, написанным на Typescript, и у меня возникают проблемы с пониманием разрешения модуля при компиляции библиотеки для публикации.

На протяжении всего проекта я использовал неродственный импорт, чтобы не раздражать ../../../. Однако я читал в документации по машинописному тексту, что относительный импорт следует использовать в проекте.

Относительный импорт разрешается относительно импортируемого файла и не может разрешаться в объявление внешнего модуля. Вы должны использовать относительный импорт для ваших собственных модулей, которые гарантированно сохранят свое относительное расположение во время выполнения.

Неотносительный импорт может быть разрешен относительно baseUrl или с помощью сопоставления путей, о чем мы расскажем ниже. Они также могут разрешать объявления внешнего модуля. Используйте не относительные пути при импорте любых внешних зависимостей.

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

Я хотел бы иметь возможность записывать файлы, используя не относительный импорт, но преобразовывать их каким-либо образом, чтобы файлы dist/ могли разрешать импорт.

Проект размещен на github, здесь.

Соответствующая проблема заключается в том, что в моей папке dist/ остается index.d.ts файл, который выглядит следующим образом:

import { Emitter } from 'emitter';
import { Schema } from 'migrations';
import { Model, model, relation } from 'model';
import { Builder } from 'query';

export { Builder, Emitter, Model, model, relation, Schema };

Но у всех модулей есть ошибки, которые модуль не может исправить. Как я могу сохранить этот импорт в их текущей форме, но каким-то образом преобразовать их при сборке, чтобы при публикации пакета npm модули могли быть правильно разрешены.


person Wolfie    schedule 25.06.2018    source источник
comment
Рассматривали ли вы возможность объединения пакета npm только с скомпилированными файлами? Модуль машинописного текста может распространяться как файл js + прилагаемый файл d.ts. Не могли бы вы просто скомпилировать это перед отправкой в ​​npm?   -  person A. Chiesa    schedule 25.06.2018
comment
@ A.Chiesa При установке для модуля commonjs вы можете указать только выходной каталог, но не выходной файл.   -  person Wolfie    schedule 25.06.2018


Ответы (1)


Я бы последовал совету в официальных документах Typescript:

https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

По сути, предлагается создать свою библиотеку непосредственно перед публикацией в npm. У вас будет два файла на выходе; назовем их main.js и main.d.ts.

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

Включите в свой package.json две строки (или измените их соответствующим образом, если они у вас уже есть):

{
    ...
    "main": "./lib/main.js",
    "types": "./lib/main.d.ts"
    ...
}

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

person A. Chiesa    schedule 25.06.2018
comment
Основная проблема в том, что если я установил для модуля значение commonjs, я не смогу скомпилировать в один файл. И вся документация и руководства, которые я вижу, основаны на одном файле, поэтому я немного застрял. - person Wolfie; 25.06.2018