3D иллюстрация, представляющая разработку веб-компонента с помощью SvelteKit, включая интерфейс кода, UI-компоненты и инструменты разработки в современном окружении.

Опубликовано 25 марта 2026 г.

Обновлено 25 марта 2026 г.

Создание веб-компонента с SvelteKit: Полное пошаговое руководство

Создание веб-компонента с SvelteKit

В этой статье мы рассмотрим, как создать веб-компонент с SvelteKit, скомпилировать его, а затем легко интегрировать в любой проект: WordPress, Shopify, Next.js или даже в чистый JavaScript.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Создание проекта SvelteKit для веб-компонента

Чтобы создать веб-компонент с помощью SvelteKit, начните с инициализации нового проекта:

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

Настройка проекта

Во время установки выберите следующие опции:

  • Минимальный SvelteKit
  • TypeScript
  • Prettier и ESLint (рекомендуется)
  • npm

Запуск проекта локально

После завершения установки откройте ваш браузер по следующему адресу:

http://localhost:5173/

Если страница отображается корректно, ваш проект SvelteKit готов к использованию для создания веб-компонента.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Установка SCSS в SvelteKit

Чтобы использовать SCSS в вашем проекте SvelteKit, вам нужно установить компилятор Sass в качестве зависимости для разработки:

npm install -D sass-embedded

После установки SvelteKit автоматически обнаружит SCSS в ваших файлах .svelte через теги <style lang="scss">.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Создание веб-компонента с помощью SvelteKit

Теперь мы создадим наш первый веб-компонент с помощью SvelteKit. Для этого создайте файл в папке src/lib :

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

Затем добавьте следующий код :

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

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

<p>Привет, мир</p>

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

👉 Атрибут customElement="my-web-component" определяет имя вашего веб-компонента. Это имя должно обязательно содержать дефис (например: my-component), чтобы быть допустимым в HTML.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Настройка SvelteKit для Web Components

Чтобы активировать создание Web Components с SvelteKit, вам нужно изменить файл svelte.config.js и включить опцию customElement.

Добавьте следующую конфигурацию:

compilerOptions: {
  customElement: true
}

Вот полный пример конфигурации:

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;

👉 Опция customElement: true позволяет SvelteKit компилировать ваши компоненты в нативные Web Components, которые можно использовать в любом окружении.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Настройка сборки веб-компонента с Vite

Чтобы создать многоразовый веб-компонент, вам необходимо настроить специальную сборку с Vite. Это позволяет экспортировать ваш компонент в виде файла JavaScript, который можно использовать в любом проекте.

Создайте файл конфигурации:

touch vite.config.webcomponent.js

Добавьте следующую конфигурацию:

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'
  }
});

Добавить скрипт сборки

Добавьте следующий скрипт в ваш файл package.json:

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

Затем вы сможете сгенерировать ваш веб-компонент с помощью команды:

npm run build:wc

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Протестируйте веб-компонент в SvelteKit

После генерации сборки вы можете протестировать ваш веб-компонент непосредственно в вашем проекте SvelteKit.

Импортировать скрипт

В файле +page.svelte добавьте сгенерированный скрипт в тег <svelte:head> :

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

Использовать веб-компонент

Затем добавьте ваш компонент в шаблон :

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

Полный пример

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

<h1>Добро пожаловать в SvelteKit</h1>
<p>
  Посетите <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a>, чтобы прочитать документацию
</p>

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

Запустить проект

Выполните следующие команды :

npm run build:wc
npm run dev

Если все настроено правильно, ваш веб-компонент должен отображаться на странице.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Добавить свойства (props) в Web Component SvelteKit

Вы можете сделать ваш Web Component динамическим, передав ему свойства (props).

Определить проп в компоненте

В вашем файле my-web-component.svelte :

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

Использовать проп в шаблоне

<p>Привет {name}</p>

Полный компонент

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

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

<p>Привет {name}</p>

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

Использовать проп в HTML

Теперь вы можете передать значение напрямую из HTML :

<my-web-component name="Брайан"></my-web-component>

👉 Отображаемый текст будет: Привет Брайан

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Экспонирование методов JavaScript (API) в Web Component

