【Vite】 Vue3.0もReactも！ノーバンドルなビルドツール「Vite」を試してみる

最近猛烈にスターを集めているビルドツール、[Vite](https://github.com/vitejs/vite)を触ってみたので簡単に紹介します。
この記事は`Vite v0.19.1`時点での情報です。

# Viteとは？
[Vite](https://github.com/vitejs/vite)はVue.jsの作者のEvan You氏が開発中のノーバンドルなビルドツールです。
ネイティブのESモジュールのインポートを利用しバンドル不要で高速に動作するdevサーバーと、[Rollup.js](https://github.com/rollup/rollup)をベースとしたプロダクションビルド機能を提供します。
設定不要で`.vue`のSFC（Single File Components）をコンパイルできて、さらにデフォルトで今開発中のVue3.0が使えます。
しかも、vue-cliのように**Vue.js限定ではなく、React、Preactにも対応**しています。

<a href="https://github.com/vitejs/vite" target="_blank"><img width="521" alt="スクリーンショット 2020-06-01 5.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/83b43678-abff-21fc-6b63-d10e50acd1a6.png"></a>



**:warning: 注意**

> Still experimental, but we intend to make it suitable for production.

とある通り、まだ絶賛開発中です。プロダクションで使うのは控えた方が良さそうです。



# 何が嬉しいの？
SFCでの開発ならVue CLIやWebpackで良いのでは?と思うかもしれません。
Viteを使う利点は以下の通りです。

- 開発時はバンドル不要で動作するので、大規模プロジェクトでも初回起動が非常に早い
- HMR（画面の再描画無しにファイル変更をブラウザに適用してくれる機能）が、モジュールの総数と切り離されているため一貫して高速に動作する

ざっくり言うと総じて動作が早いです。開発体験が良い。
他詳細な説明はREADMEにも記載されているのでそちらもどうぞ。

https://github.com/vitejs/vite#how-and-why

# インストールとプロジェクト作成
VueとReactのプロジェクト作成を簡単に説明します。

## Vue

以下コマンドでプロジェクトを作成します。

```bash
$ npm init vite-app example-vue
```

これだけでOKです。example-vueにVueのプロジェクトが作成されます。
あとは依存モジュールをinstallして起動するだけです。

```bash
$ cd example-vue
$ npm i
$ npm run dev
```
<img width="832" alt="スクリーンショット 2020-05-31 20.42.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/448ae6d2-3fb1-87d0-44d0-46baa904171d.png">


## React

`--template react`でReactのテンプレートを指定したうえでプロジェクトを作成します。

```bash
$ npm init vite-app --template react example-react
```

example-reactにReactのプロジェクトが作成されます。
あとはvueと同じく起動するだけです。

```bash
$ cd example-react
$ npm i
$ npm run dev
```
<img width="935" alt="スクリーンショット 2020-05-31 20.47.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/f4449b84-e169-99d0-c0e2-1e6964805a9f.png">

## ビルド

Viteでは[Rollup.js](https://github.com/rollup/rollup)を内部的に使ってリソースをバンドルしプロダクションビルドが可能です。
buildコマンドでビルドが実行されます。

```bash
$ npm run build
```

`dist`配下に成果物が生成されるので、あとはそれを公開するだけです。

細かいビルドオプションを設定したい場合は、コマンド引数で指定するか、設定ファイルを作り記述できます。
以下成果物のディレクトリを`out`ディレクトリに変更する例です。

プロジェクトルートに`vite.config.js`を追加して以下を記述します。

```vite.config.js
module.exports = {
  outDir: "out"
}
```

あとはそのままビルドすれば`out`ディレクトリに成果物が生成されます。

他設定可能なオプションはソースコードをみるのが良さそうです。
https://github.com/vitejs/vite/blob/master/src/node/config.ts


# TypeScriptへの対応
TypeScriptへの対応も設定なしで可能です。Vueの場合は`.vue`で`<script lang="ts">`を設定するだけ。
Reactの場合は、`.jsx`を`.tsx`に変更するだけです。
`.ts`ファイルもそのままimportできます。

```vue:App.vue
<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <HelloWorld msg="Hello Vue + Vite" />
</template>

<script lang="ts">
import HelloWorld from './components/HelloWorld.vue'
import { defineComponent } from 'vue'

// Composition APIなので defineComponent()を利用
export default defineComponent({
  name: 'App',
  components: {
    HelloWorld
  },
  setup() {
    return {}
  }
})
</script>
```

**:warning: 注意点**
2020/05/31現在、TypeScriptはJSへのトランスパイルのみ対応していて、型チェックは行えません。
基本的にエディタ上での型エラーの確認と、tsconfig.jsonを追加しビルド前に`tsc --noEmit`を利用して型チェックを行ってください。

# PostCSS、Scssへの対応
Viteは、`.vue`ファイルとインポートされた`.css`ファイルの全てにPostCSSを自動的に適用します。
必要なPostCSSのプラグインをnpmでインストールして、あとは`postcss.config.js`をプロジェクトルートに追加するだけです。

Autoprefixerの利用例。

```bash
$ npm i autoprefixer --save-dev
```

```postcss.config.js
module.exports = {
  plugins: [
    require('autoprefixer')()
  ]
}
```

CSS Pre-Processorsのscssも、`sass`をnpmインストールして、`.vue`ファイルで`<style lang="scss">`を指定するだけで利用できます。

```bash
$ npm i sass --save-dev
```

```vue
<style lang="scss">
/* scss */
</style>
```

# 終わりに
とても高速に動作するのでViteかなり良いですね。あと、Vue 3.0のsandbox環境としても最高です。
今回紹介した以外にも機能盛り沢山なので、是非READMEを読んで欲しいです。
https://github.com/vitejs/vite

今後もさらに機能が拡張されるようなので引き続き動向を見ていきたいです。

最後に。Evan You氏のVite作成時の投稿がカッコ良すぎる。
こんなこといつか言ってみたいです。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">As I was going to bed, I had an idea about a no-bundler dev setup (using native browser ES imports), but with support for Vue SFCs **with hot reload**. Now it&#39;s almost 6AM and I have PoC working. The hot reload is so fast it&#39;s near instant.</p>&mdash; Evan You (@youyuxi) <a href="https://twitter.com/youyuxi/status/1252173663199277058?ref_src=twsrc%5Etfw">April 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考
- [vitejs/vite: An opinionated web dev build tool. It's fast.](https://github.com/vitejs/vite)
- [Getting started with Vite, a no bundler DEV environment for Vue.js](https://medium.com/@wearethreebears/getting-started-with-vite-a-no-bundler-dev-environment-for-vue-js-217a6eb7c9d0)
- [Vite⚡ - Vue no-bundler dev setup - DEV](https://dev.to/gautemeekolsen/vite-vue-no-bundler-dev-setup-4416)
- [Viteの動作確認 no bundle devサーバ for Vue 3 | アールエフェクト](https://reffect.co.jp/vue/vue-vite-no-bundle-dev-server-vue-3)