1 of 38

大変僭越ながら

みなさまの今の気持ちを

当てようと思います...

2 of 38

3 of 38

知ってる👍

知ってる👍

知ってる👍

知ってる👍

知ってる👍

4 of 38

知ってる👍

知ってる👍

知ってる👍

知ってる👍

知ってる👍

❓❓❓❓❓

5 of 38

❓❓❓❓❓

6 of 38

お前誰!?

7 of 38

8 of 38

Svelteのメンテナです。

9 of 38

10 of 38

Something

With

Svelte

baseballyama

(Yuichiro Yamashita)

11 of 38

速習Svelte

  • 少ない記述量
  • 仮想DOMなし (コンパイラ)
  • 直感的なリアクティビティ
  • 既存スタックに埋め込める

12 of 38

多くの方が思うだろうこと...

Svelteが最近流行っているのは知ってるし使ってみたいけど

業務で使うなら事例が多い React / Vue / Angular のどれかだよなぁ...

13 of 38

わかりました。

認めましょう。

私も業務では Vue.js を使用しています。

(Vue2 → Vue3 移行中...)

しかし同時に、Svelte 使用しています。

14 of 38

多くの方が思うだろうこと...

Svelteが最近流行っているのは知ってるし使ってみたいけど

業務で使うなら事例が多い React / Vue / Angular のどれかだよなぁ...

15 of 38

Svelteが最近流行っているのは知ってるし使ってみたいけど

業務で使うなら事例が多い React / Vue / Angular のどれかだよなぁ...

16 of 38

今日のご提案

これからの時代は

React / Vue / Angular のどれかSvelte だよなぁ...

17 of 38

Something

With

Svelte

18 of 38

ユースケースはなんですか?

  • 遅延なく60fpsが要求される場合

React

Svelte

19 of 38

ユースケースはなんですか?

2. 小さなバンドルサイズが要求される場合

20 of 38

ユースケースはなんですか?

2. 小さなバンドルサイズが要求される場合

例えばこういう

埋め込みモーダル

21 of 38

ユースケースはなんですか?

2. 小さなバンドルサイズが要求される場合

(2022/8/17 時点で...)

つまり、21個以下のコンポーネントを持つアプリ / 部品の場合、

バンドルサイズはSvelteの方が小さくなります。

ランタイムサイズ

コンポーネントサイズ

Vue.js

20.21 KB

1.50 KB

Svelte

1.58 KB

2.36 KB

22 of 38

どうやって併用しますか?

  • Web Components
  • JavaScript で埋め込み
  • 他のライブラリと共存

23 of 38

1. Web Components

24 of 38

1. Web Components

参考資料

25 of 38

2. JavaScript で埋め込み

import App from "./App.svelte";

const app = new App({

// HTMLのどこにレンダリングするかを指定

target: document.getElementById('svelte-widget'),

props: {

name: "world",

},

});

26 of 38

3. 他のライブラリと共存

Demo

27 of 38

3. 他のライブラリと共存 (Vue編)

(0) 基本構成

<script setup lang="ts">

const svelteWrapper = ref<HTMLElement | null>(null);

const svelteComponent: Ref<SvelteComponent | null> = ref(null);

onMounted(() => {

svelteComponent.value = new SvelteComponent({ target: svelteWrapper.value});

});

</script>

<template>

<div ref="svelteWrapper"></div>

</template>

28 of 38

3. 他のライブラリと共存 (Vue編)

  • Vue から Svelte にプロパティを渡す

const props = defineProps<{

count: SvelteProps["count"];

onChangeCount: SvelteProps["onChangeCount"];

}>();

onMounted(() => {

svelteComponent.value = new SvelteComponent({

target,

props, // 1. インスタンス生成時にpropsを渡して

context: new Map([[key, storeRef.value]]),

});

});

// 2. propsが更新されたら都度渡す

watchEffect(() => component.value?.$set(props));

29 of 38

3. 他のライブラリと共存 (Vue編)

(2) propsの更新をSvelte から Vue に更新する (方法1)

// Svelte (イベントディスパッチャーを定義)

export let count: Props["count"] = 1;

const dispatch = createEventDispatcher<DispatcherPublisher>();

$: dispatch("change", { type: "count", value: count });

// Vue (イベントを受け取る)

onMounted(() => {

(svelteComponent.value.$on as $on)("change", (event) => {

const { type, value } = event.detail;

if (type === "count") props.onChangeCount(value);

});

});

30 of 38

3. 他のライブラリと共存 (Vue編)

(2) propsの更新をSvelte から Vue に更新する (方法2)

// Svelte (propsが変更される度にpropsで渡された関数を実行)

export let onChangeCount: Props["onChangeCount"];

$: onChangeCount(count);

// Vue (propsの変更時の処理を props として渡す)

onMounted(() => {

component.value = new SvelteComponent({

target,

props: {

count: props.count,

onChangeCount: (count) => props.onChangeCount(count),

},

});

});

31 of 38

3. 他のライブラリと共存 (Vue編)

(3) Vue から Svelte コンポーネントの関数を実行する

// Svelte

<script lang="ts">

export const reset = () => {

count = 0;

};

</script>

// Vue

const reset = () => component.value?.reset();

32 of 38

3. 他のライブラリと併用

参考資料

33 of 38

今日のまとめ

34 of 38

お前誰!?

35 of 38

Svelteのメンテナです。

36 of 38

Svelte は他のライブラリと併用で導入できる

遅延なく60fpsを実現したい場合や

小さなバンドルサイズが要求される

場面で力を発揮する

37 of 38

Svelte は他のライブラリと併用で導入できる

実装方法は3種類

  • Web Components

1行で対応できる

  • JavaScript で埋め込み

簡単

  • 他のライブラリと共存

Vue / React と共存する例をコードレベルで共有しました

38 of 38

ご清聴ありがとうございました

おしまい