Avatar ·

Как заставить TypeScript игнорировать папку node_modules при компиляции?

Привет всем! Я новичок в TypeScript и столкнулся с проблемой. Когда я запускаю команду `tsc` в своем проекте, компилятор начинает проверять все файлы в папке `node_modules`. Это занимает очень много времени и вызывает много ошибок. Моя структура проекта выглядит так: ``` my-project/ ├── node_modules/ ├── src/ │ └── index.ts └── tsconfig.json ``` Вот мой `tsconfig.json`: ```json { "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "strict": true } } ``` Когда я запускаю `tsc`, я получаю тысячи ошибок из `node_modules`, хотя я явно не импортирую их в своем коде. Я уже пробовал добавлять `"exclude": ["node_modules"]` в tsconfig.json, но это не помогает. Также пробовал использовать `"skipLibCheck": true`, но это только отключает проверку библиотек, а не игнорирование всей папки. Может быть, я что-то делаю не так? Как правильно настроить 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 глобально — иногда это вызывает конфликты с локальной версией.