Svelte 環境構築まとめ

## はじめに

Svelte は、React や Vue.js の先を行く新たな UI フレームワークです。……と聞くと、またか、と思われた方も多いかもしれません。

従来のフレームワークとの比較で言えば、React が生の JavaScript で UI を作るという方向性だったのに対し、Svelte はテンプレートをコンパイルして Virtual DOM 形式の UI を持つ Javascript ソースコードを生成する戦略をとっているという違いがあります。Vue.js をご存知の方であれば .vue ファイルに特化して計量化したフレームワークと考えると理解しやすいかもしれません。

React は単純であるが故に簡単ではない部分ではありましたが、Svelte では従来は煩雑だった様々な部分がテンプレートで隠蔽され直感的に理解しやすくなっています。

本稿では、Svelte の環境構築方法について説明します。なお、Svelte 2 以降では ES6 のソースコードを出力するため、そのままでは IE11 に動作しませんが Babel を通すことで対応可能です。[^IE11]

[^IE11]: IE11対応については「[Svelte をIE11で動作させる](https://qiita.com/hidekatsu-izuno/items/c637a0b819fd841305e6)」に書きましたので参考にしてください。

## 前提条件

前提条件として必要な作業を記載しています。Node.js での開発ではありきたりな内容ですので、Svelte についてだけ読みたい人は[Svelte の初期設定](#svelte-の初期設定)まで飛ばして頂いて構いません。

### nodejs のインストール

[nodejs 8系（LTS）](https://nodejs.org/ja/download/)が入っていることを前提としています。Windows ユーザーであれば、[scoop](https://scoop.sh/) を導入し、 nodejs-lts をインストールするのが簡単です。

```bash
scoop install nodejs-lts
```

### package.json の作成

nodejs 用のプロジェクトを用意します。

```bash
mkdir [プロジェクト名]
cd [プロジェクト名]
npm init
```

プロジェクト情報の設定が終わったら、ソースコードや静的コンテンツを格納するフォルダも作っておきましょう。

```bash
mkdir src    # ソースコード格納フォルダ
mkdir public # 画像など静的コンテンツの格納フォルダ
```

### webpack のインストール

また、ビルドツールとして webpack を使います。npm で webpack をインストールしてください。[^webpack]

```bash
npm install --save-dev webpack webpack-cli webpack-dev-server
```

[^webpack]: webpack-cli は webpack をコマンドラインから起動するために必要です。webpack-dev-server は webpack 用の開発専用 Web サーバです。

### webpack.config.js の作成

webpack の設定ファイルを用意します。webpack4 以降では無設定でもある程度のことはできますが、実用的ではなく結局必要になるのであえて用意します。Svelte の設定については、後でこのファイルに追加していきますので、ここでは記載していません。

```javascript:webpack.config.js
const path = require('path');

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 入り口となる HTML を生成するプラグイン

module.exports = {
    entry: {
        main: './src/index.js'
    },
    output: {
        path: path.resolve(__dirname, '/dist'),
        filename: '[name].js'
    },
    plugins: [
        new HtmlWebpackPlugin()
    ]
};
```

### package.json への起動コマンドの追加

package.json に webpack の起動コマンドを追加します。ここで記載したコマンドは、npm run に続けて記述することで実行できます。npm run start で開発モードでサーバーを起動、npm run build でリリース用の js ファイルを生成します。

```json
  "scripts": {
    "start": "webpack-dev-server --mode development --hot --open --content-base public",
    "build": "webpack --mode production"
  }
```

## Svelte の初期設定

### svelte のインストール

npm で svelte を install します。[^svelte]

```bash
npm install --save-dev svelte svelte-loader
```

[^svelte]: svelte-loader は webpack 用の svelte ローダー拡張です。webpack を使わない場合は不要です。

### svelte-loader 設定の追加

webpack.config.js に svelte-loader の設定を行います。svelte-loader は、svelte のテンプレートファイルを読み込み javascript に自動的に変換してくれます。

```javascript:webpack.config.js
  module: {
      rules: [
          {
              test: /\.html$/,
              include: path.resolve(__dirname, './src'),
              use: [
                  {
                      loader: 'svelte-loader'
                  }
              ]
          }
      ]
  },
```

## Svelte を使ったコードの追加

src フォルダに Svelte のテンプレートファイルとそれを呼び出しDOMに接続する index.js を作成します。

```html:App.html
<div>Hello {name}!</div>
```

```javascript:index.js
import App from './App.html';

window.app = new App({
    target: document.body,
    data: {
        name: 'world'
    }
});
```

それでは、開発サーバを起動しましょう。

```bash
npm run start
```

webpack-dev-server の起動時に --open オプションをつけているため、ブラウザが自動的に起動します。

![svelte-01.png](https://qiita-image-store.s3.amazonaws.com/0/104531/628c5ca9-7e1d-19bf-f962-02d44a9bd67d.png)

それでは、Svelte の開発者コンソールを開き、name を変更してみましょう。

```javascript
app.set({ name: 'Svelte' })
```

![svelte-02.png](https://qiita-image-store.s3.amazonaws.com/0/104531/906a97cf-66a6-ec76-5430-15e95a0793f3.png)

表示が変わったことが確認できるかと思います。

このように Svelte では HTML 形式のテンプレートファイルを書くだけで、React で作っていたような画面が簡単に作成できるのがわかると思います。