llustration 3D représentant le développement d’un Web Component avec SvelteKit, incluant une interface de code, des composants UI et des outils de développement dans un environnement moderne

Publié le 24 mars 2026

Mis à jour le 25 mars 2026

Créer un Web Component avec SvelteKit : Guide complet étape par étape

Créer un Web Component avec SvelteKit

Dans cet article, nous allons voir comment créer un Web Component avec SvelteKit, le compiler (build), puis l’intégrer facilement dans n’importe quel projet : WordPress, Shopify, Next.js ou même en JavaScript vanilla.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Créer un projet SvelteKit pour un Web Component

Pour créer un Web Component avec SvelteKit, commencez par initialiser un nouveau projet :

npx sv create example-webcomponent
cd example-webcomponent
npm run dev

Configuration du projet

Lors de l’installation, sélectionnez les options suivantes :

  • SvelteKit minimal
  • TypeScript
  • Prettier et ESLint (recommandé)
  • npm

Lancer le projet en local

Une fois l’installation terminée, ouvrez votre navigateur à l’adresse suivante :

http://localhost:5173/

Si la page s’affiche correctement, votre projet SvelteKit est prêt à être utilisé pour créer un Web Component.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Installer SCSS dans SvelteKit

Pour utiliser SCSS dans votre projet SvelteKit, vous devez installer le compilateur Sass en tant que dépendance de développement :

npm install -D sass-embedded

Une fois installé, SvelteKit détectera automatiquement SCSS dans vos fichiers .svelte via les balises <style lang="scss">.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Créer un Web Component avec SvelteKit

Nous allons maintenant créer notre premier Web Component avec SvelteKit. Pour cela, créez un fichier dans le dossier src/lib :

touch src/lib/my-web-component.svelte

Ajoutez ensuite le code suivant :

<svelte:options customElement="my-web-component" />

<script lang="ts">
</script>

<p>Hello World</p>

<style lang="scss">
  p {
    color: red;
  }
</style>

👉 L’attribut customElement="my-web-component" définit le nom de votre Web Component. Ce nom doit obligatoirement contenir un tiret (ex : my-component) pour être valide en HTML.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Configurer SvelteKit pour les Web Components

Pour activer la création de Web Components avec SvelteKit, vous devez modifier le fichier svelte.config.js et activer l’option customElement.

Ajoutez la configuration suivante :

compilerOptions: {
  customElement: true
}

Voici un exemple complet de configuration :

import adapter from '@sveltejs/adapter-static';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  kit: {
    adapter: adapter()
  },
  vitePlugin: {
    dynamicCompileOptions: ({ filename }) =>
      filename.includes('node_modules') ? undefined : { runes: true }
  },
  compilerOptions: {
    customElement: true
  }
};

export default config;

👉 L’option customElement: true permet à SvelteKit de compiler vos composants en Web Components natifs utilisables dans n’importe quel environnement.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Configurer le build du Web Component avec Vite

Pour générer un Web Component réutilisable, vous devez configurer un build spécifique avec Vite. Cela permet d’exporter votre composant sous forme de fichier JavaScript utilisable dans n’importe quel projet.

Créez un fichier de configuration dédié :

touch vite.config.webcomponent.js

Ajoutez la configuration suivante :

import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import { name, version } from './package.json';

export default defineConfig({
  plugins: [svelte()],
  publicDir: 'playground',
  build: {
    lib: {
      entry: './src/lib/my-web-component.svelte',
      fileName: `${name}-${version}`,
      name,
      formats: ['es']
    },
    outDir: 'static/webcomponent',
    minify: 'esbuild'
  }
});

Ajouter le script de build

Ajoutez le script suivant dans votre fichier package.json :

"build:wc": "vite build -c vite.config.webcomponent.js"

Vous pourrez ensuite générer votre Web Component avec la commande :

npm run build:wc

Activez les cookies publicitaires pour accéder à cet article sans flou.

Tester le Web Component dans SvelteKit

Une fois le build généré, vous pouvez tester votre Web Component directement dans votre projet SvelteKit.

Importer le script

Dans le fichier +page.svelte, ajoutez le script généré dans la balise <svelte:head> :

<svelte:head>
  <script type="module" src="/webcomponent/example-webcomponent-0.0.1.js"></script>
</svelte:head>

Utiliser le Web Component

