Skip to content

Vite Build System

Komplexní dokumentace Vite integrace pro backend (admin panel) a frontend (veřejný web).


Přehled

Projekt používá Vite jako moderní build system s:

  • Dvěma oddělený dev servery: 5173 (admin), 5174 (frontend)
  • Hot Module Replacement: Okamžité změny bez refresh
  • Production optimization: Tree-shaking, code-splitting, minifikace
  • PHP integrace: Třída Asset::vite() pro automatické načítání

Záměr: Každý backend/frontend má svůj build pipeline s vlastními entry pointy a CSS.


Struktura src/

/src/
├── backend/                    # Admin panel assets
│   ├── admin.js               # Main admin entry point
│   ├── login.js               # Login entry point
│   ├── js/                    # Backend JavaScript
│   │   ├── main.js            # Shared backend JS
│   │   ├── cubes/             # Cube management modules
│   │   ├── menu.js, tabs.js, languages.js
│   │   └── ...další modulů
│   ├── scss/                  # Backend SCSS stylesheets
│   ├── static/                # Vendor files (ckeditor, etc.)
│   └── vendor/                # Vendor CSS/JS (tracy, dropzone)
│
├── frontend/                  # Public website assets
│   ├── frontend.js           # Main frontend entry point
│   ├── js/                   # Frontend JavaScript
│   │   ├── base.js, menu.js, gallery.js, search.js
│   │   └── ...další modulů
│   ├── scss/                 # Frontend SCSS stylesheets
│   ├── static/               # Static assets (fonts, images)
│   ├── vendor/               # Vendor CSS/JS (lightbox, prism)
│   └── _coder/               # Coder customizations
│
├── vite.config.backend.js    # Vite config pro admin
├── vite.config.frontend.js   # Vite config pro frontend
├── package.json              # Build scripts a dependency
└── node_modules/             # Dependencies (spravované Bun)

Vite Konfigurace

Backend – vite.config.backend.js

export default {
    root: './backend',                         // Source root
    base: '',                                  // Bez subpath
    publicDir: 'static',                       // Statické assety

    server: {
        host: '0.0.0.0',                       // Přístupný z venku
        port: 5173,                            // Admin dev server
        cors: { origin: '*', methods: ['GET', 'POST', 'OPTIONS'] }
    },

    build: {
        outDir: '../../public/ADMIN',          // Výstup: /public/ADMIN/
        manifest: true,                         // Generuje manifest.json
        rollupOptions: {
            input: entryPoints('backend/*.js'), // admin.js, login.js
            output: {
                entryFileNames: 'js/[name].js',
                assetFileNames: 'css/[name].[ext]'
            }
        }
    },

    plugins: [
        mkcert(),                              // HTTPS certificates
        liveReload([
            '../../app/templates/**/*.tpl',
            '../../app/(tags|cubes)/**/*.(tpl|php|scss|css|js)',
            './**/*'
        ])                                      // Hot reload
    ]
};

Frontend – vite.config.frontend.js

export default {
    root: './frontend',
    port: 5174,                                // Frontend dev server
    build: {
        outDir: '../../public',                // Výstup: /public/
        // ...ostatní identické
    }
};

Entry Points

Backend Entry Points

admin.js – Hlavní admin panel

// Vendor
import './vendor/tracy.js';
import './vendor/tracy.scss';
import './vendor/dropzone.scss';

// Admin JS
import './js/main.js';                 // Shared backend
import './js/menu.js';                 // Menu management
import './js/tabs.js';                 // Tab navigation
import './js/cubes.js';                // Cube management
import './js/wysiwyg.js';              // WYSIWYG editor
import './js/crop/init.js';            // Image cropping
import './js/dropzone/files.js';       // File uploads

// Admin CSS
import './scss/main.scss';             // Main admin styles

Výstupy:

.vite/manifest.json → admin.js mapa
/js/admin.js        → Minifikovaný admin JS
/css/admin.css      → Zkompilované SCSS
/css/main.css       → Sdílené admin CSS

login.js – Login stránka (lightweight)

import './vendor/tracy.js';
import './vendor/tracy.scss';

import './js/login.js';                 // Jen login JS
import './scss/main.scss';              // Sdílené CSS

Výhoda:

  • Login stránka se stahuje samostatně
  • Menší bundle (bez admin modulů)
  • Lepší performance na login

Frontend Entry Point

frontend.js – Veřejný web (complete)

