Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Viteに移行した話とVue-demiでVue2と3両対応のコンポーネントを作った話
Search
M.Yoshikawa
October 16, 2022
Programming
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Viteに移行した話とVue-demiでVue2と3両対応のコンポーネントを作った話
M.Yoshikawa
October 16, 2022
Other Decks in Programming
See All in Programming
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
250
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
440
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
App Intentsのビルドプロセスを支える技術
kntkymt
0
250
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
スマート反転とウェブアクセシビリティ
camiha
0
180
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
220
Marketing to machines
jonoalderson
1
5.8k
Navigating Team Friction
lara
192
16k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Docker and Python
trallard
47
4.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
330
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
Viteに移行した話とVue-demiで Vue2と3両対応のコンポーネント を作った話 株式会社フォーエス 吉川 真司
自己紹介 株式会社フォーエスで、社内の実験的な技術開拓を行うエンジニアをしていま す。 以前は、LAMP環境のサーバー構築やメンテ、PHPなど主にバックエンドをメ インにやっていましたが、現職では上記以外にもJavaもやったりしています。 今後のキャリアプランとしてUXを極めたいと考えており、その上でLaravelを 通じて知ったのがVueです。
Vue CLIが重い! 以前WikiシステムでjQueryの代わりに部分的に使っていたVueが思いの外早 かったので、FEで完結するシングルページアプリケーションを作ってみようと 考え、試しにゲーム用の地図サイトをVue2とVueCLIを使って作っていました。 しばらく、VueCLIでプロダクトを開発していたが、だんだん処理が重くなり 開発サーバーが起動するまで1分半かかるようになってきました。
また、Node 17になってからOpenSSL周りの仕様が変わり、そもそもVueCLI のミドルウェアであるWebpackが動作しなくなりました。 そんな中Viteというのが話題になっており、完全に見切り発進の状態で移行す ることにしました。
Viteへの移行 そこで、 ViteをVue2で動くよう改造(当時はvite-plugin-vue2を使っていまし た)し、 最小限構成で動かすvite-vue2-starterというプロジェクトを作りまし た。これは、今まで使用していた環境(eslint設定など)を移植したものです。 https://github.com/logue/vite-vue2-ts-starter このような、最小限構成のテンプレートプロジェクトを作ることにより、最新
への追従コストを下げることに成功しました。 また、当初は開発言語を JavaScript から TypeScript に移行していた時期で、 開発例として多かった vue-property-decorator と vue-class-components を用 いて作成していました。
Composition APIへの移行 早くなったのは良かったのですが、その直後デフォルトでインストールされる Vueが3になったことで、早々に困ったことになりました。 UIフレームワークにVuetifyとBootstrapVueを採用していましたが、Vuetifyはα 版、BootstrapVueは開発計画どころか、Bootstrap5にも対応していない状態で あり、Vue3に移行するのは時期尚早であるというのと、Vue3からは今までの書 き方が使えずComposition
APIになるということでそれまで作っていたvue- property-decoratorが実質使えなくなる(可能性が高い)ということでした。 そこで出した結論は、当面Vue2を使いつつもComposition APIに移行し、各種UI フレームワークが対応次第Vue3に移行するということでした。 また、同時期に発見したVue demiでVue2/Vue3両対応のプログラムが書けると いうことと、そのライブラリがComposition API前提だったというのも後押しし ました。
Vue-demiで作るvue-codemirror6コン ポーネント 自分は昔から、編集フォームにも適応できる便利なシンタックスハイライター でとして CodeMirror 好んで使っており、Vueに移行した後もvue-codemirrorを 使っていました。 以下のようにシンタックスハイライトができて、かつ編集可能なのが特徴です。
未完ながら、昔PukiWIki文法用のCodeMirror用のプラグインを作ったりしてい ました。
Vue-demiで作るvue-codemirror6コン ポーネント しかし、vue-codemirrorは当時長らくメンテされておらず、最新の CodeMirror6 に対応していませんでした。 当時作っていたVueプロダクトで、直接APIを叩く形でCodeMirror6を使ってお り、自力でラッパーを作っていたのでこれを外部化しようとしていたところ Vue-demiという便利なライブラリがあることに気づきました。
Vue-demiは、Vue2とVue3両対応のライブラリをビルドするためのラッパーラ イブラリです。 初期バージョンはVue2向けにpropertey-decoratorで作っていましたが、vue- demiに対応させるためプロダクト側のComposition API化と並行して作業を行 いました。 以降、これ以外のコンポーネントでもComposition API化と疎結合化をすすめ、 コンポーネントの開発はVue3で行い、それをVueDemiでVue2に移植するという 方針で行っています。
Markdownエディタの例 今回のvie-codemirror6で作ったリアルタイムMarkdownエディタです。v-modelで動くようにしてあり、左のエディタで Markdownを編集するとリアルタイムで右ペインのMarkdown-wasmによるプレビューが反映されます。
Vue-demiでハマったところ Vue-demiでVue2用のコードとVue3用のコードを共通化するところまではでき ましたが、いざビルドしてみるとVue2環境でビルドしたものとVue3環境でビル ドしたもので互換性のないコードになってしまう問題が発生しました。 原因を探るとVueのh関数の差を吸収するコードが無いことが原因でした。 そこで、vue-demiのisuue( https://github.com/vueuse/vue-
demi/issues/65)に上がっていたh-demi.tsをカスタマイズしたものを使うこと で解決しました。
困った事 この記事を執筆した当時、UIフレームワークのVuetifyがVue3に対応していない ことも有りViteでスターターテンプレートを作ってメンテナンスしていました が、vue-tsc側でvue2で許容されている書き方でNGとされる部分が増えてきた ため、そろそろ限界が来ています。(例:v-checkboxのv-modelとvalueを併用 するパターン)
所感 CompositionAPIへの移行はコツを掴んでしまえばあっという間に終わりました。 今年の2月から3ヶ月かけてすべてのプロダクトの移行が完了しました。 試しにVue3で動かしてみましたが、UIライブラリ(Vuetify3 v3beta)の実装状況に 起因するエラー以外はすんなり動きそうでした。
ただ、説明サイトを見るだけだとやっぱりメリットを見出すのは難しいです。実際 手を動かして作業することで気がつくことが多いです。 少なくとも2013年頃から自分は、言語を問わずコード整形ツールを活用する習慣が あり、Vueを触った当初からeslintやprettierの設定をキツ目にしていました。 また、たまたま自動インストールされたsonarlintがvueのtypescriptにも作用したた めトラブルが少なかったというのも考えられます。(それでも、v-modelに.sync修 飾子がついている前提で使用するライブラリがあって悩んだことがありますが)
作ったミドルウェアの紹介 vite-vue2-starter Viteでvue2を使うための最小限のライブラリを集めたスターターテンプレート vite-vue2-vuetify-ts-starter 上記のテンプレートにVuetifyを追加したもの @logue/vue2-helpers Vue2でVue-routerやVuexなどをVue3風のComposition
APIで書くためのラッ パーライブラリ。これのフォーク版を作り、VuetifyとVue3のteleportに対応さ せた。 vue-inertia-composable Laravel9用Laravel BreezeをVue2でも使えるようにするためのミドルウェア。