はじめに

昔作成したポートフォリオサイトを Vue2 -> Vue3 に移行する。

きっかけ

Windowsnode の環境を作り、firebaseにデプロイしていたのだが、firebase CLIのアップデートで、古い nodeのライブラリと依存関係が解決できなくなっているようで、ビルドができなくなった。
解決するのも面倒なので、 vue3+viteの環境に移行するかーと思ったので、これをやってみる。
ちなみに、 portfolio のプロジェクトは privateリポジトリなので、雰囲気だけ伝わってくれれば…!
どちらかというと、ほぼ作業記録になる。

環境

1
2
3
4
5
6
7
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "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"
  }
}

手順

今回からは nodeDocker で管理したいため、全てDocker 内で完結するようにする。

Dockerfileの作成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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の作成

1
2
3
4
5
6
7
services:
  app:
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - 3000:3000

ここまでで、必要なものは揃った。

ビルド

1
docker compose up -d --build

ビルドを行い、node が使えるコンテナを用意する。

1
2
app-bash:
	docker compose exec --user=node app bash

面倒なので、Makefileを用意して置き、コマンドのエイリアスを定義しておく。

プロジェクトの作成

1
make app-bash

でコンテナに入り、

1
yarn create vuetify

vue3+vite+vuetify-vue-routerの環境を作る。
参考: https://zenn.dev/beeeegle/articles/00311e90cf91be

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 "[email protected]" 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段上にあげる。

1
2
mv portfolio/* .
残ったファイルは手動であげとく。
1
2
make app-bash
yarn dev

vite のデフォルトのページが表示されることを確認する。

setup-vuetify

※ここで、 vite.config.js に、 下記の部分を追記しておくこと。

1
2
3
4
5
6
7
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
+ server: {
+   host: true,
+ }
})

移行

animejsのインストール

1
2
make app-bash
yarn add animejs

mdi/fontのインストール

1
2
make app-bash
yarn add @mdi/font

※残りはGitHubのコミット履歴を参照

  • vuetify のレイアウト修正
  • router.js, vuetify.jsの修正
  • vuetify2 -> vuetify3 で使用できなくなったコンポーネントの修正

残った課題

  • OptionsAPI -> CompositionAPI に変える。
  • レイアウトをもう少しいい感じにしたい…。

ポートフォリオサイト

移行前

prev-portfolio.gif

移行後

after-portfolio.gif

変更点

  • ナビゲーションをトップではなくフッターにし、固定にした。
  • テーマカラーをダークにした。
  • /skillv-card内を v-tableにした。

GitHubソースコード

上記が作ったものです。
旧ポートフォリオの方は、諸事情により公開できません…。

詰まったポイント

Dockerのユーザ問題

root ユーザで npm install, npm run dev すると、権限周りが面倒なことになるので、 WSLubuntuユーザと同じ idnodeユーザを使用した。
そのため、 コンテナに入るときは、 nodeユーザを指定している。

viteのlocalhostにアクセスできない。

https://kyoruni.hatenablog.com/entry/vite-docker-localhost を参考にした。

router.jsの正規表現

参考: https://programmerah.com/solved-vue3-configuration-routing-error-catch-all-routes-must-now-be-defined-using-a-param-with-a-custom-regexp-32886/

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-titlewidthが小さいと折り返されないのは、CSSの知識がなくて時間かかった。
最後は、ChatGPT に聞いて解決できた。

参考

おわりに

昔作成したポートフォリオサイトなので、レイアウトやデザインがちょっと微妙な部分があるが、それでもはじめに作ったポートフォリオサイトなので vue3 に移行してそのまま使うことにした。
次回はこれを firebasesupabase, vercelのどれかにデプロイする。
どれが良いかは考えておく…。