// Vendor
import './vendor/tracy.js';
import './vendor/tracy.scss';
import './vendor/prism.js';
import './vendor/prism.css';
import './vendor/simple-lightbox.esm.js';
import './vendor/simple-lightbox.scss';

// Frontend JS modules
import './js/base.js';                  // Base functionality
import './js/menu.js';                  // Frontend menu
import './js/gallery.js';               // Gallery
import './js/search.js';                // Search
import './js/translations.js';          // Translations

// App tags (formuláře, komponenty)
import '../../app/tags/form/contact/form.js';
import '../../app/tags/form/contact/form.scss';
import '../../app/tags/user/registration/form.js';
import '../../app/tags/cookies/compliance.js';
import '../../app/tags/cookies/compliance.scss';

// Frontend CSS
import './_coder/main.scss';            // Coder customizations
import './scss/frontend.scss';          // Main frontend styles

Výstupy:

.vite/manifest.json → frontend.js mapa
/js/frontend.js     → Minifikovaný frontend JS
/css/frontend.css   → Zkompilované frontend SCSS


Build Scripts

package.json

{
    "scripts": {
        "dev": "concurrently -n 'BACK,FRONT' -c 'cyan,yellow' 'vite --config vite.config.backend.js' 'vite --config vite.config.frontend.js'",
        "build": "vite build --config vite.config.backend.js && vite build --config vite.config.frontend.js"
    },
    "devDependencies": {
        "vite": "^5.0.0",
        "concurrently": "^8.2.0",
        "sass": "^1.69.0",
        "@vitejs/plugin-legacy": "^5.0.0"
    }
}

Spouštění

Development

cd src/
bun install          # Instalace závislostí (jednou)
bun run dev          # Spustí oba dev servery

Co se stane:

BACK | Vite v5.0.0 server running at:
BACK | > Local:  http://localhost:5173/
BACK | > use `--host` to expose

FRONT| Vite v5.0.0 server running at:
FRONT| > Local:  http://localhost:5174/
FRONT| > use `--host` to expose

Projeky v prohlížeči:

  • Admin: http://localhost:8000/ADMIN (dev server běží na pozadí)
  • Frontend: http://localhost:8000 (dev server běží na pozadí)

Hot Reload:

BACK | [vite] hmr client connected
BACK | [vite] updated: /src/backend/js/menu.js

Jakákoli změna v /src/backend/ nebo /src/frontend/ → okamžitá aktualizace v prohlížeči.

Production Build

cd src/
bun run build

# Výstup:
#   ✓ frontend vite v5.0.0 built in 3.21s
#   ✓ backend vite v5.0.0 built in 2.84s

Co se vygeneruje:

/public/
├── .vite/manifest.json
├── js/frontend.js (minified)
├── js/utils.js (dynamic import)
├── css/frontend.css
└── ADMIN/
    ├── .vite/manifest.json
    ├── js/admin.js (minified)
    ├── js/login.js (minified)
    ├── js/main.js (shared code)
    ├── css/admin.css
    └── css/main.css

Manifest.json

Manifest je klíčový soubor pro production. Mapuje vstupní body na výstupní bundly.

Frontend Manifest

{
  "frontend.js": {
    "file": "js/frontend.js",
    "name": "frontend",
    "src": "frontend.js",
    "isEntry": true,
    "dynamicImports": [
      "../node_modules/intl-tel-input/build/js/utils.js"
    ],
    "css": [
      "css/frontend.css"
    ]
  },
  "../node_modules/intl-tel-input/build/img/flags.webp": {
    "file": "css/flags.webp",
    "src": "../node_modules/intl-tel-input/build/img/flags.webp"
  }
}

Admin Manifest

{
  "admin.js": {
    "file": "js/admin.js",
    "src": "admin.js",
    "isEntry": true,
    "imports": ["_main.js"],
    "css": ["css/admin.css"]
  },
  "login.js": {
    "file": "js/login.js",
    "src": "login.js",
    "isEntry": true,
    "imports": ["_main.js"]
  },
  "_main.js": {
    "file": "js/main.js",
    "css": ["css/main.css"]
  }
}

PHP Integrace – Asset::vite()

Třída Petrovo\Asset\Asset (viz dokumentace v core/asset/reference) automaticky:

  1. Dev režim: Detekuje Vite dev server → vrací <script src="http://localhost:517x/...">
  2. Production: Čte manifest → vrací optimalizované tagy s verzemi

Frontend tag

/app/tags/assets/frontend.php:

<?php
use Petrovo\Asset\Asset;

echo Asset::vite(CONFIG['vite_frontend'], 'frontend.js');

V šabloně:

{T assets/frontend}

Výstup:

  • Dev:

    <script src="http://localhost:5174/frontend.js"></script>

  • Production:

    <script src="/js/frontend.js?1705234567"></script>
    <link rel="stylesheet" href="/css/frontend.css?...">

Admin tag

/app/tags/ADMIN/assets/admin.php:

<?php
use Petrovo\Asset\Asset;

// Různé vstupní body
$entry = (PAGE === 'login') ? 'login.js' : 'admin.js';

echo Asset::vite(CONFIG['vite_backend'], $entry);

V admin šabloně:

{T ADMIN/assets/admin}


Workflow – Backend Developer

Přidání nového modulu

1. Vytvoř soubor

/src/backend/js/my-module.js

2. Importuj v admin.js

// /src/backend/admin.js
import './js/my-module.js';

3. Dev server se automaticky aktualizuje

BACK | [vite] updated: /src/backend/admin.js

4. Změní se v prohlížeči – Hot reload

5. Production build

bun run build

Manifest automaticky obsahuje nový modul.


Workflow – Frontend Developer

Přidání SCSS komponenty

1. Vytvoř SCSS soubor

/src/frontend/scss/components/button.scss

2. Importuj ve frontend.js

// /src/frontend/frontend.js
import './scss/components/button.scss';

3. Dev:

FRONT| [vite] updated: /src/frontend/scss/components/button.scss

CSS se okamžitě začne hledat a změní se v prohlížeči.

4. Production:

bun run build

CSS se zkompiluje do /public/css/frontend.css.


Advanced Topics

Code Splitting – Dynamické importy

Frontend automaticky generuje dynamic import pro intl-tel-input:

// /src/frontend/js/phone.js
const utils = await import('intl-tel-input/build/js/utils.js');

Vite to detekuje → vygeneruje separátní chunk:

/public/js/utils.js (dynamicImport)

Manifest:

{
  "frontend.js": {
    "dynamicImports": ["../node_modules/intl-tel-input/..."]
  }
}

Asset::vite() to automaticky řeší → přidá <link rel="modulepreload">.


Vendor Optimization

Projekt odděluje vendor code:

import './vendor/prism.js';           // External library
import './vendor/prism.css';

import './js/base.js';                // Internal code

Vite to optimalizuje → menší main bundle, vendor v separátním chunku.


Environment Variables

Vite automaticky zpracuje .env soubory:

# .env
VITE_API_URL=https://api.example.com

# .env.development
VITE_API_URL=http://localhost:3000

V kódu:

console.log(import.meta.env.VITE_API_URL);


Troubleshooting

Dev server neStartuje

# Port je obsazen?
lsof -i :5173
lsof -i :5174

# Kill proces a spusť znova
pkill -f "vite --config"
bun run dev

Hot Reload nefunguje

# Zkontroluj liveReload nastavení v vite.config.backend.js
# Musí monitorovat správné soubory:

liveReload([
    '../../app/templates/**/*.tpl',     # Tagy
    '../../app/(tags|cubes)/**/*',      # Komponenty
    './**/*'                             # Src
])

# Pokud nefunguje → zkus refresh prohlížeče (Ctrl+R)

Manifest neexistuje v production

# Build skončil s chybou?
bun run build

# Zkontroluj výstup
ls -la public/.vite/manifest.json
ls -la public/ADMIN/.vite/manifest.json

# Měly by existovat

CSS se nemění v dev

# Zkontroluj že SCSS je importován v admin.js/frontend.js
import './scss/my-component.scss';

# Hot reload jen funguje pro existující soubory
# Pokud přidáš nový SCSS → musíš refresh (Ctrl+R)

Configuace

Dev server URLs se nastavují v /config/development.yaml:

vite_backend: http://localhost:5173   # Admin dev server
vite_frontend: http://localhost:5174  # Frontend dev server

V production se Asset::vite() automaticky přepne na manifest.json.


Shrnutí

Aspekt Popis
Dev servery 5173 (backend), 5174 (frontend)
Entry points admin.js, login.js, frontend.js
Output /public/, /public/ADMIN/
Manifest /public/.vite/manifest.json
PHP integrace Asset::vite(url, entry)
Hot reload Automatické při change v /src/
Production Tree-shake, minify, manifest
Performance Cache-busting přes filemtime()

Vite + Asset = efektivní, moderní build system pro PHP + JS combo projekt.