派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】DeNA×ITSTAFFING~ハンズオン勉強会~Vue.jsでコンポーネント入門!

株式会社リクルートスタッフィング(以下ITSTAFFING)と、株式会社ディー・エヌ・エー(以下DeNA)が共同で開催するDeNAスキルアップイベントが開催されました。

f:id:pinq4387:20160728013649j:plain

今回のイベントは、前回に引き続き「Vue.js」がテーマ。前回のイベントでは、Vue.jsのMVVM入門編を行いましたが、今回はDeNAの開発現場で使われているVue.jsの使い方を掘り下げて紹介するというものです。

Vue.jsはWeb Componentsと似たコンポーネントシステムを採用しており、再利用可能なパーツを作る仕組みがあります。これをいかにうまく活用するか、そのためのコツが語られました。

Web Componentsとは何か?

今回、講師を務めてくださったのは、DeNAでフロントエンジニアとして新規サービスの開発を行っている遠藤直樹さん。大学在学時からDTPやWebデザインに携わり、ベンチャー企業でデザイナー、イタリアンレストランでシェフを経験した後、Web広告制作会社で3年半勤務。2015年にDeNAに転職し、現在はエンジニアとして活躍しています。

f:id:pinq4387:20160728014235j:plain株式会社ディー・エヌ・エー 遠藤直樹さん

イベントでは本題に入る前に、Web Componentsとは何かという説明から始めてくださいました。Web Componentsとはひと言で言うと、Webの再利用可能なパーツ作成の仕様のことです。

つまり、

・HTML、CSS、JavaScript3つの専用言語での構成
・HTMLの複雑な入れ子構造
・CSSの意図しない適用範囲
・JavaScriptのDOM構造への依存

といった、これまで再利用可能なパーツを考える際に悩んでいたことを、Web Componentsは解決してくれるのです。

構成するリソースは次の通りです。

1.Custom Elements ユーザーが独自のカスタム要素を定義
2.HTML Imports 断片化したHTMLファイルをロード
3.HTML Template ブラウザネイティブなテンプレート機能
4.Shadow DOM HTMLにスコープを形成

Web Componentsを利用するメリットは複雑な文法構造をなくし、マークアップがすっきりすることと、スタイルの適用範囲を絞り込めること。この2点により作成者側の意図したことが伝わり易くなります。さらに複雑な構造を外部から見えなくすることができることもメリットのひとつです。

しかしながら、以下の表を見ればわかるとおり、すべてのブラウザが対応しているわけではありません。

この仕様はGoogle主導で進んでいるものなので、Google Chromeが対応しているのはよいのですが、ユーザーの多いInternet ExplorerやMicrosoft Edgeでは進んでおらず、ブラウザベンダーによって足並みがバラバラです。

Polyfillもありますが、PolymerやX-Tagなどのライブラリでもプロダクトで使われていることはほとんどありません。

今年で開発4年目となるので、そろそろ仕様として固まりつつあるとは思うものの、現状Web Componentsの採用は難しい。そこで注目したのがVue.jsです。

f:id:pinq4387:20160728122101j:plain

Vue.jsで再利用可能なコンポーネントを作成する

Vue.jsには次の2つの重要なコンセプトがあります。

・リアクティブデータバインディング
・コンポーネントシステム

Vue.jsのコンポーネントシステムは、Custom Elementsの仕様に沿った構文を提供しています。

例えば大規模アプリケーションでもVue.jsなら次のようにわかりやすい構造で作ることができます。

ここまで説明をしたところで、実際にコンポーネントを作成してみることに。作成するのはCodePen。以下のURLからPenをForkします。

hands-on-vuejs-vol2-0 http://codepen.io/naokie/pen/rLwLyd

途中経過を間違って消してしまわないように、ForkするときにログインまたはSave as Anonymousするようにという注意がありました。

前回の成果物の機能についての復習。成果物の概要は次の通りです。

f:id:pinq4387:20160728122234j:plain

NewTaskというインプット要素にテキストを入れてAddボタンを押すと、新しいタスクを作り、Deleteボタンを押すと、タスクを消すことができます。またチェックボックスにチェックが入り、一番下に残タスクの合計数が表示されています。
この実装テンプレートは次の通りです。

Vol.1 テンプレート

f:id:pinq4387:20160728125001j:plain

Vol.1 Vue インスタンス

f:id:pinq4387:20160728125250j:plain

