2020年注目度No.1JSフレームワーク
みなさん、こんにちは。どんぶラッコです。
突然ですが、Svelteというフレームワークをご存知でしょうか?
Twitterで目にすることも多く、某プログラミングスクールのカリキュラムでも採用されていたので気になっていました
実はこのSvelte, State of JS というサイトの調査によると、Vue.jsやReactをおさえ、JavaScriptのフレームワークの中で最も注目度が高い言語として紹介されています。
公式サイトでは、Svelteの特徴として3つ挙げています。
個人的に面白い点だと思っているのは No virtual DOM です。 仮想DOMの仕組みを使わない、と公言しているのです。
便宜上、先ほどから Svelteを “フレームワーク” と表現していますが、 Svelte自体は コンパイラ の方が表現として正しいです。
書いたコードを変換して、vanilla JavaScript (生のJavaScript)にしてくれるわけです。その際、余計な部分を削ぎ落とした形でコンパイルしてくれるので、ファイルが軽くなるし、実行速度も早くなると謳っています。
筆者がフレームワークに触れてみた印象としては、Vue.jsやReactを既に学習された方であればすんなり理解できると思います。
ということで、これからSvelteの導入手順や文法の特徴について、何回かに分けてご紹介していきます!
この記事の内容は、筆者がWeb技術勉強会で実施したハンズオンの内容を再編したものになります。
なので、JavaScriptの文法などは既に学習済みという前提でお話しします!
- Mac OS BigSur
- Node v12.18.2
第1回 初めてのSvelte
インストール・セットアップ
まずは、Svelteプロジェクトを作成してみましょう。下記コマンドを入力してください。
npx degit sveltejs/template svelte-handson
svelte-handson
となっているところは、お好きなプロジェクト名を入力してください。
ちなみに、degit
は git clone
的なことを npmコマンドで実現できるやつです。
degit
コマンドの作成者でもある Rich Harris さんが Svelteの作成者でもあるよ!
インストールが完了したら、プロジェクトのディレクトリに移動してコマンドを立ち上げてみましょう。
cd svelte-handson
npm install
npm run dev
http://localhost:5000 にアクセスできれば成功です!
ディレクトリ構造
では立ち上がることが確認できたところで、ディレクトリ構造を確認してみましょう。
.
├── README.md
├── node_modules
├── package.json
├── public
│ ├── build
│ ├── favicon.png
│ ├── global.css
│ └── index.html
├── rollup.config.js
└── src
├── App.svelte
└── main.js
ものすごくシンプルな構造ですね。
基本的に src
ディレクトリでコーディング、ビルドした結果は public
ディレクトリで確認することができる、と考えておけば問題ありませんね。
svelte ファイルの中身と特徴
実際に記述を進めていくのは /src
フォルダ内部にある svelteファイルです。 デフォルトのプロジェクトでは App.svelte
が作成されています。
App.svelte
の中身を確認してみましょう。
<script>
export let name;
</script>
<main>
<h1>Hello {name}!</h1>
<p>Visit the <a href="https://svelte.dev/tutorial">Svelte tutorial</a> to learn how to build Svelte apps.</p>
</main>
<style>
main {
text-align: center;
padding: 1em;
max-width: 240px;
margin: 0 auto;
}
h1 {
color: #ff3e00;
text-transform: uppercase;
font-size: 4em;
font-weight: 100;
}
@media (min-width: 640px) {
main {
max-width: none;
}
}
</style>
見ていただくとわかるとおり、 JavaScript, HTML, CSS の順番で記載されています。1ファイルの中に3つ全てを記載するところはコンポーネント思考のフレームワークを利用されている方なら馴染みがある光景じゃないでしょうか。
そして、もう一つ特徴的なのが、 HTMLファイルを直接記述している点です。コンポーネントを作る場合、Vue.jsであれば <template>
タグ、Reactであれば <>
タグなど、独自のタグを追加する必要がありますが、Svelteの場合はそのような配慮は必要なく、直接HTMLタグを書いてしまってOKです。この辺は直感的でわかりやすいですね!
また、 <style>
タグですが、scoped
がデフォルトでされています。なので、App.svelte
内部で指定されたCSS指定は App.svelte
内部のHTMLにのみ有効という状態になります。サンプルでも h1
タグに直接CSSを指定したりしていますが、他のsvelteファイル内部の h1
タグでは影響しません。この辺は子コンポーネントの作成で改めて触れます!
そして、この App.svelte
は 同じ src
ディレクトリ内の main.js
に読み込まれています。
import App from './App.svelte';
const app = new App({
target: document.body,
props: {
name: 'world'
}
});
export default app;
props: { ... }
の中身のキーバリューを App.svelte
に渡しています。今回は name: 'world'
を渡しているから、 App.svelte
内で <h1>Hello {name}</h1>
と記述すると Hello world
と表示されるんだね
svelte component のコンパイル
冒頭でsvelteはコンパイラだという話をしました。それはどのように実現されているかというと、 rollup-plugin-svelte
が担当しています。
先ほどプロジェクトのディレクトリ構成をご紹介したときに、 rollup.config.js
というファイルがありましたね。
この中でコンパイルに関する設定をすることが可能です。
一部抜粋して rollup.config.js
の中身を掲載しておきます。
import svelte from 'rollup-plugin-svelte';
// 中略
function serve() {
// 中略
}
export default {
input: 'src/main.js',
output: {
sourcemap: true,
format: 'iife',
name: 'app',
file: 'public/build/bundle.js'
},
plugins: [
svelte({
compilerOptions: {
// enable run-time checks when not in production
dev: !production
}
}),
// 中略
],
watch: {
clearScreen: false
}
};
わかりやすいところで言うと、 input
でどのファイルを入力するか、 output
でどこに出力するかを定義しています。 output.file
を確認すると public/build/bundle.js
となっていますね。
実際に public
ディレクトリ内にある index.html
を確認すると、 bundle.js
が読み込まれていることがおわかりいただけます。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>Svelte app</title>
<link rel='icon' type='image/png' href='/favicon.png'>
<link rel='stylesheet' href='/global.css'>
<link rel='stylesheet' href='/build/bundle.css'>
<!-- この部分! -->
<script defer src='/build/bundle.js'></script>
</head>
<body>
</body>
</html>
この記事のまとめ
ということで、今回は Svelteのインストール方法とそのディレクトリ構造について触れました。
1ページもののWebサイトなどには使いやすいのでは?と思っています。
実際の文法についても別記事でご紹介していきます。乞うご期待!
次の記事はこちら