初めてWebpackからViteへ移行してみる時に役立つTips
はじめに
最近はプロダクトでも開発環境にViteを使っているという記事などを見る事が多くなりました。
Viteではホットリロード(HMR)がめちゃくちゃ早いという事で以前から体験してみたかったのと、Vue2系でもViteを活用できる事を知り実際に試してみました。
リポジトリ
feature/vuecli
の構成(VueCliのパターン)
ブランチ- Vue 2.6.11(Vue3の移行がまだ済んでいないのを想定)
- VueCli 4.5.4
- webpack 4.12.1
- TypeScript 4.1.5
- CSSフレームワークにはVuetify 2.6.4
- Node.js v16.13.0
feature/vite
の構成(VueCliのパターン)
ブランチ- Vue 2.6.11
- Vite 2.9.12
- TypeScript 4.1.5
- CSSフレームワークにはVuetify 2.6.4
- Node.js v16.13.0
なお、TypeScriptの場合だと、vue-property-decoratorやVue.extendを使ってTypeScirptを記述している事が多いので、上記リポジトリでは両方のパターンを採用して書いています。
リポジトリを持ってきて、feature/vuecli
のブランチの状態でyarn install
を行い、npm run serve
(またはyarn serve
)すると、VueCliで開発環境が立ち上がります。
試しにこの状態で、適当にCSSを変えてみると....
CSS一つ変えるだけでも反映されるのに4秒くらい掛かってます。
1回だとまだしもですが、CSS調整している時など、頻繁に画面反映している際には結構ストレスになりそうです。
この状態から、Viteに移行してきます。
Viteへの移行手順
1.Viteをインストール
yarn add --dev vite
次に、vite-plugin-vue2とunplugin-vue-componentsをインストールします。
yarn add --dev vite-plugin-vue2 unplugin-vue-components
@vitejs/plugin-vueはVue3のサポートなのでVue2の場合はインストールしなくてOKです
公式ドキュメント(引用)
@vitejs/plugin-vueは Vue 3 の単一ファイルコンポーネントのサポートを提供します。
公式ドキュメント
2.package.jsonを書き換え
"scripts": {
- "serve": "vue-cli-service serve",
+ "serve": "vite preview",
+ "dev": "vite",
- "build": "vue-cli-service build",
+ "build": "vite build",
+ "build:dev": "vite build --mode development",
- "lint": "vue-cli-service lint"
+ "lint": "eslint lint src"
}
開発するときはdev
、ビルドするときはbuild:dev
を使い、serve
でビルドしたコードを立ち上げるようにします。
3.vite.config.tsを作成
Vue2系に合わせて、このように記載します。
また、Vuetifyを利用している場合は、pluginの部分にVuetifyResolver()
を追記します。
import path from "path";
import { defineConfig } from "vite";
import { createVuePlugin as vue2 } from "vite-plugin-vue2";
import { VuetifyResolver } from "unplugin-vue-components/resolvers";
import viteComponents from "unplugin-vue-components/vite";
export default defineConfig({
plugins: [vue2(), viteComponents({ resolvers: [VuetifyResolver()] })],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
"./src/": path.resolve(__dirname, "./src"),
},
},
});
4.独自環境変数の設定
package.jsonの表記を環境を変数を利用して表示させる設定をします。
{
"name": "hogehoge",
"version": "1.1.1"
}
vite.config.ts
- Viteで独自で環境変数を使う時はvite.config.tsに書来ます。
process.env.VITE_APP_VERSION = JSON.stringify(process.env.npm_package_version).replace('"', '');
env.d.ts
-
env.d.ts
に型を定義します。ない場合はルートディレクりにて作成します。
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
Vue.js側
- Viteでは
import.meta.env.VITE_APP_VERSION
を記述すると環境変数にアクセスすることができます。
<template>
<div>
<span class="version"> ver.{{ version }} </span>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
@Component({
components: {}
})
export class mixinFooter extends Vue {
version: string = import.meta.env.VITE_APP_VERSION || '';
}
</script>
5.index.htmlを移動して修正
試しにこの状態でViteを立ち上げようとすると、下記のエラーになってしまいます。
どうやらindex.htmlファイルをルートディレクトリに持っていかないといけないみたいなので、publicにあるindex.htmlファイルを移動します。
mv public/index.html ./
index.htmlにhtmlWebpackPlugin
と記載されている場合は、該当のコードを削除してしまいます。
- <title><%= htmlWebpackPlugin.options.title %></title>
そして、index.htmlに次の一文を追加します。
<div id="app"></div>
<!-- 下記一文を追加してmain.tsを読み込ませる -->
<script type="module" src="/src/main.ts"></script>
ここで、コマンドラインからyarn dev
でViteを起動してみます。
うまく立ち上がって来たら成功です!
6.不要なファイルを削除する
webpackは不要となったため、ファイルごと削除してしまいます。
- module.exports = {
- presets: [
- '@vue/cli-plugin-babel/preset'
- ]
- }
package.jsonからも削除してしまいます。
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-typescript": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/eslint-config-typescript": "^7.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"sass": "1.32.13",
"sass-loader": "10.2.0",
"typescript": "~4.1.5",
"unplugin-vue-components": "^0.19.6",
"vite": "^2.9.12",
"vite-plugin-vue2": "^2.0.1",
"vue-template-compiler": "^2.6.11",
"vuetify": "2.6.4",
"vuetify-loader": "1.7.3",
- "webpack": "^4.12.1"
},
必要に応じてbabel等も削除してスッキリさせます。
この時点でブランチfeature/vite
と同じになります。
CSSなど自由に書き換えてみて、VueCliとの違いを確かめてみてください。
さいごに
実際にViteを試してみて、HMRの速さに違いに驚きました。これだけ違うとViteを採用される理由がわかる気がします。
また環境変数の読み込みなど、VueCliの時とは若干違う箇所がいくつかあるので、今後もViteを使いながら新しい開発環境にも慣れていこうと思います。
Discussion