dtaniguchi.com

blog - Vue3

Vue Ver.3.4 Release と DevTools

d.taniguchi

2024年4月10日 9:34

Post / コメント

  • TypeScript
  • Vue3

昨年末である 2023/12/28 に、 Vue の Ver.3.4 が Releaseとなった。

The Vue Point “Announcing Vue 3.4”
https://blog.vuejs.org/posts/vue-3-4

Template Parser の全面書き換えによる 44% の SFC コンパイル速度向上や、状態監視の改良により、computed、 effect、 watch、 watchEffect 各関数の呼び出しの実行が、実値更新時のみになるといったパフォーマンス上の改善もさることながら、コーディング上のうれしい改善も 2 つ含まれていた。

defineModel マクロの stable 格上げと、v-bind の shorthand 追加だ。いずれも欲しかった Syntax である。簡単なコンポーネントでどの程度差が出るかを比較する。

Vue 3.3 までのテキスト入力コンポーネント

InputText.vue
<script setup lang="ts">
import { type HTMLAttributes } from "vue"

const props = withDefaults(defineProps<{
  modelValue?: string
  placeholder?: string
  disabled?: boolean
  inputmode?: HTMLAttributes["inputmode"]
}>(), {
  modelValue: "",
  placeholder: "入力してください。",
  inputmode: "text",
})

const emit = defineEmits<{
  (e: "update:modelValue", value: string): void
}>()
</script>

<template>
  <input
    type="text"
    v-model="modelValue"
    :placeholder="placeholder"
    :disabled="disabled"
    :class="{ disabled: disabled }"
    :inputmode="inputmode"
    autocomplete="off"
  />
</template>

Vue 3.4 の defineModel と shorthand を使用したテキスト入力コンポーネント

InputText.vue
<script setup lang="ts">
import { type HTMLAttributes } from "vue"

const text = defineModel({ default: "" })

const props = withDefaults(defineProps<{
  placeholder?: string
  disabled?: boolean
  inputmode?: HTMLAttributes["inputmode"]
}>(), {
  placeholder: "入力してください。",
  inputmode: "text",
})
</script>

<template>
  <input
    type="text"
    v-model="text"
    :placeholder
    :disabled
    :class="{ disabled: disabled }"
    :inputmode
    autocomplete="off"
  />
</template>

可読性の改善は著しい。

現在、私が開発を進めているプロジェクトは昨年の 9 月から始めたものだから、 defineModel はまだ実験段階だった。忸怩たる思いで modelValue の defineEmits を書いていたのだが、どこかのタイミングですべて defineModel に修正したい。

さて、新機能の動作確認当たり Vue Ver 3.4 の初期プロジェクトを Scaffolding tool で生成しようとした際、見慣れない文字列を見つけた。

実験段階の DevTools なるもののインストール確認項目が追加さたようだ。これは非常に興味深い。試しにこれも追加して、開発サーバーを立ち上げたら以下のような画面が表示された。

一見いつもの初期プロジェクトだが、中央下に小さなアイコンがある。これが追加された DevTools らしい。Vue アイコンをクリックすると以下の画面が出てきた。

新しい DevTools はブラウザの拡張機能ではなく、開発中プロジェクトのページ上に表示されるらしい。なるほどと思い次の項目を選択して驚愕した。

現在ブラウザで表示している Path の画面内に存在するコンポーネント一覧がツリーで表示されるのだ。ご丁寧なことに、それが画面上のどの DOM で そのコンポーネントの props には何が設定されているのかまで分かる。

Toggle Component Inspector を有効にすると、Hover 中の DOM が何のコンポーネントで、どのファイルの何行目のコードで生成されているか分かる。

これまで表示している画面上の UI が、何のコンポーネントで、それはどのファイルでどこにあり、どの様に呼び出されているかは、ソースコードを読まなければ分からなかった。コンポーネントの構造にルールを設け、より直感的に UI 部品の構成を理解できるように考え出されたのが Atomic Design だ。

私がテックリードを務めるプロジェクトでは、コンポーネントのルート要素のクラス名に命名規則を設けることで、コンポーネントが簡単に特定できる工夫をしていた。これは必要なくなる。

これは小さからぬ事件ではないだろうか。フロントエンド開発のベストプラクティスを前進させている。

担当になりたての既存プロジェクトで改修対象のファイル特定のため、レンダリング後の HTML の中からキーワードを拾って Grep 、ファイルを特定するなどという非効率な作業は消滅する。Storybook では Page Component まで定義する必要がなくなるかもしれない。

このツールには他に、有効な画面の Path 一覧、プロジェクト内の画像ファイル一覧、Pinia の 状態表示、コンポーネント間の依存関係グラフ表示などの機能があった。Vite にしても、この DevTools にしても、Vue Framework の開発力と発展速度には恐れ入るばかりだ。

これほどのものなら、現在開発中のプロジェクトで試したくなる。たった 3 行の追加と Package インストールで使用可能になる。