これを基にコンポーネントを作成していきます。
まず考えなければいけないのが再利用可能な単位です。

1.同じページで繰り返し表示する(リスト表示)
2.サイト内で繰り返し利用する(ウィジェット表示)

今回作成するコンポーネントはTodoコンポーネントとAppコンポーネントです。

Todoコンポーネントを作成する

まずはTodoコンポーネントを作成します。
該当するHTML Templateを切り出します。

そして切り出した箇所をカスタム要素で置き換えていきます。

コンポーネントインスタンスはそれぞれスコープを持っているので、このままではTodoコンポーネントは、表示するデータを参照できません。そこで、コンポーネント間のデータを伝達するためにpropsオプションを使います。

f:id:pinq4387:20160728211653j:plain

Propsを使う

props には、.sync と .onece の2つの修飾子があります。
それぞれ、親子間でデータを同期する two-way バインディングや、一度セットアップしたらその先の変更を同期しない one-time バインディングをすることができます。使用者がコンポーネントを正しく使うことを確実にするため、検証要件の設定も可能です。

これでTodoコンポーネントを実際に作っていくと、以下のようになります。

コンポーネントの作成

f:id:pinq4387:20160728130003j:plain

Vue.extendと書いてそこにオプションとしてインスタンスを作ったときと同じようなプロパティを設定していくとTodoコンポーネントが完成します。todo というプロパティが渡されなければ、タスクを表示することができないため、 required: true としておきます。

続いてコンポーネントを登録します。todoというタグの名前で、コンポーネントを登録します。todoと言う名前はHTMLの制約上、大文字小文字の区別がありません。ここではアンダースコアやキャメルケースとかは使用できないので、注意してください。

ここまでできたら、以下の4つの動作が正しく動くか、確認をします。

・チェックマークの付け外し
・新規タスクの登録
・タスクの削除
・残タスクのカウント表示

タスクの削除が動作しなくなっているはずです。

タスクの削除についての該当するソースコードは次の箇所です。

<button v-on:click="deleteTodo(todo)">Delete</button>

deleteTodo(todo)というメソッドが、今回作成したTodoコンポーネントには、まだ存在しません。

f:id:pinq4387:20160728211913j:plain

ここで一度考えなければならないのが、データ操作と表示の役割分担です。
今回、データ(タスクのリスト)は親コンポーネントが持つこととします。データ操作も親コンポーネントの役割です。子コンポーネント(Todoコンポーネント)はユーザーのアクションに対して、イベントを通知するだけとします。すると、親子間でイベントの管理が必要になってきます。

そこで使用するのがVue.jsのカスタムイベントです。これを使うと、コンポーネント間のイベント通信ができるようになります。コンポーネント間のイベント通信の種類は以下の通りです。

・$on() を使用してイベントをリッスンします
・$emit() を使用して自身のイベントをトリガーします
・$dispatch() を使用して親方向にイベントを送出します
・$broadcast() を使用して子孫方向にイベントを送出します

では実際にTodoコンポーネントからイベントの送出をしてみましょう。

f:id:pinq4387:20160728130816j:plain

続いて親コンポーネントでイベントをリッスンします。

f:id:pinq4387:20160728131107j:plain

データ操作の処理内容は、前回作成したインスタンスメソッド(deleteTodo)と同じなので、そのままコピーしてしまいます。

ここまででうまく動かなかった場合は、以下のURLに成果物が置いてあるので、ぜひ、見比べて間違いを正してください。

・hands-on-vuejs-vol2-1  http://codepen.io/naokie/pen/qNjNAw

Appコンポーネントを作成する

次はAppコンポーネントの作成方法についてです。Appコンポーネントは小さなアプリ(ウィジェット)をコンポーネント化するというもの。手順はTodoコンポーネントを作成した時と同様で、まずはテンプレートを切り出すところから始めます。

f:id:pinq4387:20160728131557j:plain

続いて切り出した箇所をカスタム要素で置き換えます。ただし、このままだとカスタムタグ1個に対して、4つのタグで構成されてしまいます。そこで1つのカスタムタグに1つのタグにするために、ラップするようなタグを用意し、コンポーネントを作成します。

f:id:pinq4387:20160728131849j:plain

続いてコンポーネントを登録し、先と同様に再び動作の確認を行います。

f:id:pinq4387:20160728132019j:plain

すると、残タスク数の表示や新規タスク登録の動作がおかしくなっているので、修正を行います。

