Skip to content

Comment fonctionne le plugin vite 🔍 ​

le rôle principal du plugin est de produire un fichier entrypoints.json à partir des points d'entrée configurés dans le fichier vite.config.js.

js
export default defineConfig({
  plugins: [
    symfonyPlugin(),
  ],
  build: {
    manifest: true,
    rollupOptions: {
      input: {
        "app": "./assets/app.js",
        "theme": "./assets/theme.scss"
      }
    },
  },
});
export default defineConfig({
  plugins: [
    symfonyPlugin(),
  ],
  build: {
    manifest: true,
    rollupOptions: {
      input: {
        "app": "./assets/app.js",
        "theme": "./assets/theme.scss"
      }
    },
  },
});

Le contenu de ce fichier sera différent en fonction du contexte d'utilisation. Lorsque le serveur de développement de Vite est à l'écoute, les points d'entrée feront référence à des URL vers le serveur de Vite. Par contre à la suite d'une commande de build, les points d'entrée feront référence à des fichiers existants.

json
{
  "isProd": false,
  "viteServer": {
    "origin": "http://[::1]:5173",
    "base": "/build/"
  },
  "entryPoints": {
    "app": {
      "js": [
        "http://[::1]:5173/build/src/app.ts"
      ]
    },
    "theme": {
      "css": [
        "http://[::1]:5174/build/assets/theme.scss"
      ]
    }

  },
  "legacy": false
}
{
  "isProd": false,
  "viteServer": {
    "origin": "http://[::1]:5173",
    "base": "/build/"
  },
  "entryPoints": {
    "app": {
      "js": [
        "http://[::1]:5173/build/src/app.ts"
      ]
    },
    "theme": {
      "css": [
        "http://[::1]:5174/build/assets/theme.scss"
      ]
    }

  },
  "legacy": false
}
json
{
  "entryPoints": {
    "app": {
      "assets": [],
      "css": [
        "/build/assets/app-3443e464.css"
      ],
      "js": [
        "/build/assets/app-6f6529cf.js"
      ],
      "legacy": false,
      "preload": []
    },
    "theme": {
      "assets": [],
      "css": [
        "/build/assets/theme-40a4bec9.css"
      ],
      "js": [],
      "legacy": false,
      "preload": []
    }
  },
  "isProd": true,
  "legacy": false,
  "viteServer": false
}
{
  "entryPoints": {
    "app": {
      "assets": [],
      "css": [
        "/build/assets/app-3443e464.css"
      ],
      "js": [
        "/build/assets/app-6f6529cf.js"
      ],
      "legacy": false,
      "preload": []
    },
    "theme": {
      "assets": [],
      "css": [
        "/build/assets/theme-40a4bec9.css"
      ],
      "js": [],
      "legacy": false,
      "preload": []
    }
  },
  "isProd": true,
  "legacy": false,
  "viteServer": false
}

Il existe 2 types de points d'entrée :

  • Ceux qui mĂŞlent js et css : toutes les informations sont facilement rĂ©cupĂ©rables en ajoutant un callback sur generateBundle. Le point d'entrĂ©e est matĂ©rialisĂ© par un objet de type OutputChunk. Voici comment sont rĂ©cupĂ©rĂ©s les Ă©lĂ©ments.
    • assets : viteMetadata.importedAssets
    • css : viteMetadata.importedCss
    • imports : imports
    • preload : dynamicImports
  • Ceux qui ne contiennent que du css et sont considĂ©rĂ©s comme css purs (voir plugin vite:css-post). Le point d'entrĂ©e n'apparaĂ®t pas dans le hook generateBundle. il est Ă©mis en tant que OutputAsset et ne possède pas de propriĂ©tĂ© facadeModuleId. Il faut donc rĂ©cupĂ©rer cette correspondance chunk.facadeModuleId <-> chunk.viteMetadata.importedCss dans le hook renderChunk.

Comment fonctionne ce bundle ​

twig
{% block stylesheets %}
    {{ vite_entry_link_tags('app') }}
{% endblock %}

{% block javascripts %}
    {{ vite_entry_script_tags('app') }}
{% endblock %}
{% block stylesheets %}
    {{ vite_entry_link_tags('app') }}
{% endblock %}

{% block javascripts %}
    {{ vite_entry_script_tags('app') }}
{% endblock %}

rendrait en développement:

html
<!--Nothing with vite_entry_link_tags('app') -->

<!-- vite_entry_script_tags('app') -->
<script src="http://localhost:5173/build/@vite/client" type="module"></script>
<script src="http://localhost:5173/build/app.js" type="module"></script>
<!--Nothing with vite_entry_link_tags('app') -->

<!-- vite_entry_script_tags('app') -->
<script src="http://localhost:5173/build/@vite/client" type="module"></script>
<script src="http://localhost:5173/build/app.js" type="module"></script>

rendrait en production :

html
<!-- vite_entry_link_tags('app') -->
<link rel="stylesheet" href="/build/app.[hash].css" />
<link rel="modulepreload" href="/build/vendor.[hash].js" />

<!-- vite_entry_script_tags('app') -->
<script src="/build/app.[hash].js" type="module"></script>
<!-- vite_entry_link_tags('app') -->
<link rel="stylesheet" href="/build/app.[hash].css" />
<link rel="modulepreload" href="/build/vendor.[hash].js" />

<!-- vite_entry_script_tags('app') -->
<script src="/build/app.[hash].js" type="module"></script>

Dans un environnement de développement, le bundle agit également comme un proxy en transférant les requêtes qui ne lui sont pas destinées au serveur de développement Vite.

Publié sous la licence MIT.