Vue.jsはより速く、より小さく!〜Evan氏の来日講演から読み解くVue 3の進化〜

こんにちは。Monaca/Cordova担当の内藤です。
今年(2018年)の11月3日に、秋葉原 UDXでVue Fes Japan 2018が開催されました。Vue.jsの開発者であるEvanさんをはじめ、Vue CLI UIクリエーターのGuillaumeさん、Microsoft シニアデベロッパーアドボケイトのSarahさん、Vue Test UtilsメインクリエーターのEddさんらをお招きしています。
開発者であるEvanさんの基調講演では、新しくリリースが予定されているVue 3.0の概要について、お話いただきました。Vue 3.0の特徴として、以下の点を解説していただきました。
- より速く
- より小さく
- よりメンテナンスしやすく
- よりネイティブ向けに作りやすく
- よりあなたのコードの保守性を向上

どれも魅力的な改善点ですが、このブログ記事では特に、コンポーネントやレンダリングのロジックの変更されたいくつかの点についてクローズアップして、現在の最新安定板であるVue 2.5との比較しながら、見ていきたいと思います。講演でも説明されていましたが、「アプリ全体の速度が2倍に、そして、メモリ使用量が半減」というのは本当にすばらしいです。時間の関係で今回説明された部分以外にも、随所に工夫がされているのではないかと思います。
なお、仮想DOMの実装は、フルスクラッチから作り直しということなのですが、呼び出し方はほぼVue 2.x系のものと同様で、互換性は担保されているとのことですので、安心して開発に利用出来るようです。
Vue Fesでの講演スライドは、こちらで公開されています。
スライドの日本語翻訳は弊社代表の田中が行ないました。日本語スライドで何か気づいた点などありましたらコメントして下さい。
プロキシを用いた監視で、完全な言語レベルでの監視と、速度向上

Vueをはじめ、データバインディングを行うフレームワークでは、データのプロパティの変化を監視しておく必要があります。これまでのVueでは、Object.defineProperty メソッドを利用して、getter、setterをオーバーライドすることで実現していました。
しかし、Vue 3.0では、このObject.definePropertyメソッドは利用せず、ネイティブプロキシを使うことで高速化されたということです。スライドでも
"プロキシを用いた監視で完全な言語レベル & 速度向上"
"Proxy-based observation mechanism with full language coverage + better perf"
と説明されていました。
実際のコードがどうなっているのかは、Vue 3.0のコードが公開されるまで分かりませんが、おそらく、ES2015から導入されたProxyクラスを使って次のようになっているのではないかと思います。
new Proxy(target, {
get(target, name, receiver) {
var value = Reflect.get(target, name, receiver);
// 依存性の設定
return value
},
set(target, name, value, receiver) {
// 変更の通知
Reflect.set(target, name, value, receiver);
}
});
一方、現状のVue 2.5では、内部でdefineReactiveという関数の中で、次のようにdefinePropertyメソッドを使って、オブジェクトのgetterやsetterをオーバーライドして、大まかに次のような処理を行なっています。
Object.defineProperty(obj, key, {
...
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
// 依存性の設定
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj)