Вопрос или проблема
Я учусь, как опубликовать пакет TypeScript в NPM. Это простой пакет, который просто экспортирует несколько функций для генерации случайных чисел, но в конечном итоге он будет делать больше:
src
/random
/index.ts
/index.ts
package.json
tsconfig.json
.gitignore
Когда я импортирую npm пакет в другой проект TypeScript, я получаю следующую ошибку:
import {Random} from "@whiterook6/my-package";
console.log(Random.randomInt(1, 10));
Не удается найти модуль '@whiterook6/my-package' или его соответствующие объявления типов.ts(2307)
Но если я изменю импорт на это, то все работает:
import {Random} from "@whiterook6/my-package/src";
console.log(Random.randomInt(1, 10));
Что я сделал неправильно в моем библиотечном пакете, чтобы получить такой ужасный результат, и как я могу изменить это, чтобы пользователи могли писать такие импорты?
import {Random, Logger} from "@whiterook6/my-package";
Вот мой файл tsconfig.json:
{
"compilerOptions": {
"target": "ESNext", // Укажите целевую версию ECMAScript
"module": "ESNext", // Укажите стратегию генерации модульного кода
"moduleResolution": "node", // Укажите стратегию разрешения модулей
"declaration": true, // Генерировать файлы объявлений
"emitDeclarationOnly": true, // Генерировать только файлы объявлений
"outDir": "./src", // Перенаправить структуру вывода в каталог
"rootDir": "./src", // Укажите корневой каталог входных файлов
"strict": true, // Включите строгую проверку типов
"esModuleInterop": true, // Включите совместимость с CommonJS и ES модулями
"skipLibCheck": true, // Пропускать проверку типов файлов объявлений
"forceConsistentCasingInFileNames": true // Обеспечить последовательный регистр в импортах
},
"include": [
"src/**/*" // Включить все файлы в каталоге src
],
"exclude": [
"node_modules", // Исключить каталог node_modules
"dist" // Исключить каталог dist
]
}
Ответ или решение
Почему нужно указывать src
в инструкции импорта для публикации пакета?
Когда вы разрабатываете и публикуете пакет TypeScript в NPM, критически важно правильно настраивать структуру и параметры пакета. Ваша проблема заключается в том, что при импорте пакета без указания пути к каталогу src
возникают ошибки компиляции. Давайте разберёмся, почему это происходит и как исправить ситуацию, чтобы пользователи могли импортировать ваш пакет без дополнительных сложностей.
Основные причины проблемы
-
Структура каталогов: Ваш текущий проект имеет структуру, в которой исходные файлы находятся в каталоге
src
. Это стандартная практика, но для того чтобы другие разработчики могли использовать ваш пакет, необходимо убедиться, что выходные (скомпилированные) файлы доступны в корневом каталоге. -
Настройки TypeScript: Вы указали
outDir
иrootDir
как./src
. Это означает, что скомпилированные файлы TypeScript будут помещены в ту же директорию, где находятся исходные файлы. Однако это не соответствует ожидаемой конфигурации для NPM-пакетов, где скомпилированные файлы обычно помещаются в отдельный каталог, например,dist
. -
Атрибут
main
в package.json: В вашемpackage.json
отсутствует указание на файл, который будет загружен по умолчанию. Это важная часть, поскольку NPM будет искать файл, указанный вmain
, чтобы знать, откуда начинать. Если этот путь указывает на файл, лежащий вsrc
, пользователям потребуется указыватьsrc
в своих импортах.
Как исправить ситуацию
Чтобы устранить возникшие проблемы и сделать ваш пакет более подходящим для использования, выполните следующие шаги:
-
Измените структуру вывода:
Измените конфигурацию вашегоtsconfig.json
, чтобы компилируемые файлы находились в отдельной директории, например,dist
. Вот как это сделать:{ "compilerOptions": { // ... остальные параметры "outDir": "./dist", // Укажите директорию для скомпилированных файлов "rootDir": "./src" // Оставьте корневую директорию для исходных файлов }, "include": [ "src/**/*" ] }
-
Обновите package.json:
Убедитесь, что у вас есть правильный путь к точке входа в вашемpackage.json
. Добавьте следующее:{ "main": "dist/index.js", // основной файл для импорта "types": "dist/index.d.ts" // файл для типов, если он существует }
Это позволит NPM знать, где искать код и типы, и разработчики смогут импортировать ваш пакет без дополнительных директорий.
-
Создайте файл сборки:
Убедитесь, что вdist
каталог скопированы все необходимые файлы после сборки. Например, вdist/index.js
вы можете создать файл, который импортирует все необходимые функции из вашего кода. -
Переполетите пакет:
После внесения изменений, соберите свой проект заново и опубликуйте обновлённый пакет в NPM.
Заключение
Для успешного использования вашего TypeScript пакета крайне важно правильно организовать файлы и настройки. Убедившись в том, что пользователи не сталкиваются с подобными ошибками, вы улучшите опыт работы с вашим продуктом. Правильно настройка структуры проекта и конфигурация NPM позволит другим разработчикам легко импортировать ваш пакет, что положительно скажется на его популярности и использовании.