TypeScript в связке с Rollup не ограничивается простой транспиляцией
.ts в .js. При корректной архитектуре сборки
проверка типов может быть вынесена в отдельный этап или, наоборот,
интегрирована в пайплайн сборки таким образом, чтобы балансировать между
скоростью и безопасностью кода. Это особенно важно в библиотеках и
крупных фронтенд-проектах, где стоимость ошибки в типах выше стоимости
дополнительного шага сборки.
TypeScript-компилятор выполняет две функции одновременно: транспиляцию кода и проверку типов. Rollup, в свою очередь, занимается модульной сборкой и оптимизацией. При попытке объединить эти процессы напрямую возникает конфликт интересов: Rollup ориентирован на скорость и потоковую обработку модулей, тогда как проверка типов может быть относительно тяжёлой операцией.
Поэтому на практике различают два режима работы:
Каждый из подходов решает разные задачи и влияет на архитектуру проекта.
Один из наиболее прямых способов интеграции TypeScript в Rollup —
использование плагина @rollup/plugin-typescript. Он
вызывает TypeScript API и выполняет компиляцию вместе с базовой
проверкой типов.
Однако важно понимать ключевую особенность: в зависимости от конфигурации, проверка типов может быть частично или полностью отключена в пользу ускорения сборки.
Типичный пример конфигурации:
import typescript from '@rollup/plugin-typescript';
export default {
input: 'src/index.ts',
output: {
dir: 'dist',
format: 'esm'
},
plugins: [
typescript({
tsconfig: './tsconfig.json'
})
]
};
В таком режиме:
Ключевая проблема заключается в том, что Rollup остаётся синхронным инструментом, а полноценная проверка типов требует обхода всего графа зависимостей.
При использовании только @rollup/plugin-typescript
возникают следующие ограничения:
Некоторые конфигурации плагина оптимизируют производительность за счёт отключения полной type-check стадии. В этом случае происходит фактически транспиляция с минимальной проверкой.
Полная проверка типов увеличивает время сборки пропорционально размеру проекта. При росте кодовой базы это становится критическим фактором.
Rollup не разделяет процессы трансформации и проверки типов. Это приводит к блокировке сборочного процесса.
Эти ограничения приводят к тому, что в большинстве production-сценариев проверка типов выносится за пределы Rollup.
Наиболее распространённая архитектура — разделение сборки и проверки типов.
Rollup отвечает за:
TypeScript (tsc) отвечает за:
Команда проверки типов выполняется отдельно:
tsc --noEmit
Флаг --noEmit гарантирует, что TypeScript не будет
генерировать JavaScript, а выполнит только анализ типов.
В зрелых проектах используется параллельная схема:
Пример скриптов:
{
"scripts": {
"build": "rollup -c",
"typecheck": "tsc --noEmit",
"dev": "concurrently \"rollup -c -w\" \"tsc --noEmit -w\""
}
}
Такая схема позволяет:
При больших кодовых базах применяются project references. Это механизм, позволяющий разделять TypeScript-проект на подмодули с независимой компиляцией и проверкой типов.
Структура:
packages/
core/
ui/
app/
Каждый пакет имеет собственный tsconfig.json и может
ссылаться на другие пакеты.
Пример конфигурации:
{
"compilerOptions": {
"composite": true
},
"references": [
{ "path": "../core" },
{ "path": "../ui" }
]
}
В таком режиме:
Rollup при этом продолжает работать поверх уже собранных или резолвленных модулей.
TypeScript поддерживает инкрементальную проверку через
tsBuildInfo:
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo"
}
}
Это особенно эффективно при вынесенной проверке типов:
tsc --noEmitАрхитектурно важно разграничить зоны ответственности:
Попытка заставить Rollup полностью заменить tsc приводит
к потере строгой типовой гарантии.
В CI пайплайнах проверка типов почти всегда выполняется отдельно от сборки.
Типичный сценарий:
tsc --noEmitrollup -cИногда порядок меняется, но чаще проверка типов выполняется первой, чтобы быстро отбраковать некорректные коммиты.
Дополнительно применяются:
node_modules.tsbuildinfoДополнительный слой проверки типов возникает внутри самой конфигурации Rollup. Конфигурационный файл может быть написан на TypeScript:
import { RollupOptions } from 'rollup';
const config: RollupOptions = {
input: 'src/index.ts',
output: {
dir: 'dist',
format: 'esm'
}
};
export default config;
В этом случае:
Однако этот слой не заменяет проверку типов исходного кода.
В некоторых командах применяется строгий режим, при котором сборка Rollup блокируется при наличии ошибок типов.
Это достигается через объединение команд:
tsc --noEmit && rollup -c
В таком подходе:
Минусом является увеличение времени ожидания при разработке.
Часто используются разные стратегии:
tsc --noEmit -w отдельноТакое разделение позволяет балансировать между скоростью разработки и качеством релиза.
Дополнительно к TypeScript часто подключается
typescript-eslint. Он выполняет частичную семантическую
проверку кода.
Однако важно учитывать:
tscВ связке с Rollup ESLint обычно выполняется до сборки или параллельно с type-check процессом.
На практике устойчивые системы используют следующую модель:
tsc --noEmit): полная проверка типовТакое разделение обеспечивает баланс между скоростью сборки и строгой гарантией типовой корректности кода, не перегружая Rollup задачами, для которых он не предназначен.