Налаштування 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 години безкоштовно. Зв'яжіться з нами для консультації — обговоримо архітектуру, терміни та вартість індивідуально. Замовте налаштування прямо зараз.







