Как заставить TypeScript игнорировать папку node_modules при компиляции?
Решение: правильная настройка tsconfig.json
Проблема, с которой вы столкнулись, довольно распространена среди новичков. Давайте разберемся, как правильно настроить TypeScript, чтобы он игнорировал папку node_modules.
Основная причина, почему "exclude": ["node_modules"] может не работать — это неправильное расположение файла tsconfig.json или некорректное указание путей. Вот проверенное решение:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"strict": true,
"skipLibCheck": true // Отключает проверку .d.ts файлов
},
"include": ["src/**/*.ts"], // Указываем только папку src
"exclude": ["node_modules", "dist", "**/*.spec.ts"]
}
Ключевые моменты:
- include — явно указывает, какие файлы компилировать. В вашем случае это все .ts файлы в папке src
- exclude — список папок, которые нужно игнорировать.
node_modulesдолжен быть здесь обязательно - skipLibCheck — очень полезная опция, которая отключает проверку типов в файлах объявлений (.d.ts)
Почему это работает?
Когда вы используете include, TypeScript начинает поиск файлов только в указанных директориях. exclude же работает как дополнительный фильтр — даже если файл попал в include, но находится в exclude, он будет проигнорирован.
Если вы используете монорепозиторий или имеете вложенные проекты, можно также добавить:
{
"compilerOptions": {
// ... другие настройки
"types": ["node"], // Явно указываем используемые типы
"typeRoots": ["./node_modules/@types"] // Указываем путь к типам
},
"include": ["src/**/*.ts"],
"exclude": ["node_modules", "dist", "coverage"]
}
Дополнительные советы:
- Убедитесь, что
tsconfig.jsonнаходится в корневой папке проекта - Проверьте, нет ли других
tsconfig.jsonвнутриnode_modules— они могут переопределять настройки - Используйте
"rootDir": "./src"для более точного контроля структуры выходных файлов
После применения этих настроек выполните tsc --showConfig — вы увидите итоговую конфигурацию, которую использует компилятор. Убедитесь, что node_modules отсутствует в списке include.
Альтернативный подход: использование .gitignore для TypeScript
Хотя основной способ — настройка tsconfig.json, существует еще один полезный метод. Вы можете создать файл .tsignore или использовать существующий .gitignore для управления тем, какие файлы TypeScript должен игнорировать.
Однако, более практичное решение — использовать project references в TypeScript. Это особенно полезно для больших проектов:
// tsconfig.json (корневой)
{
"files": [],
"references": [
{ "path": "./src" }
]
}
// src/tsconfig.json
{
"compilerOptions": {
"composite": true,
"outDir": "../dist",
"rootDir": "."
},
"include": ["**/*.ts"],
"exclude": ["../node_modules"]
}
Этот подход позволяет изолировать компиляцию каждого модуля и гарантирует, что node_modules не будет случайно включена. Также рекомендую использовать "forceConsistentCasingInFileNames": true для избежания проблем с различными операционными системами.
Если ничего не помогает, проверьте, не установлен ли у вас TypeScript глобально — иногда это вызывает конфликты с локальной версией.