Вы можете экспонировать методы JavaScript для взаимодействия с вашим Web Component извне (JavaScript, фреймворк или HTML).

В этом примере мы создадим геттер и сеттер для управления свойством name.

Создание методов

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

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

Экспонирование методов через Web Component

Используйте $host() для привязки методов к элементу DOM:

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

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

Полный компонент

<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>Привет {name}</p>

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

Использование методов из JavaScript

Теперь вы можете взаимодействовать с вашим Web Component из внешнего скрипта:

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

// Изменить значение
el.setName('Брайан');

// Получить значение
console.log(el.getName());

👉 Этот подход позволяет создать полноценное JavaScript API для вашего Web Component.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Взаимодействие с веб-компонентом из SvelteKit

Вы можете взаимодействовать непосредственно с вашим веб-компонентом из SvelteKit, получая доступ к его методам через ссылку на JavaScript.

Объявление ссылки на компонент

let wc: HTMLElement;

Связывание веб-компонента

Используйте bind:this, чтобы получить ссылку на компонент:

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

Добавление типизации TypeScript (рекомендуется)

Чтобы избежать ошибок в вашей IDE, вы можете типизировать открытые методы:

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

Взаимодействие с компонентом

Вы можете затем вызывать методы в жизненном цикле onMount:

import { onMount } from 'svelte';

onMount(() => {
  console.log('Т текущее имя:', wc.getName());

  setTimeout(() => {
    console.log('== Изменить имя ==');
    wc.setName('Admin');
    console.log('Т текущее имя:', wc.getName());
  }, 1000);
});

Полный пример

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

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

  onMount(() => {
    console.log('Т текущее имя:', wc.getName());

    setTimeout(() => {
      console.log('== Изменить имя ==');
      wc.setName('Admin');
      console.log('Т текущее имя:', wc.getName());
    }, 1000);
  });
</script>

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

<h1>Добро пожаловать в SvelteKit</h1>
<p>
  Посетите <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a>, чтобы прочитать документацию
</p>

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

Результат в консоли

Т текущее имя: User
== Изменить имя ==
Т текущее имя: Admin

👉 Веб-компонент обновляется динамически, и изменения видны как в DOM, так и в консоли.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Использование слотов в Web Component SvelteKit

Слоты позволяют внедрять HTML-контент из внешнего источника в ваш Web Component. Это необходимо для того, чтобы сделать ваш компонент гибким и повторно используемым.

Добавление слота в компонент

В вашем файле my-web-component.svelte просто добавьте:

<slot />

Изменение шаблона

Например, замените:

<p>Привет {name}</p>

На:

<p>Перед Привет {name}</p>
<slot />
<p>После Привет {name}</p>

Полный компонент

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

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

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

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

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

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

<p>Перед Привет {name}</p>
<slot />
<p>После Привет {name}</p>

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

Передача контента из страницы SvelteKit

Теперь вы можете внедрять контент непосредственно в ваш Web Component:

<my-web-component bind:this={wc} name="Пользователь">
  <p>Новый контент</p>
</my-web-component>

Полный пример в SvelteKit

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

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

  onMount(() => {
    console.log('Текущее имя:', wc.getName());

    setTimeout(() => {
      console.log('== Изменить имя ==');
      wc.setName('Администратор');
      console.log('Текущее имя:', wc.getName());
    }, 1000);
  });
</script>

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

<h1>Добро пожаловать в SvelteKit</h1>
<p>
  Посетите <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> для чтения документации
</p>

<my-web-component bind:this={wc} name="Пользователь">
  <p>Новый контент</p>
</my-web-component>

👉 Контент, переданный между тегами Web Component, будет внедрён на место <slot />.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Добавить изображение в Web Component SvelteKit

Чтобы интегрировать изображение в Web Component с помощью SvelteKit, вы не можете использовать директорию static напрямую. Вам нужно импортировать изображение как модуль, чтобы оно было правильно включено в сборку.

Импортировать изображение

В вашем компоненте my-web-component.svelte :

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

Использовать изображение в шаблоне

<img src={logo} alt="Логотип SvelteKit" />

Полный компонент

<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" />