Ajoutez ensuite votre composant dans le template :

<my-web-component></my-web-component>

Exemple complet

<svelte:head>
  <script type="module" src="/webcomponent/example-webcomponent-0.0.1.js"></script>
</svelte:head>

<h1>Welcome to SvelteKit</h1>
<p>
  Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation
</p>

<my-web-component></my-web-component>

Lancer le projet

Exécutez les commandes suivantes :

npm run build:wc
npm run dev

Si tout est correctement configuré, votre Web Component devrait s’afficher dans la page.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Ajouter des propriétés (props) à un Web Component SvelteKit

Vous pouvez rendre votre Web Component dynamique en lui passant des propriétés (props).

Définir une prop dans le composant

Dans votre fichier my-web-component.svelte :

let { name = 'World' } = $props();

Utiliser la prop dans le template

<p>Hello {name}</p>

Composant complet

<svelte:options customElement="my-web-component" />

<script lang="ts">
  let { name = 'World' } = $props();
</script>

<p>Hello {name}</p>

<style lang="scss">
  p {
    color: red;
  }
</style>

Utiliser la prop dans le HTML

Vous pouvez maintenant passer une valeur directement depuis le HTML :

<my-web-component name="Bryan"></my-web-component>

👉 Le texte affiché sera alors : Hello Bryan

Activez les cookies publicitaires pour accéder à cet article sans flou.

Exposer des méthodes JavaScript (API) dans un Web Component

Vous pouvez exposer des méthodes JavaScript pour interagir avec votre Web Component depuis l’extérieur (JavaScript, framework, ou HTML).

Dans cet exemple, nous allons créer un getter et un setter pour manipuler la propriété name.

Créer les méthodes

const getName = (): string => {
  return name;
};

const setName = (newName: string) => {
  name = newName;
};

Exposer les méthodes via le Web Component

Utilisez $host() pour attacher les méthodes à l’élément DOM :

$effect(() => {
  const host = $host();

  Object.assign(host, {
    getName,
    setName
  });
});

Composant complet

<svelte:options customElement="my-web-component" />

<script lang="ts">
  let { name = 'World' } = $props();

  const getName = (): string => {
    return name;
  };

  const setName = (newName: string) => {
    name = newName;
  };

  $effect(() => {
    const host = $host();

    Object.assign(host, {
      getName,
      setName
    });
  });
</script>

<p>Hello {name}</p>

<style lang="scss">
  p {
    color: red;
  }
</style>

Utiliser les méthodes depuis JavaScript

Vous pouvez maintenant interagir avec votre Web Component depuis un script externe :

const el = document.querySelector('my-web-component');

// Modifier la valeur
el.setName('Bryan');

// Récupérer la valeur
console.log(el.getName());

👉 Cette approche permet de créer une véritable API JavaScript pour votre Web Component.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Interagir avec un Web Component depuis SvelteKit

Vous pouvez interagir directement avec votre Web Component depuis SvelteKit en accédant à ses méthodes via une référence JavaScript.

Déclarer une référence vers le composant

let wc: HTMLElement;

Lier le Web Component

Utilisez bind:this pour récupérer une référence vers le composant :

<my-web-component bind:this={wc} name="User"></my-web-component>

Ajouter un typage TypeScript (recommandé)

Pour éviter les erreurs dans votre IDE, vous pouvez typer les méthodes exposées :

let wc: HTMLElement & {
  getName: () => string;
  setName: (newName: string) => void;
};

Interagir avec le composant

Vous pouvez ensuite appeler les méthodes dans le cycle de vie onMount :

import { onMount } from 'svelte';

onMount(() => {
  console.log('Current Name:', wc.getName());

  setTimeout(() => {
    console.log('== Change Name ==');
    wc.setName('Admin');
    console.log('Current Name:', wc.getName());
  }, 1000);
});

Exemple complet

<script lang="ts">
  import { onMount } from 'svelte';

  let wc: HTMLElement & {
    getName: () => string;
    setName: (newName: string) => void;
  };

  onMount(() => {
    console.log('Current Name:', wc.getName());

    setTimeout(() => {
      console.log('== Change Name ==');
      wc.setName('Admin');
      console.log('Current Name:', wc.getName());
    }, 1000);
  });
</script>

<svelte:head>
  <script type="module" src="/webcomponent/example-webcomponent-0.0.1.js"></script>