まずは残タスク数表示の修正から。算出プロパティremainsはAppコンポーネントのスコープで閉じているので、親コンポーネントの中ではなく、Appコンポーネントの中から使えるように修正します。

続いて新規タスク登録の修正を行います。データ操作は親コンポーネントが持っていた、addTodoの処理内容をAppコンポーネントの方にそのまま持ってきて、Appコンポーネントからイベントを送出するようにします。

f:id:pinq4387:20160728132305j:plain

データの操作は親コンポーネントに任せます。

f:id:pinq4387:20160728132350j:plain

newTaskは親コンポーネントにdataプロパティを定義していましたが、それを消し、Appコンポーネントに必要なdataプロパティとして移植します。

ここまで書くと、親コンポーネントにあったmethodsプロパティが一切なくなりました。親コンポーネントはデータを保持してイベントに対して、そのデータを操作するだけの構成になっています。

修正が終わったら再度、動作を確認します。これでAppコンポーネント完成。再利用可能なパーツも以下のように完成しました。

f:id:pinq4387:20160728132540j:plain

ここまでの成果物は以下のURLにあるので、うまく動かなかった人は確認してみましょう。

・hands-on-vuejs-vol2-2  http://codepen.io/naokie/pen/oLwLAj

最後はNewTaskコンポーネントを作成する演習

最後はNewTaskコンポーネントの作成を実際にやってみることに。先ほど作ったNewTaskをnew-taskというカスタムタグで使えるようにするという演習です。

テンプレートの切り出しの方法について説明をした後、参加者は先ほど、習った内容を元に各自プログラミングします。

途中でつまずいたり、プログラミングが完了してもうまく動作しないことがあっても、DeNAの皆さんが優しくサポートしてくれるので、安心してハンズオンに取り組むことができました。

f:id:pinq4387:20160728210706j:plain

プログラミングができたら、先ほど同様の確認作業を行います。講師の遠藤さん、およびDeNAのみなさんがテーブルをまわり、確認作業まで進んだ人が増えたところで、遠藤さんが正解を披露しました。

CodePenには今回の勉強会で使ったすべてのコードが保存されているので、わからなかったところの確認や復習にぜひ活用してほしいと遠藤さんは呼びかけ、ハンズオン勉強会は終了しました。

DeNAとITSTAFFINGではこのようなハンズオン勉強会を定期的に開催しています。
フロントエンジニアとしてスキルアップしたいというみなさん。ぜひ、次回の勉強会に参加してみてはいかがでしょうか。

【連載】第1回 「エンジニアとしてこのさき生きのこる」ためのコラム

第1回 スキルを磨くための情報をキャッチしよう!

コンピューターで提供されるソフトウェアやサービスは日々進歩しています。それに伴い、ソフトウェア開発に必要な知識や技術も広範囲に渡り、複雑さ・難易度も増しています。
そんな日進月歩の環境の中で、ソフトウェアエンジニアとしてキャリアを積んでいくには、スキルを磨いていく必要がありますが、肝心の磨き方を学ぶ機会が多くないのではないでしょうか。

そこで、以前ITSTAFFINGで開催したイベントが好評だった塩谷啓さんに、エンジニアのみなさんがこの先エンジニアとして生きのこり、キャリアを深めていくために不可欠な、「スキルを磨く」ための取り組みについてお話いただきます。月に一度、お届けしますので、どうぞお楽しみに。

好評だった塩谷さんの「エンジニアとして生きのこるためのスキルをキャッチアップする技術を学べるセミナー」はこちら↓

f:id:itstaffing:20160318180226j:plain

【講 師】
塩谷 啓(しおや ひろむ)さん

株式会社ドワンゴ所属、エンジニア兼採用担当、運営母体のひとつであるドワンゴのネット高校の一年生。中途採用する側・される側の両面から、エンジニアとしての生存戦略について考えている。 共著「Web制作者のためのGitHubの教科書」(インプレス)

私は現在40代前半、これまでゲームプログラマーからWeb開発に転向し、ソフトウェアエンジニアとして数社を渡り歩いてきました。現在はマネージャーとして30人ほどのチームをまとめつつ、Ruby on Railsを使った開発や、エンジニアの採用・育成・評価に関わっています。

計算機科学やプログラミングを系統立てて学んだわけではありませんが、自力でスキルを身につけてここまでやってくることができました。そのため、「スキルを磨く」については実体験に基づいたお話ができるのではないかと思います。

