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

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

  1. 遅延なく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

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

  1. Web Components
  2. JavaScript で埋め込み
  3. 他のライブラリと共存

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編)

  1. 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

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

おしまい