</svelte:head>

<h1>Welcome to SvelteKit</h1>
<p>
  Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation
</p>

<my-web-component bind:this={wc} name="User"></my-web-component>

Résultat dans la console

Current Name: User
== Change Name ==
Current Name: Admin

👉 Le Web Component est mis à jour dynamiquement, et les changements sont visibles à la fois dans le DOM et dans la console.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Utiliser les slots dans un Web Component SvelteKit

Les slots permettent d’injecter du contenu HTML depuis l’extérieur dans votre Web Component. C’est essentiel pour rendre votre composant flexible et réutilisable.

Ajouter un slot dans le composant

Dans votre fichier my-web-component.svelte, ajoutez simplement :

<slot />

Modifier le template

Par exemple, remplacez :

<p>Hello {name}</p>

Par :

<p>Before Hello {name}</p>
<slot />
<p>After Hello {name}</p>

Composant complet

<svelte:options customElement="my-web-component" />

<script lang="ts">
  let { name = 'World' } = $props();

  const getName = (): string => {
    return name;
  };

  const setName = (newName: string) => {
    name = newName;
  };

  $effect(() => {
    const host = $host();

    Object.assign(host, {
      getName,
      setName
    });
  });
</script>

<p>Before Hello {name}</p>
<slot />
<p>After Hello {name}</p>

<style lang="scss">
  p {
    color: red;
  }
</style>

Passer du contenu depuis la page SvelteKit

Vous pouvez maintenant injecter du contenu directement dans votre Web Component :

<my-web-component bind:this={wc} name="User">
  <p>New content</p>
</my-web-component>

Exemple complet dans SvelteKit

<script lang="ts">
  import { onMount } from 'svelte';

  let wc: HTMLElement & {
    getName: () => string;
    setName: (newName: string) => void;
  };

  onMount(() => {
    console.log('Current Name:', wc.getName());

    setTimeout(() => {
      console.log('== Change Name ==');
      wc.setName('Admin');
      console.log('Current Name:', wc.getName());
    }, 1000);
  });
</script>

<svelte:head>
  <script type="module" src="/webcomponent/example-webcomponent-0.0.1.js"></script>
</svelte:head>

<h1>Welcome to SvelteKit</h1>
<p>
  Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation
</p>

<my-web-component bind:this={wc} name="User">
  <p>New content</p>
</my-web-component>

👉 Le contenu passé entre les balises du Web Component sera injecté à l’emplacement du <slot />.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Ajouter une image dans un Web Component SvelteKit

Pour intégrer une image dans un Web Component avec SvelteKit, vous ne pouvez pas utiliser directement le dossier static. Vous devez importer l’image comme un module afin qu’elle soit correctement incluse dans le build.

Importer une image

Dans votre composant my-web-component.svelte :

import logo from './assets/favicon.svg';

Utiliser l’image dans le template

<img src={logo} alt="SvelteKit Logo" />

Composant complet

<svelte:options customElement="my-web-component" />

<script lang="ts">
  import logo from './assets/favicon.svg';

  let { name = 'World' } = $props();

  const getName = (): string => {
    return name;
  };

  const setName = (newName: string) => {
    name = newName;
  };

  $effect(() => {
    const host = $host();

    Object.assign(host, {
      getName,
      setName
    });
  });
</script>

<img src={logo} alt="SvelteKit Logo" />

<p>Before Hello {name}</p>
<slot />
<p>After Hello {name}</p>

<style lang="scss">
  p {
    color: red;
  }
</style>

👉 L’image sera automatiquement optimisée et incluse dans le bundle final du Web Component.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Écouter les événements d’un Web Component dans SvelteKit

Pour communiquer depuis un Web Component vers votre application, vous pouvez émettre des événements personnalisés (CustomEvent) et les écouter côté client.

Créer un événement dans le composant

Ajoutez un bouton et une fonction dans votre composant :

<button on:click={handleClick}>Test</button>
const handleClick = () => {
  const event = new CustomEvent('test', {
    detail: {
      name
    }
  });

  $host().dispatchEvent(event);
};

Créer une API pour écouter les événements

Pour simplifier l’écoute des événements, vous pouvez exposer une méthode on :

const on = (event: string, callback: Function) => {
  $host().addEventListener(event, (e: any) => callback(e.detail));
};

Exposer la méthode

