TypeScript в экосистеме Rollup используется не как отдельный этап компиляции, а как часть цепочки трансформаций модулей. В отличие от tsc, который выполняет полноценную компиляцию проекта, Rollup работает с графом модулей и ожидает, что каждый подключаемый плагин будет преобразовывать входные файлы в валидный JavaScript.
Плагин @rollup/plugin-typescript выступает промежуточным
звеном между исходным TypeScript-кодом и финальной сборкой. Его основная
задача — трансформировать .ts и .tsx файлы в
JavaScript на этапе построения графа зависимостей.
Ключевой принцип работы заключается в том, что Rollup не заменяет
TypeScript-компилятор, а использует его API (через tslib и
typescript) для преобразования модулей.
Плагин построен вокруг стандартного TypeScript Compiler API. Внутри
используется typescript.createProgram, который создаёт
виртуальный проект на основе конфигурации
tsconfig.json.
Основные компоненты:
.ts и .tsx.d.tsВажно понимать, что плагин не выполняет отдельный процесс компиляции, а работает внутри процесса Rollup.
Для интеграции требуется установить сам плагин и TypeScript как peer dependency:
npm install @rollup/plugin-typescript typescript --save-dev
Минимальная конфигурация Rollup:
import typescript from '@rollup/plugin-typescript';
export default {
input: 'src/index.ts',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
typescript()
]
};
При такой конфигурации Rollup автоматически использует
tsconfig.json, если он находится в корне проекта.
Плагин полностью опирается на конфигурацию TypeScript. Наиболее важные параметры:
{
"compilerOptions": {
"rootDir": "src",
"outDir": "dist"
}
}
В контексте Rollup outDir фактически игнорируется, так
как вывод контролируется Rollup, но rootDir влияет на
структуру модулей и диагностику.
{
"compilerOptions": {
"target": "ES2019",
"module": "ESNext"
}
}
Rollup ожидает ES-модули, поэтому использование CommonJS
на этом этапе нецелесообразно. При неправильной настройке может
происходить двойная трансформация модулей.
{
"compilerOptions": {
"declaration": true,
"sourceMap": true
}
}
declaration включает генерацию .d.tssourceMap позволяет связать итоговый bundle с исходным
TypeScript-кодомПри запуске сборки происходит следующий процесс:
.ts файла плагин перехватывает модульОсобенность заключается в ленивой компиляции: файлы обрабатываются только при необходимости, а не весь проект сразу.
Одним из ключевых режимов является генерация .d.ts
файлов.
Конфигурация:
typescript({
declaration: true,
declarationDir: 'dist/types'
})
Однако в Rollup важно учитывать, что генерация деклараций может конфликтовать с tree-shaking и многопроходной сборкой.
На практике часто используется разделение:
.d.tsСуществует два подхода:
В этом случае:
transpileOnlytypescript({
noEmitOnError: false,
declaration: false
})
Преимущество — скорость сборки.
typescript({
check: true
})
В этом режиме TypeScript выполняет полную проверку типов, но увеличивается время сборки.
Плагин часто использует tslib для оптимизации
output-кода. Вместо инлайна вспомогательных функций
(__extends, __awaiter) используется импорт из
библиотеки.
npm install tslib
В tsconfig.json:
{
"compilerOptions": {
"importHelpers": true
}
}
Это уменьшает размер итогового bundle.
Для больших проектов важна инкрементальная компиляция:
typescript({
incremental: true,
cacheDir: '.rollup_cache'
})
Механизм основан на хранении информации о предыдущих сборках и повторном использовании AST.
Порядок плагинов критически важен.
Типичная цепочка:
plugins: [
typescript(),
resolve(),
commonjs()
]
Ошибочная конфигурация (например, commonjs до
typescript) может привести к некорректной трансформации
модулей.
TypeScript плагин не управляет external напрямую, но
тесно с ним связан.
external: ['react', 'lodash']
Если типы этих пакетов отсутствуют, TypeScript выдаст ошибки, даже если Rollup исключает их из бандла.
В крупных монорепозиториях применяется
project references:
{
"references": [
{ "path": "../shared" }
]
}
Rollup плагин может работать с таким проектом, но требует аккуратной
настройки tsconfig.json, чтобы избежать дублирования
компиляции.
При неправильном module:
Решение:
{
"compilerOptions": {
"module": "ESNext"
}
}
Если одновременно используются:
@rollup/plugin-typescripttsc в watch modeвозникает двойная компиляция и рассинхронизация output.
import type { User } from './types';
При неправильной конфигурации такие импорты могут сохраняться в output, что ломает runtime.
Для ускорения работы применяются следующие подходы:
skipLibCheckincrementalПри использовании React-подобных проектов:
typescript({
jsx: 'react'
})
или через tsconfig:
{
"compilerOptions": {
"jsx": "react-jsx"
}
}
Rollup корректно обрабатывает TSX через TypeScript transformer без дополнительных Babel шагов.
{
"compilerOptions": {
"isolatedModules": true
}
}
Этот режим критичен для Rollup-пайплайна, так как гарантирует, что каждый файл может быть транспилирован независимо, что соответствует модели Rollup.
typescript({
tsconfig: './tsconfig.build.json'
})
Это позволяет разделять:
Rollup watch mode совместно с TypeScript:
Однако при изменении tsconfig.json происходит полная
пересборка графа.
Внутренний pipeline можно представить как последовательность:
TypeScript AST → трансформация типов → JavaScript emission → Rollup graph integration → final bundle generation
Плагин @rollup/plugin-typescript выступает связующим
слоем, который обеспечивает совместимость строгой типизации TypeScript с
модульной моделью Rollup без необходимости отдельного этапа
компиляции.