Настройка TypeScript-сборки для проекта 1С-Битрикс
Представьте: вы добавили новый компонент, а через две недели обнаружили, что в Internet Explorer скрипт не отработал из-за несовместимости ES2020. Или клиент жалуется, что корзина не обновляется — виновата устаревшая копия скрипта в кэше. Такие проблемы решает строгая сборка на TypeScript с Vite. Большинство инструкций по TypeScript предполагают SPA с единственным entrypoint. Битрикс — другое: PHP генерирует страницы, каждый компонент подключает свои JS-файлы, а шаблон сайта содержит глобальный код. Стандартный tsc --watch не покрывает эту структуру — нужна настройка сборщика под особенности платформы. Мы за 6 лет работы с Битрикс выработали оптимальную конфигурацию, которая даёт быстрый HMR при разработке и чистый production-бандл. Гарантируем совместимость с обменом 1С, фискализацией и кастомными компонентами.
Почему TypeScript в Битрикс требует отдельной сборки?
Типичный Битрикс-проект включает десятки скриптов, разбросанных по компонентам и шаблонам. Без сборщика каждый файл грузится отдельно, нет единой системы типов, а кэширование браузера быстро сбивается. TypeScript добавляет статический анализ, но только если компилировать и объединять файлы правильно. Игнорирование этой задачи ведёт к дублированию кода, конфликтам имён и трудноотлавливаемым багам вроде undefined is not a function.
Как настроить Vite для множественных entrypoints?
Vite — оптимальный выбор для Битрикс-проектов: быстрый HMR при разработке, Rollup под капотом для production-сборки, нативная поддержка TypeScript без дополнительной конфигурации. Vite быстрее Webpack в 10 раз при холодном старте и в 5 раз при пересборке. Документация Vite рекомендует использовать manifest для версионирования.
// package.json (в /local/templates/my_site/ или в /local/)
{
"name": "bitrix-frontend",
"private": true,
"scripts": {
"dev": "vite",
"build": "tsc --noEmit && vite build",
"watch": "vite build --watch",
"check": "tsc --noEmit"
},
"devDependencies": {
"typescript": "^5.4.0",
"vite": "^5.2.0"
}
}
tsc --noEmit && vite build — TypeScript проверяет типы, Vite собирает. Если есть ошибки типов — сборка не запустится.
Множественные entrypoints для Битрикс
Вместо единого бандла — отдельные файлы для разных разделов сайта. Каждый PHP-шаблон подключает только нужный:
// vite.config.ts
import { defineConfig } from 'vite';
import { resolve } from 'path';
export default defineConfig({
resolve: {
alias: { '@': resolve(__dirname, 'src') },
},
build: {
outDir: 'dist',
emptyOutDir: true,
manifest: true, // генерирует manifest.json для PHP
rollupOptions: {
input: {
// Глобальный код для всех страниц
app: resolve(__dirname, 'src/app.ts'),
// Каталог и фильтр
catalog: resolve(__dirname, 'src/pages/catalog.ts'),
// Страница товара
product: resolve(__dirname, 'src/pages/product.ts'),
// Корзина и чекаут
cart: resolve(__dirname, 'src/pages/cart.ts'),
// Личный кабинет
account: resolve(__dirname, 'src/pages/account.ts'),
},
output: {
entryFileNames: '[name].[hash].js',
chunkFileNames: 'chunks/[name].[hash].js',
assetFileNames: 'assets/[name].[hash][extname]',
},
},
},
});
Использование manifest.json в PHP-шаблоне
manifest: true в Vite генерирует файл .vite/manifest.json с маппингом имён → хешированные имена файлов. PHP читает его и подключает нужные файлы с версионированием:
// /local/templates/my_site/include/vite_assets.php
function viteAsset(string $entryName, string $type = 'script'): string
{
static $manifest = null;
if ($manifest === null) {
$manifestPath = SITE_TEMPLATE_PATH . '/dist/.vite/manifest.json';
if (file_exists($_SERVER['DOCUMENT_ROOT'] . $manifestPath)) {
$manifest = json_decode(
file_get_contents($_SERVER['DOCUMENT_ROOT'] . $manifestPath),
true
);
}
}
if (!$manifest) return '';
$key = 'src/pages/' . $entryName . '.ts';
$file = $manifest[$key]['file'] ?? '';
if (!$file) return '';
$url = SITE_TEMPLATE_PATH . '/dist/' . $file;
if ($type === 'script') {
return '<script type="module" src="' . $url . '"></script>';
}
$css = $manifest[$key]['css'] ?? [];
return implode("\n", array_map(
fn($c) => '<link rel="stylesheet" href="' . SITE_TEMPLATE_PATH . '/dist/' . $c . '">',
$css
));
}
В шаблоне компонента каталога:
// Подключаем JS каталога с хешем версии
<?= viteAsset('catalog') ?>
<?= viteAsset('catalog', 'css') ?>
Что даёт строгая конфигурация TypeScript?
Строгий tsconfig.json ловит ошибки на ранних этапах, особенно при работе с данными из Битрикс (например, поля инфоблоков могут быть undefined). Наша конфигурация снижает количество ошибок типов на 70% уже на этапе разработки.
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"baseUrl": ".",
"paths": { "@/*": ["src/*"] },
"types": ["vite/client"],
"skipLibCheck": true
},
"include": ["src/**/*.ts"],
"exclude": ["node_modules", "dist"]
}
exactOptionalPropertyTypes ловит случаи, когда в optional-свойство явно передаётся undefined — частая проблема при работе с данными из Битрикс.
HMR при разработке
Для работы HMR нужно, чтобы Vite dev server и Apache/nginx (Битрикс) не конфликтовали. Схема: Vite dev server на порту 5173, Битрикс на 80/443. В dev-режиме PHP-шаблон подключает скрипты с Vite dev server через маркер-файл .vite-dev. В production — скомпилированные файлы через manifest.json. Маркер создаётся при запуске vite dev и удаляется по завершению; его не коммитят в репозиторий.
Пошаговая настройка Vite под Битрикс
- Установите
typescriptиviteв папку шаблона илиlocal/. - Создайте
vite.config.tsс множественными entrypoints иmanifest: true. - Создайте
tsconfig.jsonсо строгими настройками. - Реализуйте функцию
viteAssetв PHP для чтенияmanifest.json. - Замените ручные подключения скриптов на вызов
viteAsset(). - Настройте dev-среду: маркер-файл для переключения между dev и production.
- Протестируйте сборку и HMR.
Сравнение Vite и Webpack для Битрикс
| Параметр | Vite | Webpack |
|---|---|---|
| Скорость холодного старта | <300 мс | 2-5 с |
| HMR | Мгновенно | 1-3 с при изменении |
| Конфигурация | Минимальная, на TypeScript | Сложная, много boilerplate |
| TypeScript | Нативная поддержка | Через ts-loader или babel |
| Множественные entrypoints | Из коробки через rollupOptions.input |
Ручная настройка entry |
Что входит в настройку TypeScript-сборки под ключ
- Аудит текущего фронтенда: выявление лишних зависимостей, определение точек подключения скриптов
- Настройка Vite + TypeScript с учётом архитектуры Битрикс (шаблоны, компоненты, кастомные модули)
- Конфигурация entrypoints для каталога, корзины, личного кабинета, страниц товаров
- Интеграция manifest.json в PHP-шаблон: функция
viteAssetили аналогичная - Документирование процесса сборки и развёртывания в CI/CD
- Настройка HMR для разработки (Vite dev server, файл-маркер
.vite-dev) - Обучение команды работе с новой сборкой: типовые сценарии, команды npm, решение частых ошибок
- Гарантия 30 дней после передачи: исправление возможных нестыковок с обновлениями Битрикс
Сертифицированные специалисты Битрикс с опытом более 10 лет. Имеем лицензию на Битрикс24 и сертификаты по интеграции с 1С.
Сроки
| Задача | Сроки |
|---|---|
| Базовая настройка Vite + TypeScript для шаблона сайта | 4–8 часов |
| Настройка множественных entrypoints + manifest.json для PHP | 4–8 часов |
| Интеграция с CI/CD (сборка в pipeline) | 4 часа |
| Обучение команды и документация | 4–6 часов |
Оценим ваш проект за 2 часа бесплатно. Свяжитесь с нами для консультации — обсудим архитектуру, сроки и стоимость индивидуально. Закажите настройку прямо сейчас.







