https://tssr.nolan.ovh by Flo.
#16/05/2025

ViteJS backend integration et PHP

Introduction

Cet article aborde comment utiliser ViteJS avec une solution fais maison en php, soit du Backend Intégration.

J'avais déjà écris un article à ce sujet en 2024. Aujourd'hui j'ajoute une brique supplémentaire le SSL.

Quand on DEV en local, on est souvent sur du localhost. Mais de plus en plus, j'utilise https en local pour le dev. également.

Environnement

Je dev. sous Windows 10, j'utilise Nginx en tant que serveur http. Pour le SSL, je suis passé d'une simple commande openssl à mkcert afin que la solution soit compatible avec le client http FireFox.
J'ai également NodeJS pour l'utilisation de viteJS.

Je ne détaillerai pas ici, comment modifier la variable PATH ou encore l'édition du fichier HOST. N'y même l'installation d'engine-X. Idem pour NodeJS qui est facilement installable sous Windows.

La structure

Le backend integration étant pour des solutions "particulières" c'est à vous de décider de la meilleurs structure de dossiers à adopter en fonction de votre projet.

Personnellement, j'ai un dossier vitejs dans lequel j'y place tous les fichiers liés à viteJs.

Installation de ViteJS

Perso, je l'installe souvent pour personnaliser bootstrapCSS. Dans le répertoire vitejs, j'execute la commande suivante:

# initialiser un projet NodeJS
npm init -y

# installation de: vitejs, sass, de bootstrap et de ses icons
npm install -D vite sass && npm install --save bootstrap @popperjs/core bootstrap-icons

Je me retrouve avec la structure suivante:

vitejs/
├── node_modules/
├── package-lock.json
└── package.json

Nos fichiers pour réaliser le frontend

Personnellement, je créer un dossier src dans lequel je créer des sous-dossiers pour chaque "theme"/"template" que je souhaite créer. Ici, pour l'exemple on va prendre "galaxy" comme nom de template.

Je ne reviens pas sur le fonctionnement de ViteJS, mais en gros on se sert d'un fichier main.js comme point d'entrée pour charger les différents fichiers, que ce soit du scss, du css ou du js.

Ici, on va faire simple, on va se contenter d'un fichier main.js qui charge un fichier main.css dans lequel on changera uniquement la couleur de fond de notre page, histoire de voir si ça fonctionne.

La structure est la suivante:

vitejs/
├── node_modules/
├── src/
│   └── galaxy/    
│       ├── main.css
│       └── main.js
├── package-lock.json
└── package.json

Contenu du fichier main.css

body{
  background-color: rgb(131, 154, 255);
}

Peu importe la couleur de fond de page, le but sera de changer en direct afin de voir sir le hot reload fonctionne.

Contenu du fichier main.js

// Import all of Bootstrap's JS
import * as bootstrap from 'bootstrap'

import "./main.css"

Notre certificat SSL auto-signé

De base j'opéré via une simple commande openSSL. Mais cela ne passe pas avec Firefox. Il est assez stricte et refusera d'établir la connexion avec le web socket pourtant nécessaire pour le hotreload. En effet, ce dernier renvoie une erreur MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY.

Afin d'éviter cela, il est nécessaire d'ajouter notre propre autorité de certification dans le navigateur. Grâce à mkcert, cela se réalise facilement.

├── Télécharger et installer mkcert

Étant sous Windows je télécharge l'executable pour l’Architecture amd64 ( lien des releases).

Placer l'exécutable où bon vous semble, veuillez noter toutefois l'emplacement pour retrouver les certificats qui seront générés par la suite.

Via une console placer vous à la racine de ce dernier est exécuter la commande d'installation:
mkcert -install

Par la même occasion on va générer les certificats pour notre nom de domaine en local (ex: 'mon-site.local'):
mkcert mon-site.local

Cela génère deux fichiers mon-site.local.pem et mon-site.local-key.pem.

└── Ajout d'une autorité de certification dans Firefox

Rendez-vous sur about:preferences#privacy (dans la barre d'url)
Descendez jusqu'à la section "Sécurité" puis la section "Certificats", cliquer sur le bouton "A les certificats..."

...
Afficher les certificats sous Firefox

Cliquez sur l'onglet "Autorités" et cliquer sur le bouton (en bas) "Importer..."

...
Importer une CA sous Firefox