$effect(() => {
  const host = $host();

  Object.assign(host, {
    getName,
    setName,
    on
  });
});

Mettre à jour le typage côté SvelteKit

let wc: HTMLElement & {
  getName: () => string;
  setName: (newName: string) => void;
  on: (event: string, callback: Function) => void;
};

Écouter l’événement dans la page

wc.on('test', (detail: { name: string }) => {
  console.log(detail);
});

Exemple complet côté SvelteKit

<script lang="ts">
  import { onMount } from 'svelte';

  let wc: HTMLElement & {
    getName: () => string;
    setName: (newName: string) => void;
    on: (event: string, callback: Function) => void;
  };

  onMount(() => {
    wc.on('test', (detail: { name: string }) => {
      console.log(detail);
    });
  });
</script>

<svelte:head>
  <script type="module" src="/webcomponent/example-webcomponent-0.0.1.js"></script>
</svelte:head>

<my-web-component bind:this={wc} name="Admin"></my-web-component>

Résultat

{ name: 'Admin' }

👉 Cette approche permet de faire communiquer votre Web Component avec n’importe quelle application via une API événementielle simple et efficace.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Conclusion

Vous savez maintenant comment créer un Web Component avec SvelteKit, le builder avec Vite et l’intégrer dans n’importe quel projet.

  • Créer un Web Component avec SvelteKit
  • Configurer et builder avec Vite
  • L’intégrer dans n’importe quel environnement (HTML, React, WordPress…)
  • Gérer les props, méthodes, slots et événements

👉 Les Web Components sont une solution puissante pour créer des widgets réutilisables, que ce soit pour un SaaS, un script embarqué (embed), ou des plugins multi-plateformes.

Grâce à SvelteKit, vous pouvez créer des composants performants, légers et totalement indépendants du framework utilisé côté client.

🚀 Vous pouvez maintenant créer vos propres widgets et les intégrer partout : landing pages, CMS, applications web ou projets clients.

Activez les cookies publicitaires pour accéder à cet article sans flou.

Aller plus loin

Vous souhaitez créer un Web Component sur mesure pour votre projet ou votre entreprise ?

Je propose des solutions personnalisées pour développer des widgets performants, intégrables sur n’importe quelle plateforme (WordPress, Shopify, SaaS…).

Photo de profil de Bryan Ledda développeur web et mobile spécialisé en iOS, SvelteKit et intelligence artificielle

Article écrit par Bryan Ledda – Développeur Web & Mobile

Nous utilisons des cookies pour améliorer votre expérience, analyser le trafic et sécuriser le site avec Google reCAPTCHA.
Vous pouvez accepter tous les cookies ou gérer vos préférences.

En savoir plus sur notre .

Vos préférences de cookies

Vous pouvez activer ou désactiver chaque catégorie :

  • Sécurité

  • Analytique

  • Publicité

Politique de confidentialité

Nous attachons une grande importance à la protection de vos données personnelles. Cette politique explique quelles données nous collectons, pourquoi et comment nous les utilisons, ainsi que vos droits concernant ces données.

  • Données collectées

    • Cookies de fonctionnement et sécurité : nécessaires pour sécuriser le site (reCAPTCHA).

    • Cookies d’analyse : utilisés pour mesurer l’audience et améliorer le site (Google Analytics).

    • Données techniques : adresse IP, type de navigateur, pagesvisitées, durée de visite.

  • Finalité

    Les données collectées nous permettent de :

    • Assurer la sécurité du site et prévenir les abus (reCAPTCHA).

    • Analyser et améliorer l’expérience utilisateur (Google Analytics).

  • Base légale

    • Cookies obligatoires : nécessaires au fonctionnement du site.

    • Cookies d’analyse : soumis à votre consentement explicite.

  • Partage des données Nous ne partageons pas vos données avec des tiers à l’exception des prestataires nécessaires au fonctionnement ou à l’analyse (ex : Google).

  • Durée de conservation Les données collectées via les cookies sont conservées pendant la durée maximale autorisée par le fournisseur (ex : Google Analytics 14 mois).

  • Vos droits

    Vous pouvez à tout moment :

    • Refuser ou retirer votre consentement aux cookies d’analyse..

    • Accéder, rectifier ou supprimer vos données personnelles en nous contactant.

  • Contact

    Pour toute question concernant vos données :

    contact@bryanledda.fr