🔥
Svelteの根本部分を簡単に理解する
概要
Svelteにはsvelte/templateの様にSvelteでのアプリ開発をすぐに始められる様なテンプレートや、より多くの機能を持ったSveltekitの様な強力なフレームワーク(2022/3/10現在Beta)が既に存在しています。
既にSvelteとは何か(Svelte=コンパイラ)説明する記事はたくさん存在するのですが、簡単なコードを使うことでより直感的に理解できると思い記事を書いてみました。
結局Svelteとは
上記でも記載したのですが、結論Svelteはコンパイラです。
Svelteの場合、Svelteの独自記法をブラウザの理解できる形(Javascript
とCSS
)に変換してくれます。
コードで理解する
下記の様なJavaScriptファイルを作成します。(npm
でsvelte
を既にインストール済みの想定)
svelte-test.js
import * as svelteCompiler from 'svelte/compiler'
// (1) Svelteの独自記法
const SvelteComponent = `
<script>
let text = "word";
</script>
<h1 class="greeting">Hello {text}</h1>
<style>
.greeting {
color: red;
}
</style>
`
// (2) 独自記法をコンパイルする
const { js, css } = svelteCompiler.compile(SvelteComponent)
console.log(js.code)
console.log(css.code)
上記の簡単なJavaScript
のコードを見て頂くとわかりますが、(1)Svelteの独自記法
を(2)コンパイルする
ことでブラウザの理解する事ができるjs
とcss
を返してきます。
コンパイル後のコード
下記コードの中身を見てみるとそれぞれ普通のcss
とJavaScript
である事がわかります。
css.codeの中身
.greeting.svelte-9led3h {
color:red
}
js.codeの中身
/* generated by Svelte v3.46.4 */
import {
SvelteComponent,
append_styles,
attr,
detach,
element,
init,
insert,
noop,
safe_not_equal
} from "svelte/internal";
function add_css(target) {
append_styles(target, "svelte-9led3h", ".greeting.svelte-9led3h{color:red}");
}
function create_fragment(ctx) {
let h1;
return {
c() {
h1 = element("h1");
h1.textContent = `Hello ${textHello}`;
attr(h1, "class", "greeting svelte-9led3h");
},
m(target, anchor) {
insert(target, h1, anchor);
},
p: noop,
i: noop,
o: noop,
d(detaching) {
if (detaching) detach(h1);
}
};
}
let textHello = "word";
class Component extends SvelteComponent {
constructor(options) {
super();
init(this, options, null, create_fragment, safe_not_equal, {}, add_css);
}
}
export default Component;
これを単純に下記の様にする事で、target
の箇所で期待した実装を表現してくれます。
// Componentはの定義は上のjs.codeの中身を参照
const component = new Component({
target: document.querySelector('#test'),
props: {
greeting: 'world'
}
});
結果
その他
-
compile
時のいろいろなオプションはこちらを参照してください - compile時の挙動や使用するParserに関してはこちらの記事がわかり易く説明してくれていました。それ以上理解をする場合は実際のcompiler配下のソースコードを追うのが良いかと思います。
-
js.code
中で使用されているSvelteComponent
やその他のinternal関数・オブジェクトはこちらから実際の実装を追う事ができます。
※ コード中のコメントにも記載されていますがinternal配下のコードはいつでも変わる可能性があります。
参考資料
- The easiest way to get started with Svelte: 公式のブログで紹介されている最速でSvelteで開発を始める方法
- Svelte Document: 公式のドキュメント
- Svelte Turtorial: 公式のチュートリアル
- Sveltekit: Svelteのフレームワーク
Discussion
メモ
コンパイルの流れ詳しい説明
「Svelte入門」拝読しています。記事についてのコメントではないのですが、Svelte基本文法(2)のライフサイクルの図の中のafterUpdateの説明の「初回マウントでonMountが呼ばれる直前」は「初回マウントでonMountが呼ばれた直後)」ですかね?
ご指摘ありがとうございます🥹!
該当箇所ですが一旦文字で補足を行いました🙇♂️(Figmaで作った元画像が見当たらず、、、)