Vue 3・Vite を触ってみる
Vue 3.0 が RC (Release Candidate) になったらしいので触ってみる。
- 参考 : Vue 3 is now in RC! · Issue #189 · vuejs/rfcs · GitHub … 公式のアナウンス
目次
- Vue のバージョン紛らわしい
- Vue CLI ではなく Vite を使う
- 検証環境
- プロジェクト雛形を用意する
- 雛形を確認してみる
- 実際に動かしてみる
- SCSS を使ってみる
- TypeScript でコーディングしてみる
- プロダクションビルド
- 以上
Vue のバージョン紛らわしい
Angular は各サービスと CLI のバージョンが揃えられているが、Vue の場合は本体と Vue CLI のバージョンがバラバラである。本稿執筆時点だと
- Vue CLI : v4.4.6
- この Vue CLI からインストールされる Vue 本体 : v2.6.11
という感じ。今回試すのは Vue 本体が v3.0 になるよーという話。
Vue CLI ではなく Vite を使う
上述の公式アナウンスのページを見てみると、コレまで使ってきた Vue CLI (@vue/cli
) ではなく、Vue.js の作者が作った Vite (ヴィート) というツールを使用する方法が紹介されていた。
どちらかというとコチラの方が楽しみなので、やってみる。
検証環境
今回検証した環境は次のとおり。
- MacOS Catalina
- Node.js vt12.16.1
- npm v6.13.4
プロジェクト雛形を用意する
まずは、公式アナウンスの記載に従って npm init vite-app
を叩いてみよう。
$ npm init vite-app practice-vue-3
npx: 7個のパッケージを1.166秒でインストールしました。
Scaffolding project in /Users/Neos21/practice-vue-3...
Done. Now run:
cd practice-vue-3
npm install (or `yarn`)
npm run dev (or `yarn dev`)
# npm init vite-app コマンドによりディレクトリが作成される
$ cd ./practice-vue-3/
npm init vite-app
ってどういうコマンドなの?と思って調べてみると、npm init
は特定の雛形プロジェクトを作れるオプションを用意しているようだ。
$ npm init foo
と叩くと、内部的には $ npx create-foo
というコマンドが実行されていて、create-foo
パッケージにより雛形が作成されるという仕組みらしい。
コレを使えば npx create-react-app
とせずに npm init react-app
と叩いても同じ結果が得られるらしい。この npm init
の仕様に合わせるために create-
が接頭辞になっていたのか…!
というワケで、Vite に関しても create-vite-app
という npm パッケージが別に公開されていた。コレを使ってるのね。
雛形を確認してみる
どんなファイルが用意されたのか確認してみる。
$ cd ./practice-vue-3/
$ tree
.
├── index.html
├── package.json
├── public
│ └── favicon.ico
└── src
├── App.vue
├── assets
│ └── logo.png
├── components
│ └── HelloWorld.vue
├── index.css
└── main.js
4 directories, 8 files
index.html
がプロジェクトルートにある。それ以外は Vue v2 系と大して変わらないかな。
package.json
の中身はこんな感じ。依存パッケージ少ない!
{
"name": "practice-vue-3",
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build": "vite build"
},
"dependencies": {
"vue": "^3.0.0-rc.1"
},
"devDependencies": {
"vite": "^1.0.0-rc.1",
"@vue/compiler-sfc": "^3.0.0-rc.1"
}
}
npm install
してみて実際にインストールされたバージョンは次のとおり。
$ npm install
$ npm list --depth=0
practice-vue-3@0.0.0 /Users/Neo/practice-vue-3
├── @vue/compiler-sfc@3.0.0-rc.2
├── vite@1.0.0-rc.1
└── vue@3.0.0-rc.2
実際に動かしてみる
まずは雛形をそのまま動かしてみる。
$ npm run dev
http://localhost:3000/
で開発サーバが開く。適当に src/
配下のファイルを編集してみたりして、動作することを確認。
Vite は Rollup をベースにしていて、TypeScript のトランスパイルに爆速で知られる esbuild を使っていて、.vue
のような SFC (Single File Component) に対応していて、HMR (Hot Module Replacement) が出来て、とかなんとか、とりあえずイマドキのチョッパヤなビルドツールってことらしい。
確かにそのとおりで、ファイルを編集してから開発サーバのプレビューが更新されるまでが爆速だ。コレは素敵。
- 参考 : Vite は本当に早いのか ~ Vue CLI と比較 ~ - Qiita
- 参考 : 【Vite】 Vue3.0もReactも!ノーバンドルなビルドツール「Vite」を試してみる - Qiita
- 参考 : フロントエンドの爆速な開発サーバを実現する Vite を試してみた - SMARTCAMP Engineer Blog
SCSS を使ってみる
src/index.css
を見ると、素の CSS なことに気付いた。また、各コンポーネント内にも style
要素がなく、SCSS 対応はデフォルトではしていないようだった。
というワケで試しに SCSS 化してみる。
# css ファイルを scss にリネーム
$ mv src/index.css src/index.scss
$ vi main.js
main.js
内にある import './index.css'
の行を import './index.scss'
と変更したところ、npm run dev
していたコンソールに
Error: Cannot find module 'sass' from '/Users/Neo/practice-vue-3'
なるエラーが表示された。そこで一度 npm run dev
を終了し、sass
をインストールしてみた。
$ npm install -D sass
そしたら $ npm run dev
してもちゃんと SCSS が解釈されるようになった。
コンポーネントファイル内で次のように書いても、ちゃんと SCSS がトランスパイルされることを確認した。
src/components/HelloWorld.vue
など
<!-- ↓ lang 属性を指定する。scoped によるスコープも、Vue v2 と同様に作れた -->
<style lang="scss scoped>
p {
code {
color: #00f;
}
}
</style>
依存パッケージに sass
(node-sass ではなく dart-sass ですな) を入れてやれば、Vite はちゃんと SCSS を解釈できるようだ。
TypeScript でコーディングしてみる
続いて、素の JavaScript で書かれているところを TypeScript にしてみる。
src/App.vue
<template>
<!-- テキトーに data を参照する要素を配置してみる -->
<p>{{ test }}</p>
</template>
<!-- ↓ lang 属性を付ける -->
<script lang="ts">
import HelloWorld from './components/HelloWorld.vue';
// 型定義をしてみる
const test: string = 'TEST';
export default {
name: 'App',
components: { HelloWorld },
data: () => ({ test })
}
こんな感じのコードにしてみたところ、何の追加パッケージも要らずにトランスパイルされた。Vite の裏で esbuild
がうまいことトランスパイルしてくれている様子。
なお、そのままだと型チェックが効かないので、
const test: number = 'My String';
のようなおかしなコードを書いてもとりあえず動いてしまう (バグる)。
こうした型チェックはどうしたらいいのかというと、ビルド時にやるんじゃなくて、IDE で開発中に検知しろってことみたい。確かにね。
tsconfig.json
とかを置いて制御もできるっぽいが今回は割愛。
class
構文で書きたいなーと思っていたが、Vue v2 系で class
構文を実現していたサードパーティライブラリの開発が万全ではない。
- 参考 : Vue v3 Changes for @Component decorator and Vue base class · Issue #406 · vuejs/vue-class-component · GitHub
- 一応 Vue 公式なのだが何かまだ Issues が残っている
- 参考 : Vue 3.0 support · Issue #294 · kaorun343/vue-property-decorator · GitHub
- デコレータを実現するサードパーティもまだバグがあるっぽい
なんだろ、Vue は class
構文避けるよね…?と思ったら、Vue 3 ではそもそも Class Component 自体がリジェクトされてるので、非推奨っぽい。
- 参考 : Abandoned Class API proposal by yyx990803 · Pull Request #17 · vuejs/rfcs · GitHub
- 参考 : デコレータ使わない Vue.js + TypeScript で進んだ「LINEのお年玉」キャンペーン - LINE ENGINEERING
- 参考 : Vue 3's class API proposal has been dropped in favor of "composition functions" : vuejs
- 参考 : 2020/07/28 時点の Vue 2.x + TypeScript について言える確かなこと - potato4d
よー分からんけど、以下を見るに「複数の書き方が出来るのは混乱する」「TypeScript の型を厳格化するのが大変」とかそんな理由っぽい。まぁ色んな書き方できちゃうのは好かんし、class
構文を使わない方が型チェックが厳格にできるのであれば、それでもいいかなー。
プロダクションビルド
$ npm run dev
による開発ビルドではなく、ちゃんと本番ビルドするには、
$ npm run build
を叩く。コチラもイイカンジ。何も考えなくて良いのが使いやすい。
以上
とにかく Vite のビルド速度が速くて驚いた。Vue 3 の正式リリース楽しみ。