Vue.jsの環境構築 =========================== Vue.jsは日本で人気のあるウェブフロントエンドのフレームワークです。柔軟な設定のできるCLIツールが特徴です。本書では3系についてとりあげます。 .. code-block:: bash $ npx @vue/cli@next create myapp 作成時に最初に聞かれる質問でdefaultのpreset(babelとeslint)ではなく、Manually select featuresを選択します。 .. figure:: images/vue-cli-1.png TypeScriptを選択する場合はManually select featuresを選択 次のオプションで必要なものをスペースキーで選択して、エンターで次に進みます。選んだ項目によって追加の質問が行われます。Routerやステート管理などのアプリケーション側の機能に関する項目以外にも、LinterやユニットテストフレームワークやE2Eテストの補助ツールなど、さまざまなものを選択できます。 .. figure:: images/vue-cli-1.png TypeScriptを選択する場合はManually select featuresを選択 途中で、クラスベースかそうではないか、という質問が出てきます。以前ではクラスベースのAPIの方がTypeScriptとの相性がよかったのですが、Vue.js3からの新しいAPIで、クラスベースでない時も型チェックなどに優しいComposition APIが追加されました。そこはチームで好きな方を選択すれば良いですし、あとから別のスタイルにすることもできます。 .. figure:: images/vue-cli-2.png 必要な機能を選択する 現在のVue.jsのプロジェクトのほとんどは、\ ``.vue``\ ファイルに記述するシングルファイルコンポーネント(SFC)を使っていると思いますが、TypeScriptを使う場合、スクリプトタグの\ ``lang``\ 属性を\ ``ts``\ になっています。 .. code-block:: html クラスベースのコンポーネント ----------------------------------------- クラスベースのコンポーネントはvue-class-componentパッケージを使い、デコレータをつけたクラスとして実装します。クラスのインスタンスのフィールドがデータ、ゲッターが算出プロパティになっているなど、TypeScriptのプレーンな文法とVueの機能がリンクしており、ウェブフロントエンドを最初に学んだのではなく、言語としてのTypeScriptやJavaScript、他の言語の経験が豊富な人には親しみやすいでしょう。環境構築のCLIのオプションではデフォルトでこちらになるような選択肢になっています。 以下のコードはVue.js 3系のクラスベースのコンポーネント実装です。 .. code-block:: ts これをラップしてより多くのデコレータを追加したvue-property-decoratorというパッケージもあります。こちらの方が、\ ``@Prop``\ や\ ``@Emit``\ でプロパティやイベント送信も宣言できて便利でしょう。 * https://www.npmjs.com/package/vue-property-decorator .. warning:: ただし、現時点で3.0系で変わったvue-class-componentの変更にはまだ追従していないように見えます。 関数ベースのコンポーネント作成 ----------------------------------------- Vue本体で提供されている\ ``defineComponent()``\ 関数を使いコンポーネントを定義します。今までのオブジェクトをそのまま公開する方法と違い、この関数の引数のオブジェクトの型は定まっているため、以前よりもTypeScriptとの相性が改善されています。このオブジェクトの属性で名前や他の依存コンポーネント、Propsなどを定義するとともに、\ ``setup()``\ メソッドでコンポーネント内部で利用される属性などを定義します。 .. code-block:: ts .. note:: **Nuxt.jsを使ったプロジェクト作成** Vue.jsにも、Vue.jsをベースにしてサーバーサイドレンダリングなどの自分で設定すると大変な機能がプリセットになっているNuxt.jsがあります。 Nuxt.jsの場合は、通常の設定の後に、いくつか追加のパッケージのインストールや設定が必要です。日本語によるガイドもあります。 * https://typescript.nuxtjs.org/ja/guide/setup.html ただし、現時点ではVue.js 3対応はまだ計画中でリリースはまだ行われていません。 Vue.jsを使ったjQueryのリプレース -------------------------------------------------------- jQueryは歴史があるライブラリで、使い勝手の良さから、非フロントエンド開発者にも広く普及しました。一方で、開発が大規模化する場合に整合性をとるのが難しくなってくることが多く、フロントエンドの比重が高まるにつれて、ReactやVue.jsを使う人が増えています。 jQueryからVue.jsへはパラダイムがかなり違うので、多少コーディングが必要となります。jQueryは、セレクタでマッチしたHTMLのタグを直接変更していきます。一方、最近のウェブフロントエンドのフレームワークはTypeScript内部に状態を持ち、それを画面に反映させる、という形をとります。反映するときはテンプレートエンジンのような記法を用いて表現します。VueやReactは仮想DOMという仕組みを使っており、ビュー関数を頻繁に実行し、その結果を画面に反映します。 jQueryの方が、極めて簡単なことをする場合は短いコードで済むことがあります。一方、変更が多くなると更新が複雑になります。 * 同じ値を何度も表示する場合、VueやReactの場合、大元の変数を変更するとすべての箇所が変わります。jQueryでは利用箇所をすべて自分で見つけて更新しなければなりません。 * テーブル表示など、表示先の階層が深くて場所の特定も大変な場合にはロジックが複雑になります。 * 確認ダイアログを出してOK/Cancel時に別のダイアログを出してという場合には、次のダイアログを表示にする、前のダイアログを非表示にする、といったように、すべての変更を1つずつ適用していかなければなりません。状態遷移が複雑になってくると、一箇所の修正漏れで画面の遷移がおかしくなります。VueやReactであれば、現在の遷移はどこか、という情報を1つもち、それをみるようにすると、扱う状態が少ない分、ミスが減ります。 次のようなシンプルなjQueryのコードをVue.jsにしてみましょう。 .. code-block:: html
jQuery test page
ここで使っているjQueryの機能は3つです。 * ``click()``\ でボタンのクリックのイベントハンドラの設定 * クリック時に\ ``addClass()``\ でCSSのスタイルの変更 * クリック時に、\ ``fadeIn()``\ を使って隠された要素の表示 まずはそのまま.vueファイル化 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ まずはプロジェクトを作り、既存のHTMLファイルを取り込みます。この説明では次の想定で進めます。 * プロジェクトはvue-cliで作成 * 対象バージョンはVue.js 3で、クラス形式のコンポーネントではない関数ベースのコンポーネントを利用 * ルーターを利用 jQueryと比較した場合の、Vue.jsの大きく違うポイントは次の通りです。 * Vueは特定のノード以下のみをプログラムで変更可能にする * 1つのHTMLを元にページ切り替えを実現できる(シングルページアプリケーション) 元のjQueryでシングルページアプリケーションを実現しているケースはほとんどないと思うので、いったん、元のプロジェクトは複数ページから構成されているものとして話を進めます。 まず、複数のページであっても、1つのHTMLとTypeScriptコードで実現します。今まで共通のヘッダーなどを個別に実装していた場合はベースのHTML側に書いておけば共通で利用されます。複数のページで違いの発生する部分のみを.vueファイルにします。 まずはjQueryをライブラリに追加します。 .. code-block:: bash $ npm install jquery @types/jquery 次に、.vueファイルを作成します。これはHTML、CSS、スクリプトが1ファイルにまとまった、シングルファイルコンポーネントと呼ばれるものです。\ ``