Vite est notre outil de compilation/bundler permettant de profiter du HMR (Hot Module Reloading), de Sass, d'une compilation, etc.
Quand appliquer ce starter Vite ?
- Pour tous nos sites statiques.
- Pour les projets Vue/Nuxt : Vite y est déjà intégré, ce starter décrit nos adaptations spécifiques.
- Pas pour les projets WordPress : on utilise déjà Vite dans notre workflow kiwiplate.
Organisation des dossiers et fichiers
L'organisation des dossiers et sous-dossiers est à la libre appréciation de chacun mais il est conseillé d'adopter cette structure :
├── index.html
├── main.js
├── package.json
├── pnpm-lock.yaml
├── .eslintrc.cjs
├── .gitignore
├── assets
│ └── css
│ ├── _reset.scss
│ ├── fonts.scss
│ └── style.scss
├── public
│ ├── fonts
│ ├── img
│ └── ...
├── .dockerignore
├── docker-compose.yml
├── Dockerfile
└── README.md
Initialisation de projet
- Suivre les étapes décrites dans le fichier
project-init
concernant les configurations des fichiers linters, readme, gitignore, reset CSS, etc.
Exemples de fichiers
main.js
import './assets/css/_reset.scss'
import './assets/css/fonts.scss'
import './assets/css/style.scss'
index.html
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Le titre</title>
</head>
<body>
...
<script type="module" src="/main.js"></script>
</body>
</html>
.gitignore et .dockerignore
node_modules
dist
.DS_Store
# etc. voir https://mrkandreev.name/snippets/gitignore-generator/
Dockerfile
FROM node:20-slim
WORKDIR /usr/src/app
RUN corepack enable && corepack prepare pnpm@latest --activate
COPY . .
RUN pnpm install
RUN pnpm build
CMD [ "pnpm", "preview", "--host" ]
docker-compose.yml
services:
web:
container_name: projet-web
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
#ports:
# - "3000:4173"
labels:
- "traefik.enable=true"
- "traefik.http.routers.client-projet.rule=Host(`projet.client.alsacreations.net`)"
- "traefik.http.routers.client-projet.entrypoints=web,websecure" # ou juste web (sans https)
- "traefik.http.services.client-projet.loadbalancer.server.port=4173" # Port interne différent de 80
networks:
- web-network
networks:
web-network:
external: true
name: traefik-network
package.json (exemple approximatif)
{
"name": "nom-projet",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.4.0",
"eslint": "^8.49.0",
"eslint-config-alsacreations": "^1.4.0",
"sass": "^1.68.0",
"vite": "^4.4.9"
}
}
Astro (optionnel)
pnpm create astro@latest
vite.config
Exemple plus complexe commenté avec explications, voir aussi https://vitejs.dev/guide/build.html
import dotenv from 'dotenv'
import { defineConfig } from 'vite'
dotenv.config()
export default defineConfig(({ command }) => ({
// Chemin remplacé dans les ressources compilées
// (correspond au chemin public http vers le dossier contenant assetsDir)
// base: command === 'build' ? `/themes/${process.env.WP_THEME}/assets/` : '/',
// Dossier dans lequel on place les ressources statiques non compilées, qui seront copiées vers outDir
publicDir: 'resources/static',
build: {
outDir: `dist`, // Dossier destination du build
assetsDir: 'assets', // Sous-dossier dans lequel placer les assets (js, css) générés par Vite
emptyOutDir: true, // Vide le dossier destination à chaque build
manifest: true, // Génère un manifeste json listant les chemins vers les assets
rollupOptions: {
input: {
index: resolve(__dirname, 'index.html'), // Point d'entrée HTML
// index: 'main.js', // Point d'entrée JS, important les assets
// custom: 'resources/scripts/burger-menu.js',
},
},
sourcemap: command === 'serve' ? 'inline' : false,
},
css: {
devSourcemap: command === 'serve',
},
server: {
// origin: 'http://localhost:5173',
}
}))
[!TIP] Pour exploiter le mode
dev
de Vite et bénéficier du _hot modulereloading, il conviendra d'injecter dans la page (par exemple dans un thème WordPress) :<script src="http://localhost:5173/@vite/client" type="module"></script> <script src="http://localhost:5173/main.js" type="module"></script>