package.json
{
  // 省略
  "devDependencies": {
    // 省略
    "vite-plugin-vue-devtools": "^7.0.25", // 追加
    // 省略
}
vite.config.ts
import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import VueDevTools from 'vite-plugin-vue-devtools' // 追加

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    VueDevTools(), // 追加
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

DevTools の公式によると Vue3 であればどのバージョンでも対応するそうである。Ver 3.3.10 で開発をスタートした私のプロジェクトではすんなり動いた。UI の Hover で、コンポーネントごとにファイル名が表示された時は感動があった。残念ながらその様子をここでお見せすることは出来ないが、コンポーネントグラフであれば問題ないので残しておこう。

不必要な関数やコンポーネントの発見、削除に役立ちそうだ。

Vite が Docker で動作しない

d.taniguchi

2023年9月23日 22:55

Post / コメント

  • Docker
  • Tips
  • Vite
  • Vue3

Vue3 による新規開発プロジェクトが始まり、プロジェクト基盤の整備を行っている。

Scaffolding tool で 初期 Project を生成、Router や Linter、Validator 等、使用ライブラリの選定・設定や、環境毎の DI 設定など、前準備の真最中だ。

概ね必要な部品群は揃い、いよいよ Dockerfile を追加して docker-compose で画面が立ち上がれば準備完了という段に来て、これまで堅調に進んでいた構築作業は水を差された。これは恒例行事だった。Docker の設定、この作業がスムーズにいった試しはない。悪いことに、今回はいつも以上にしぶとい抵抗を見せるのだった。どうやっても Vite が下記のエラーで立ち上がらない。

Segmentation fault

この時の Vite の Version は 4.4.9 、Docker for Mac の Version は 4.23 であった。調べてみると Docker の GitHub リポジトリに Issue が立っていた。

https://github.com/docker/for-mac/issues/6824

このエラー、 Docker の開発陣にも原因がよく分かっていないようだった。以下条件で発生するという。

  • Intel Mac の一部機種
  • Node Version 18 〜 20 で実行
  • Docker for Mac Version 4.19 以上
  • Docker ではなく、 Mac の Hypervisor の問題

CPU に Core i7 や i9 を搭載している機種で多く発生していて、 i5 だと動くことが多いようである。私の使用していた iMac は i9 だ。手元に i5 搭載の MacBook があったのでこちらにリソースを移して docker-compose をたたいてみたらすんなり動いた。

問題が発生しても対応は簡単で、Docker の GUI から Setting > General 内にある VirtioFS のチェックを osxfs(Legacy) に変更、Use Virtualization framework のチェックを外せばいいだけである。

これにより Vite が立ち上がるようになった。

React18 にするか、Vue3 にするか

d.taniguchi

2023年9月22日 19:14

Post / コメント

  • React
  • Vue3

ありがたいことに、2023年9月より再び Frontend のリードエンジニアとして新規開発プロジェクトに参画している。しかも、今回 Frontend の担当者は私1人だけだ。

CTO、BE、FE にそれぞれ一人、総勢3名の小さなチーム。開発予定のソフトウエアはまだ構想のみ、要件定義も、画面デザインも何もないところからスタートである。私の最初の課題は技術選定だ。

仕様を考慮すると SPA が最善という結論に至ったが、フレームワークを React 18 にするか Vue 3 にするかはすぐ選ぶことができなかった。 Web 業界では、 Vue が一世を風靡したかと思ったら、また React へ軸足を戻してしまった。理由はよくわかる。 Vue がとどまることを知らない素晴らしい進化を続けるからだ。 Vite を生み出し、あっという間に TypeScript に対応、さらにデフォルトの API まで変更したと思ったら、 Vue2 の 2023 年末 EOL まで決めてしまった。背筋の凍る早さだ。 Vue3 には破壊的変更がある。Vue2 からたやすく移行を行えない。

今回案件探しをしている中に、 Vue2 から Vue3 への移行プロジェクトがあった。 Vue3 に触ってみたいだけの気軽さで応募したところ、「移行経験ない人お断り!」とけんもほろろに断られてしまった。この切迫感、当然である。いつ自分たちで修正不能なクリティカルレベルの脆弱性が見つかるとも知れないプロダクトが本番環境で動いていると思うとゾッとする。いや、むしろもうすでに山のような・・・。

Vue2 の公式では、やや申し訳なさそうに Vue3 はどうしても破壊的変更が不可避だったこと、 Vue2 の EOL 、そして今後のリリースは、下位互換を大切にしたいとする思いが語られている。

https://v2.vuejs.org/lts/#Upgrade-to-Vue-3

信用できない。長期的な運用を考慮するとやはり Vue を選ぶのは怖い。 React を Vite で動かすのが現状最善と考え CTO に提案したら、是非 Vue を採用してほしいと頼まれてしまった。

かくして私は Vue3 開発を行うことになったのだった。React であれば新鮮さもないが、Vue3 だと新しいことだらけだ。TypeScriptへの対応ぶり、Composition API の書き心地など、今から楽しみなのである。