Intégration de Vite
Les applications JavaScript modernes nécessitent des outils de build sophistiqués. Nette Assets offre une intégration de première classe avec Vite, l'outil de build frontend de nouvelle génération. Obtenez un développement ultra-rapide avec le Hot Module Replacement (HMR) et des builds de production optimisées sans tracas de configuration.
- Zéro configuration – pont automatique entre Vite et les templates PHP
- Gestion complète des dépendances – une seule balise gère tous les assets
- Hot Module Replacement – mises à jour instantanées de JavaScript et CSS
- Builds de production optimisées – code splitting et tree shaking
Nette Assets s'intègre parfaitement à Vite, vous bénéficiez donc de tous ces avantages tout en écrivant vos templates comme d'habitude.
Configuration de Vite
Configurons Vite étape par étape. Ne vous inquiétez pas si vous débutez avec les outils de build – nous allons tout vous expliquer !
Étape 1 : Installer Vite
Tout d'abord, installez Vite et le plugin Nette dans votre projet :
npm install -D vite @nette/vite-plugin
Ceci installe Vite et un plugin spécial qui aide Vite à fonctionner parfaitement avec Nette.
Étape 2 : Structure du projet
L'approche standard consiste à placer les fichiers d'assets source dans un dossier assets/
à la racine de votre
projet, et les versions compilées dans www/assets/
:
web-project/ ├── assets/ ← fichiers source (SCSS, TypeScript, images source) │ ├── public/ ← fichiers statiques (copiés tels quels) │ │ └── favicon.ico │ ├── images/ │ │ └── logo.png │ ├── app.js ← point d'entrée principal │ └── style.css ← vos styles └── www/ ← répertoire public (racine du document) ├── assets/ ← les fichiers compilés iront ici └── index.php
Le dossier assets/
contient vos fichiers source – le code que vous écrivez. Vite traitera ces fichiers et
placera les versions compilées dans www/assets/
.
Étape 3 : Configurer Vite
Créez un fichier vite.config.ts
à la racine de votre projet. Ce fichier indique à Vite où trouver vos fichiers
source et où placer les fichiers compilés.
Le plugin Nette Vite est livré avec des valeurs par défaut intelligentes qui simplifient la configuration. Il suppose que vos
fichiers source front-end se trouvent dans le répertoire assets/
(option root
) et que les fichiers
compilés vont dans www/assets/
(option outDir
). Vous n'avez qu'à spécifier le point d'entrée :
import { defineConfig } from 'vite';
import nette from '@nette/vite-plugin';
export default defineConfig({
plugins: [
nette({
entry: 'app.js',
}),
],
});
Si vous souhaitez spécifier un autre nom de répertoire pour construire vos assets, vous devrez modifier quelques options :
export default defineConfig({
root: 'assets', // répertoire racine des assets source
build: {
outDir: '../www/assets', // où vont les fichiers compilés
},
// ... autre configuration ...
});
Le chemin outDir
est considéré comme relatif à root
, c'est pourquoi il y a
../
au début.
Étape 4 : Configurer Nette
Indiquez à Nette Assets l'intégration de Vite dans votre common.neon
:
assets:
mapping:
default:
type: vite # indique à Nette d'utiliser le ViteMapper
path: assets
Étape 5 : Ajouter des scripts
Ajoutez ces scripts à votre package.json
:
{
"scripts": {
"dev": "vite",
"build": "vite build"
}
}
Maintenant, vous pouvez :
npm run dev
– démarrer le serveur de développement avec rechargement à chaudnpm run build
– créer des fichiers de production optimisés
Points d'entrée
Un point d'entrée est le fichier principal où votre application démarre. À partir de ce fichier, vous importez d'autres fichiers (CSS, modules JavaScript, images), créant ainsi un arbre de dépendances. Vite suit ces importations et regroupe tout.
Exemple de point d'entrée assets/app.js
:
// Importe les styles
import './style.css'
// Importe les modules JavaScript
import netteForms from 'nette-forms';
import naja from 'naja';
// Initialise votre application
netteForms.initOnLoad();
naja.initialize();
Dans le template, vous pouvez insérer un point d'entrée comme suit :
{asset 'app.js'}
Nette Assets génère automatiquement toutes les balises HTML nécessaires – JavaScript, CSS et toutes les autres dépendances.
Points d'entrée multiples
Les applications plus grandes ont souvent besoin de points d'entrée séparés :
export default defineConfig({
plugins: [
nette({
entry: [
'app.js', // pages publiques
'admin.js', // panneau d'administration
],
}),
],
});
Utilisez-les dans différents templates :
{* Dans les pages publiques *}
{asset 'app.js'}
{* Dans le panneau d'administration *}
{asset 'admin.js'}
Important : Fichiers source vs compilés
Il est crucial de comprendre qu'en production, vous ne pouvez charger que :
- Les points d'entrée définis dans
entry
- Les fichiers du répertoire
assets/public/
Vous ne pouvez pas charger en utilisant {asset}
des fichiers arbitraires depuis assets/
–
seulement les assets référencés par des fichiers JavaScript ou CSS. Si votre fichier n'est référencé nulle part, il ne sera
pas compilé. Si vous voulez que Vite soit conscient d'autres assets, vous pouvez les déplacer vers le dossier public.
Veuillez noter que par défaut, Vite intégrera tous les assets de moins de 4 Ko, vous ne pourrez donc pas référencer ces fichiers directement. (Voir la documentation Vite).
{* ✓ Cela fonctionne - c'est un point d'entrée *}
{asset 'app.js'}
{* ✓ Cela fonctionne - c'est dans assets/public/ *}
{asset 'favicon.ico'}
{* ✗ Cela ne fonctionnera pas - fichier aléatoire dans assets/ *}
{asset 'components/button.js'}
Mode développement
Le mode développement est entièrement optionnel mais offre des avantages significatifs lorsqu'il est activé. Le principal avantage est le Hot Module Replacement (HMR) – voyez les changements instantanément sans perdre l'état de l'application, rendant l'expérience de développement beaucoup plus fluide et rapide.
Vite est un outil de build moderne qui rend le développement incroyablement rapide. Contrairement aux bundlers traditionnels, Vite sert votre code directement au navigateur pendant le développement, ce qui signifie un démarrage instantané du serveur quelle que soit la taille de votre projet et des mises à jour ultra-rapides.
Démarrage du serveur de développement
Lancez le serveur de développement :
npm run dev
Vous verrez :
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
Gardez ce terminal ouvert pendant le développement.
Le plugin Nette Vite détecte automatiquement quand :
- Le serveur de développement Vite est en cours d'exécution
- Votre application Nette est en mode débogage
Lorsque ces deux conditions sont remplies, Nette Assets charge les fichiers depuis le serveur de développement Vite au lieu du répertoire compilé :
{asset 'app.js'}
{* En développement : <script src="http://localhost:5173/app.js" type="module"></script> *}
{* En production : <script src="/assets/app-4a8f9c7.js" type="module"></script> *}
Aucune configuration nécessaire – ça marche tout seul !
Travailler sur différents domaines
Si votre serveur de développement s'exécute sur autre chose que localhost
(comme myapp.local
), vous
pourriez rencontrer des problèmes de CORS (Cross-Origin Resource Sharing). CORS est une fonctionnalité de sécurité des
navigateurs web qui bloque par défaut les requêtes entre différents domaines. Lorsque votre application PHP s'exécute sur
myapp.local
mais que Vite s'exécute sur localhost:5173
, le navigateur les considère comme des domaines
différents et bloque les requêtes.
Vous avez deux options pour résoudre ce problème :
Option 1 : Configurer CORS
La solution la plus simple est d'autoriser les requêtes cross-origin depuis votre application PHP :
export default defineConfig({
// ... autre configuration ...
server: {
cors: {
origin: 'http://myapp.local', // l'URL de votre application PHP
},
},
});
Option 2 : Exécuter Vite sur votre domaine
L'autre solution est de faire en sorte que Vite s'exécute sur le même domaine que votre application PHP.
export default defineConfig({
// ... autre configuration ...
server: {
host: 'myapp.local', // le même que votre application PHP
},
});
En fait, même dans ce cas, vous devez configurer CORS car le serveur de développement s'exécute sur le même nom d'hôte mais sur un port différent. Cependant, dans ce cas, CORS est automatiquement configuré par le plugin Nette Vite.
Développement HTTPS
Si vous développez en HTTPS, vous avez besoin de certificats pour votre serveur de développement Vite. Le moyen le plus simple est d'utiliser un plugin qui génère automatiquement des certificats :
npm install -D vite-plugin-mkcert
Voici comment le configurer dans vite.config.ts
:
import mkcert from 'vite-plugin-mkcert';
export default defineConfig({
// ... autre configuration ...
plugins: [
mkcert(), // génère automatiquement des certificats et active https
nette(),
],
});
Notez que si vous utilisez la configuration CORS (Option 1 ci-dessus), vous devez mettre à jour l'URL d'origine pour utiliser
https://
au lieu de http://
.
Builds de production
Créez des fichiers de production optimisés :
npm run build
Vite va :
- Minifier tout le JavaScript et le CSS
- Diviser le code en morceaux optimaux
- Générer des noms de fichiers hachés pour le cache-busting
- Créer un fichier manifest pour Nette Assets
Exemple de sortie :
www/assets/
├── app-4f3a2b1c.js # Votre JavaScript principal (minifié)
├── app-7d8e9f2a.css # CSS extrait (minifié)
├── vendor-8c4b5e6d.js # Dépendances partagées
└── .vite/
└── manifest.json # Mappage pour Nette Assets
Les noms de fichiers hachés garantissent que les navigateurs chargent toujours la dernière version.
Dossier public
Les fichiers du répertoire assets/public/
sont copiés dans la sortie sans traitement :
assets/
├── public/
│ ├── favicon.ico
│ ├── robots.txt
│ └── images/
│ └── og-image.jpg
├── app.js
└── style.css
Référencez-les normalement :
{* Ces fichiers sont copiés tels quels *}
<link rel="icon" href={asset 'favicon.ico'}>
<meta property="og:image" content={asset 'images/og-image.jpg'}>
Pour les fichiers publics, vous pouvez utiliser les fonctionnalités de FilesystemMapper :
assets:
mapping:
default:
type: vite
path: assets
extension: [webp, jpg, png] # Essayer WebP en premier
versioning: true # Ajouter le cache-busting
Dans la configuration vite.config.ts
, vous pouvez modifier le dossier public en utilisant l'option
publicDir
.
Imports dynamiques
Vite divise automatiquement le code pour un chargement optimal. Les imports dynamiques vous permettent de charger du code uniquement lorsqu'il est réellement nécessaire, réduisant ainsi la taille initiale du bundle :
// Charge les composants lourds à la demande
button.addEventListener('click', async () => {
let { Chart } = await import('./components/chart.js')
new Chart(data)
})
Les imports dynamiques créent des chunks séparés qui ne sont chargés que lorsque nécessaire. C'est ce qu'on appelle le “code splitting” et c'est l'une des fonctionnalités les plus puissantes de Vite. Lorsque vous utilisez des imports dynamiques, Vite crée automatiquement des fichiers JavaScript séparés pour chaque module importé dynamiquement.
La balise {asset 'app.js'}
ne précharge pas automatiquement ces chunks dynamiques. C'est un comportement
intentionnel – nous ne voulons pas télécharger du code qui pourrait ne jamais être utilisé. Les chunks ne sont
téléchargés que lorsque l'import dynamique est exécuté.
Cependant, si vous savez que certains imports dynamiques sont critiques et seront nécessaires bientôt, vous pouvez les précharger :
{* Point d'entrée principal *}
{asset 'app.js'}
{* Précharge les imports dynamiques critiques *}
{preload 'components/chart.js'}
Cela indique au navigateur de télécharger le composant de graphique en arrière-plan, afin qu'il soit prêt immédiatement lorsque nécessaire.
Support TypeScript
TypeScript fonctionne dès la première utilisation :
// assets/main.ts
interface User {
name: string
email: string
}
export function greetUser(user: User): void {
console.log(`Hello, ${user.name}!`)
}
Référencez les fichiers TypeScript normalement :
{asset 'main.ts'}
Pour un support TypeScript complet, installez-le :
npm install -D typescript
Configuration Vite additionnelle
Voici quelques options de configuration Vite utiles avec des explications détaillées :
export default defineConfig({
// Répertoire racine contenant les assets source
root: 'assets',
// Dossier dont le contenu est copié dans le répertoire de sortie tel quel
// Par défaut : 'public' (relatif à 'root')
publicDir: 'public',
build: {
// Où placer les fichiers compilés (relatif à 'root')
outDir: '../www/assets',
// Vider le répertoire de sortie avant la construction ?
// Utile pour supprimer les anciens fichiers des builds précédentes
emptyOutDir: true,
// Sous-répertoire dans outDir pour les chunks et assets générés
// Cela aide à organiser la structure de sortie
assetsDir: 'static',
rollupOptions: {
// Point(s) d'entrée - peut être un seul fichier ou un tableau de fichiers
// Chaque point d'entrée devient un bundle séparé
input: [
'app.js', // application principale
'admin.js', // panneau d'administration
],
},
},
server: {
// Hôte sur lequel lier le serveur de développement
// Utilisez '0.0.0.0' pour exposer au réseau
host: 'localhost',
// Port pour le serveur de développement
port: 5173,
// Configuration CORS pour les requêtes cross-origin
cors: {
origin: 'http://myapp.local',
},
},
css: {
// Activer les source maps CSS en développement
devSourcemap: true,
},
plugins: [
nette(),
],
});
C'est tout ! Vous avez maintenant un système de build moderne intégré à Nette Assets.