はじめに
昔作成したポートフォリオサイトを Vue2
-> Vue3
に移行する。
きっかけ
Windows
で node
の環境を作り、firebase
にデプロイしていたのだが、firebase CLI
のアップデートで、古い node
のライブラリと依存関係が解決できなくなっているようで、ビルドができなくなった。
解決するのも面倒なので、 vue3+vite
の環境に移行するかーと思ったので、これをやってみる。
ちなみに、 portfolio
のプロジェクトは private
リポジトリなので、雰囲気だけ伝わってくれれば…!
どちらかというと、ほぼ作業記録になる。
環境
Windows 10 Professional
WSL2 (Ubuntu22.04 LTS)
VSCode
Docker Desktop 4.20.1 (110738)
Docker version 24.0.2
Docker Compose version v2.18.1
{
"name": "portfolio",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"lint": "eslint . --fix --ignore-path .gitignore"
},
"dependencies": {
"@mdi/font": "^7.2.96",
"animejs": "^3.2.1",
"core-js": "^3.29.0",
"roboto-fontface": "*",
"vue": "^3.2.0",
"vue-router": "^4.0.0",
"vuetify": "^3.0.0",
"webfontloader": "^1.0.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
"eslint": "^8.37.0",
"eslint-plugin-vue": "^9.3.0",
"sass": "^1.60.0",
"vite": "^4.2.0",
"vite-plugin-vuetify": "^1.0.0"
}
}
手順
今回からは node
を Docker
で管理したいため、全てDocker
内で完結するようにする。
Dockerfileの作成
FROM node:18
ARG APP_USER node
RUN apt-get update \
&& apt-get install -y gcc g++ make python3 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /usr/src/app /var/www
RUN chown -R $APP_USER: /usr/src/app /var/www
USER $APP_USER
WORKDIR /usr/src/app
EXPOSE 3000
ENTRYPOINT [ "tail", "-f", "/dev/null" ]
compose.ymlの作成
services:
app:
build: .
volumes:
- .:/usr/src/app
ports:
- 3000:3000
ここまでで、必要なものは揃った。
ビルド
docker compose up -d --build
ビルドを行い、node
が使えるコンテナを用意する。
app-bash:
docker compose exec --user=node app bash
面倒なので、Makefile
を用意して置き、コマンドのエイリアスを定義しておく。
プロジェクトの作成
make app-bash
でコンテナに入り、
yarn create vuetify
で vue3+vite+vuetify-vue-router
の環境を作る。
参考: https://zenn.dev/beeeegle/articles/00311e90cf91be
node@b16088d8a2a5:/usr/src/app$ yarn create vuetify
yarn create v1.22.19
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "create-vuetify@1.0.8" with binaries:
- create-vuetify
[############] 12/12
Vuetify.js - Material Component Framework for Vue
✔ Project name: … portfolio
✔ Which preset would you like to install? › Base (Vuetify, VueRouter)
✔ Use TypeScript? … No / Yes
✔ Would you like to install dependencies with yarn, npm, or pnpm? › yarn
◌ Generating scaffold...
◌ Installing dependencies with yarn...
yarn install v1.22.19
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
info There appears to be trouble with your network connection. Retrying...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 30.28s.
portfolio has been generated at /usr/src/app/portfolio
プロジェクトを1段上にあげる。
mv portfolio/* .
残ったファイルは手動であげとく。
make app-bash
yarn dev
で vite
のデフォルトのページが表示されることを確認する。
※ここで、 vite.config.js
に、 下記の部分を追記しておくこと。
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
+ server: {
+ host: true,
+ }
})
移行
animejsのインストール
make app-bash
yarn add animejs
mdi/fontのインストール
make app-bash
yarn add @mdi/font
※残りはGitHubのコミット履歴を参照
vuetify
のレイアウト修正router.js
,vuetify.js
の修正vuetify2
->vuetify3
で使用できなくなったコンポーネントの修正
残った課題
OptionsAPI
->CompositionAPI
に変える。- レイアウトをもう少しいい感じにしたい…。
ポートフォリオサイト
移行前
移行後
変更点
- ナビゲーションをトップではなくフッターにし、固定にした。
- テーマカラーをダークにした。
/skill
のv-card
内をv-table
にした。
GitHubソースコード
- katsuobushiFPGA/portfolio-vue3
https://github.com/katsuobushiFPGA/portfolio-vue3
上記が作ったものです。
旧ポートフォリオの方は、諸事情により公開できません…。
詰まったポイント
Dockerのユーザ問題
root
ユーザで npm install
, npm run dev
すると、権限周りが面倒なことになるので、 WSL
の ubuntu
ユーザと同じ id
の node
ユーザを使用した。
そのため、 コンテナに入るときは、 node
ユーザを指定している。
viteのlocalhostにアクセスできない。
https://kyoruni.hatenablog.com/entry/vite-docker-localhost を参考にした。
router.jsの正規表現
requireがviteで使えない
参考: https://scrapbox.io/spdbox/Vite%E3%81%A7%E3%81%AFrequire()%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84
参考: https://ja.vitejs.dev/guide/assets.html#new-url-url-import-meta-url
vuetifyのレイアウト修正
GitHubを見てほしい。
特に v-card-title
でwidth
が小さいと折り返されないのは、CSSの知識がなくて時間かかった。
最後は、ChatGPT
に聞いて解決できた。
参考
- Vuetify
https://vuetifyjs.com/en/ - 【Vite*Vue3】コンポーネントライブラリを自作してnpmに公開する手順
https://qiita.com/whopper1962/items/6eaf781b548162205b40 - Docker で Vite 開発サーバーを立てて、ブラウザで表示確認しようとしてつまづいた
https://kyoruni.hatenablog.com/entry/vite-docker-localhost - [Solved] Vue3 Configuration routing error: Catch all routes (“*“) must now be defined using a param with a custom regexp.
https://programmerah.com/solved-vue3-configuration-routing-error-catch-all-routes-must-now-be-defined-using-a-param-with-a-custom-regexp-32886/ - Viteではrequire()が使えない
https://scrapbox.io/spdbox/Vite%E3%81%A7%E3%81%AFrequire()%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84 - 静的アセットの取り扱い
https://ja.vitejs.dev/guide/assets.html#new-url-url-import-meta-url - 【Vuetify 3】基礎設定を考える
https://zenn.dev/viviomega/articles/0c062bffa60488 - Anime.js SVG fill color animation on web page load
https://stackoverflow.com/questions/54492173/anime-js-svg-fill-color-animation-on-web-page-load - Node.js Web アプリケーションを Docker 化する
https://nodejs.org/ja/docs/guides/nodejs-docker-webapp - npm トラブルシューティング
https://qiita.com/hatai/items/ba6eadb758a667345b27 - 最適な Node.js Docker イメージを選択する
https://snyk.io/jp/blog/choosing-the-best-node-js-docker-image/ - 【vue】vuetify3をインストールしてみた話
https://zenn.dev/beeeegle/articles/00311e90cf91be - Vue3でvue-routerを使うときのmain.js
https://note.com/takoyaki_shikibu/n/ne2f3b802e08c - vue-router設定の書き方はVue2とVue3で異なるっぽい
https://note.com/takoyaki_shikibu/n/n88d3660f8539 - Dockerコンテナに一般ユーザーを追加するときのDockerfileの設定
https://qiita.com/Spritaro/items/602118d946a4383bd2bb
おわりに
昔作成したポートフォリオサイトなので、レイアウトやデザインがちょっと微妙な部分があるが、それでもはじめに作ったポートフォリオサイトなので vue3
に移行してそのまま使うことにした。
次回はこれを firebase
か supabase
, vercel
のどれかにデプロイする。
どれが良いかは考えておく…。