効率よく情報収集する

さて、最初のテーマは「情報収集」についてです。
スキルを磨くと言っても、やみくもに勉強していてはいくら時間があっても足りません。自分が取り組んでいる問題を解決するために必要なスキルや、この先需要が高まりそうなスキルを効率よく身につけるために、情報収集は欠かせません。
合理的にスキルを磨くために、効率的な情報収集の手段を身につけましょう。

f:id:itstaffing:20160518100451j:plain

情報ソースの特徴を理解する

ソフトウェア開発についての情報や知識は、技術の進化が早いためすぐ陳腐化してしまう傾向があります。一方ですでに広く浸透していて、普遍的に使えるスキルも多くあります。情報を収集するときは、その情報の鮮度や需要についても考えるとよいでしょう。
具体的には、その情報が「編集されているか」に着目します。媒体に分けて見てみましょう。

書籍や雑誌、独自の技術記事を掲載するWebサイトなどは「編集されている」情報源です。速報性には欠けますが、内容については精査されていることが多く、間違いも比較的少ない傾向にあります(すべて正確な情報というわけではありません)。
個人のBlogやSNSへの投稿は「編集されていない」情報源です。公開されるまでの時間が短いため速報性がありますが、情報の質は書き手に依存します。
今回は「編集されている」情報源についてご紹介します。

●書籍
情報収集の手段としても、スキルを磨く手段としても、技術書を読むのは一般的な方法です。書籍という情報源には、編集されているため正確さが期待できるという特徴があります。
一方で、執筆 → 編集 → 出版という長いプロセスを踏むことや外国語で書かれている場合は翻訳の時間が必要など、リードタイムがかかります。また、ニーズの多い技術分野ほど書籍が出版されやすいなど分野ごとに差があります。
そのため、技術書はすでに利用実績のある技術や知識を学ぶのにより適している、と言えるでしょう。もちろん新しい情報を得るために本を読むことも大事ですが、それで「最新情報を追っている」と思うのは危険かもしれません。
また、技術書(特に初心者向けの入門書)は手軽に出版できるため、技術書に強みがあるわけではない出版社からもどんどん出てきます。技術書を多数出版している出版社を知ることも重要です。私が信頼している出版社をいくつかご紹介します。

・オライリー・ジャパン
・オーム社
・翔泳社
・技術評論社
・インプレス

これらの会社の新刊リストを眺めていると、今ニーズが高い技術的トピックが見えてくる、という使い方もあります。

●雑誌
雑誌は書籍よりリードタイムが短い情報源です。最近は電子書籍とインターネットに押されて紙の雑誌は売り上げを落としているようですが、そんな中でも引き続き出版している技術系雑誌は、情報源として貴重です。ソフトウェア開発に関連する雑誌には、以下のようなものがあります。

・Web + DB Press
・Software Design

●IT系Webサイト
雑誌よりもう一段リードタイムが短いのが、ソフトウェア開発者向けの情報を掲載したIT系Webサイトです。出版社やベンダーなどが運営していることが多く、メディアの目的もさまざまです。共通した特徴としては、注目されているトピックをセレクトして紹介していて、速報性も高めです。私筆者が定期的にチェックしているサイトをいくつかご紹介します。

・CodeZine
・IBM developerWorks 日本語版
・POSTD

RSSやメールマガジンなどを提供していることも多いので、それらを購読すると更新情報を簡単に手に入れることができます。

f:id:itstaffing:20160518100451j:plain

簡単ワーク 各特徴を理解した上で情報を集めてみましょう

みなさんが普段使っている技術要素について調べてみましょう。

●書籍を探す
普段使っている技術の中で、一番重要なものについて書かれた 書籍を探してみましょう
 -それはいつ出版されたものですか?
 -その出版社は他にどんな技術書を出していますか?

●雑誌を探す
 Webサイトや書店で試し読みしてみましょう

●Webサイトを探す
 例に挙げた以外のサイトも探してみましょう
 RSS・メールマガジン・Twitterアカウントなどを探して購読してみましょう

(編集後記)
今回は「編集されている」情報源について具体的にご紹介しましたが、今までどの程度活用しておられたでしょうか。このように情報ソースを分けると、ただやみくもに情報を集めるのではなく、用途に応じて使い分ける必要があることがよくわかります。
次回は「編集されていない」情報源の種類と接し方についてお話しします。
お見逃しなく。