Le CA au niveau du disque dur, se trouve normalement ici: %LOCALAPPDATA%\mkcert

Configuration de ViteJS

├── package.json

On va ajouter deux petites commandes. La première npm run dev qui permet de lancer le serveur local pour ViteJS. Et la deuxième npm run build, qui permettra de builder nos assets.

On va éditer le fichier package.json en ajoutant ces deux lignes (en vert):

[...]

  scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "vite",
    "build": "vite build"
  },

[...]

└── vite.config.mjs

On créer ensuite notre fichier vite.config.mjs:

vitejs/
├── node_modules/
├── src/
│   └── galaxy/    
│       ├── main.css
│       └── main.js
├── package-lock.json
├── package.json
└── vite.config.mjs

Le contenu (à adapter):

import { defineConfig } from "vite"
import fs from 'fs'

export default defineConfig({
    base: './',
    server:{
        host: 'mon-site.local', 
        port: '5173',
        origin: 'https://mon-site.local',
        allowedHosts: ['mon-site.local'], 
        https: {
          key: fs.readFileSync('C:/_chemin_vers_la_clé_privée/mon-site.local-key.pem'),
          cert: fs.readFileSync('C:/chemin_vers_le_certificat/mon-site.local.pem'),
        },
        hmr: {
          clientPort: 5111,
          protocol: 'wss',
          host: 'mon-site.local',
      }
    },
    build: {
      copyPublicDir:false,
      outDir: 'public/assets/galaxy',
      assetsDir:'',
      emptyOutDir: true,
      manifest: true,
      rollupOptions: {
        input: 'src/galaxy/main.js',
      },
    },
  }) 

On indique à ViteJS d'utiliser notre nom de domaine, on lui indique un port (ici 5173).
La section hrm (Hot Module Replacement) concerne le hot reload et le websocket utilisé, on indique ici le port 5111

Comme on se sert Nginx pour gérer les requêtes, on s'en servira en tant que proxy reverse pour faire le relai avec le serveur de ViteJS.

Nginx, configurer le Virtual Host

Au niveau Nginx, vous êtes libre au niveau de l'organisation des fichiers. Voici un exemple de configuration. Ici, je redirige en plus toutes les requêtes http vers un fichier index.php sauf pour les requêtes en rapport avec ViteJS évidemment.
On a également une section pour le websocket.

server {
    listen       80;
    server_name  mon-site.local;
    return       301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    #http2 on;
    server_name  mon-site.local;

    ssl_certificate     C:/chemin_vers_le_certificat/mon-site.local.pem;
    ssl_certificate_key C:/_chemin_vers_la_clé_privée/mon-site.local.pem;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    root   C:\chemin_vers_votre_projet;
    index   index.php index.html;

    
    location ~ ^/(src/galaxy|node_modules|@vite/client) {
        proxy_pass https://mon-site.local:5173$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9083;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

server {
    listen 5111 ssl;
    server_name mon-site.local;
    ssl_certificate     C:/chemin_vers_le_certificat/mon-site.local.pem;
    ssl_certificate_key C:/_chemin_vers_la_clé_privée/mon-site.local-key.pem;

    location / {
        proxy_pass https://mon-site.local:5173;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ici, on peut peut être faire mieux? En gros, j'ai debug et adapté la configuration au fur et à mesure.

Du coté de php

Du coté de php, dans votre "template", ou votre "vue" pour utiliser le hot reload dans la partie head de votre page indiqué:

<script src="https://mon-site.local/@vite/client" type="module"></script>
<script src="https://mon-site.local/src/galaxy/main.js" type="module"></script>

Dans l'idéal implémentez une logique applicative pour vous générer ça "automatiquement".

Et voilà, un petit coup de npm run dev, rendez-vous sur mon-site.local, modifier votre fichier main.css, les modifications sont chargées automatiquement.

Une fois satisfait du front-end, on build les assets: npm run build.
ViteJS va générer un fichier manifest.json contenant les infos sur les assets.
Il suffit de lire de se fichier et de générer dans la partie head de votre template/vue le code html suivant:

<script src="https://mon-site.local/assets/galaxy/main-W-aVqPqS.js" type="module"></script>
<link rel="stylesheet" href="https://mon-site.local/assets/galaxy/main-MT0pGFt3.css">

Pour la lecture du fichier Json, pas de difficultés particulières, au pire l'IA peut vous montrer le chemin.


Ressources utilisées: