Installation:
composer require bechir/vite-bundle
yarn add --dev vite-fait
Enable the bundle in config/bundles.php and configure config/packages/bechir_vite.yaml:
bechir_vite:
output_path: '%kernel.project_dir%/public/dist'
First Use Case:
vite.config.js in your project root with a basic config:
const ViteFait = require('vite-fait');
module.exports = ViteFait
.setRoot('assets')
.setOutputPath('../public/dist')
.addEntry('app', './assets/app.js')
.getViteConfig();
yarn dev (or npm run dev) to generate assets in public/dist.Symfony Integration:
<script type="module" src="{{ asset('dist/app.js') }}"></script>
Development Workflow:
yarn dev (or npm run dev) for hot module replacement (HMR) during development.Production Build:
yarn build (or npm run build) to generate optimized assets.public/dist to Symfony’s public/ directory (if configured).Multi-Entry Points:
app.js, admin.js) in vite.config.js:
ViteFait
.addEntry('app', './assets/app.js')
.addEntry('admin', './assets/admin/app.js');
{% if app.user.isAdmin %}
<script type="module" src="{{ asset('dist/admin.js') }}"></script>
{% else %}
<script type="module" src="{{ asset('dist/app.js') }}"></script>
{% endif %}
Asset Versioning:
app.[hash].js). Cache-busting works out-of-the-box.Symfony Asset Integration:
{{ asset() }} in Twig for generated files (e.g., {{ asset('dist/app.js') }}).<link rel="stylesheet" href="{{ asset('dist/app.css') }}">
Webpack Encore Migration:
Replace webpack.config.js with vite.config.js. The bundle bridges Vite’s output to Symfony’s asset pipeline.
Example migration:
// Before (Encore)
Encore
.setOutputPath('public/build/')
.addEntry('app', './assets/app.js');
// After (Vite)
ViteFait
.setOutputPath('../public/build/')
.addEntry('app', './assets/app.js');
Environment-Specific Configs:
Use Vite’s mode flag to switch configs (e.g., yarn dev --mode=staging).
Example in vite.config.js:
const mode = process.env.VITE_MODE || 'development';
if (mode === 'production') {
ViteFait.setBase('/prod-assets/');
}
TypeScript Support:
Add TypeScript via vite.config.js:
ViteFait.setInput('assets/ts/app.ts').setOutput('app.js');
Install dependencies:
yarn add --dev typescript @types/node
Output Path Conflicts:
bechir_vite.output_path in config/packages/bechir_vite.yaml matches the path in vite.config.js (setOutputPath).../public/dist vs. public/dist).Missing vite-fait:
vite-fait (yarn add --dev vite-fait) will break the bundle.composer require.Twig Asset Paths:
{{ asset('dist/app.js') }} in development may fail if Vite’s HMR isn’t properly proxied./dist to Vite’s dev server (see ViteFait docs).Caching Issues:
yarn dev --force or clear browser cache.Symfony Asset Controller:
assets:install command. Manually copy files from dist/ to public/ in production:
cp -r public/dist/* public/
Vite Errors:
yarn dev --debug for verbose logs.Symfony Logs:
APP_DEBUG=1) to catch PHP-level issues (e.g., missing bundle config).Network Tab:
http://localhost:3000 (default) and assets are loaded from there during development.Custom Vite Plugins:
vite.config.js with additional plugins (e.g., @vitejs/plugin-react):
const { defineConfig } = require('vite');
const react = require('@vitejs/plugin-react');
module.exports = defineConfig({
plugins: [react()],
...ViteFait.getViteConfig(),
});
Symfony Event Listeners:
kernel.terminate):
// src/EventListener/ViteBuildListener.php
use Symfony\Component\HttpKernel\Event\TerminateEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class ViteBuildListener {
public function onTerminate(TerminateEvent $event) {
if ($event->isMainRequest() && $event->getRequest()->getPathInfo() === '/build') {
shell_exec('yarn build');
}
}
}
Register in services.yaml:
services:
App\EventListener\ViteBuildListener:
tags:
- { name: kernel.event_listener, event: kernel.terminate, method: onTerminate }
Dynamic Entry Points:
vite.config.js dynamically based on Symfony’s routes:
// src/Kernel.php
public function getViteEntries(): array {
return [
'app' => 'assets/app.js',
'admin' => 'assets/admin/app.js',
];
}
Use in vite.config.js:
const entries = JSON.parse(<?= json_encode($kernel->getViteEntries()) ?>);
Object.entries(entries).forEach(([name, path]) => {
ViteFait.addEntry(name, path);
});
Environment Variables:
%env% variables to Vite via .env:
echo "VITE_APP_ENV=$APP_ENV" >> .env
Access in JavaScript:
console.log(import.meta.env.VITE_APP_ENV);
How can I help you explore Laravel packages today?