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

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

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

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

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

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

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

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

Актуальным вопросом является то, что я в конечном итоге index.d.ts файл в моем dist/ папка, которая выглядит так:

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 модули могли быть правильно разрешены.

1 ответ

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

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

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

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

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

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

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

Другие вопросы по тегам