<p>Перед Привет {name}</p>
<slot />
<p>После Привет {name}</p>

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

👉 Изображение будет автоматически оптимизировано и включено в финальный пакет Web Component.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Слушать события веб-компонента в SvelteKit

Чтобы общаться с вашим приложением из веб-компонента, вы можете генерировать пользовательские события (CustomEvent) и слушать их на стороне клиента.

Создать событие в компоненте

Добавьте кнопку и функцию в ваш компонент:

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

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

Создать API для прослушивания событий

Чтобы упростить прослушивание событий, вы можетеExpose метод on:

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

Экспонировать метод

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

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

Обновить типизацию на стороне SvelteKit

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

Слушать событие на странице

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

Полный пример на стороне 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>

Результат

{ name: 'Admin' }

👉 Этот подход позволяет сделать ваш веб-компонент совместимым с любым приложением через простую и эффективную событийную API.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Заключение

Теперь вы знаете, как создать Web Component с помощью SvelteKit, собрать его с Vite и интегрировать в любой проект.

  • Создать Web Component с SvelteKit
  • Настроить и собрать с Vite
  • Интегрировать в любую среду (HTML, React, WordPress…)
  • Управлять свойствами, методами, слотами и событиями

👉 Web Components — это мощное решение для создания переиспользуемых виджетов, будь то для SaaS, встраиваемых скриптов или многоплатформенных плагинов.

Благодаря SvelteKit вы можете создавать производительные, легкие и полностью независимые от используемого клиентского фреймворка компоненты.

🚀 Теперь вы можете создавать собственные виджеты и интегрировать их повсюду: на лендингах, в CMS, веб-приложениях или клиентских проектах.

Активируйте рекламные куки, чтобы получить доступ к этой статье без размытия.

Идти дальше

Вы хотите создать индивидуальный веб-компонент для вашего проекта или компании?

Я предлагаю персонализированные решения для разработки эффективных виджетов, которые можно интегрировать на любую платформу (WordPress, Shopify, SaaS…).

Фото профиля Брайана Ледды, веб- и мобильного разработчика, специализирующегося на iOS, SvelteKit и искусственном интеллекте.

Статья написана Брайаном Леддой – Веб и Мобильный Разработчик

Мы используем файлы cookie, чтобы улучшить ваш опыт, проанализировать трафик и обеспечить безопасность сайта с помощью Google reCAPTCHA.
Вы можете принять все файлы cookie или настроить свои предпочтения.

Узнать больше о нашем Пункт.

Ваши предпочтения по файлам cookie

Вы можете активировать или деактивировать каждую категорию:

  • Безопасность

  • Аналитика

  • Реклама

Политика конфиденциальности

Мы придаем огромное значение защите ваших персональных данных. Эта политика объясняет, какие данные мы собираем, почему и как мы их используем, а также ваши права в отношении этих данных.

  • Собранные данные

    • Cookies функциональности и безопасности: необходимы для обеспечения безопасности сайта (reCAPTCHA).

    • Файлы cookie для аналитики: используются для измерения посещаемости и улучшения сайта (Google Analytics).

    • Технические данные: IP-адрес, тип браузера, посещенные страницы, длительность визита.

  • Цель

    Собранные данные позволяют нам:

    • Обеспечить безопасность сайта и предотвращать злоупотребления (reCAPTCHA).

    • Анализировать и улучшать пользовательский опыт (Google Analytics).

  • Юридическая основа

    • Обязательные файлы cookie: необходимы для работы сайта.

    • Куки-аналитика: подлежат вашему явному согласию.

  • Поделитесь данными Мы не делимся вашими данными с третьими лицами, за исключением необходимых поставщиков для функционирования или анализа (например, Google).

  • Срок хранения Данные, собранные с помощью файлов cookie, хранятся в течение максимального времени, разрешенного поставщиком (например, Google Analytics 14 месяцев).

  • Ваши права

    Вы можете в любое время:

    • Отказать или отозвать свое согласие на использование аналитических файлов cookie..

    • Получите доступ, исправьте или удалите ваши персональные данные, связавшись с нами.

  • Контакт

    Для любых вопросов, касающихся ваших данных:

    contact@bryanledda.fr