89
P R E S E N T A T I O N : 株式会社LIG フロントエンドエンジニア 堀 祐磨 (ほりでー) Web制作

コンポーネント単位で考えるWeb制作

Embed Size (px)

Citation preview

Page 1: コンポーネント単位で考えるWeb制作

P R E S E N T A T I O N :

株式会社LIG フロントエンドエンジニア 堀 祐磨 (ほりでー)

Web制作

Page 2: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

自己紹介

LIG INC. Front-end Engineer ほりでー (堀 祐磨) 1988年生まれ。多摩美術大学を中退後、デザイナーとしてグラフィックデザイン・Webデザイン・UIデザインを経験。

2015年、株式会社LIGにフロントエンドエンジニアとして入社。

Page 3: コンポーネント単位で考えるWeb制作

Web制作

Page 4: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

概要:

本日のテーマ

Web制作において「コンポーネント」を意識することによって

見積もりや進捗管理、分業など、プロジェクト管理上のメリットがある ビューの構造化をすすめ、開発効率を高める実装上のメリットもある

Page 5: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

概要:

本日のテーマ

WebComponentsとは無関係 コンポーネントとは画面要素のまとまり

モジュール、ブロックと言い換えても差し支えありません

Page 6: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

管理上のメリット ̶̶なぜコンポーネント単位で

考えるのか

Page 7: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

実装担当者として聞かれると悩む質問

Page 8: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

1ページどれくらいで実装できる?

Page 9: コンポーネント単位で考えるWeb制作
Page 10: コンポーネント単位で考えるWeb制作
Page 11: コンポーネント単位で考えるWeb制作

※本発表の為の便宜的な例であり、実際とは異なります

Page 12: コンポーネント単位で考えるWeb制作

簡単なコンポーネント (より少ない工数)

複雑なコンポーネント(より多い工数)

Page 13: コンポーネント単位で考えるWeb制作

トップページ チャンネルページ 記事ページ

要素がほぼ同じ = 1ページ作れば全部できたも同然

それ以外…1ページづつ順番に完成していく

Page 14: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

1ページどれくらいで実装できる? の答え

Page 15: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

1ページどれくらいで実装できる? の答え:

×

×

ページ内のコンポーネントが いくつあるか

それぞれのコンポーネントが どれだけ複雑か

サイト全体でコンポーネントがどれくらい共通化されているか

Page 16: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

1ページ◯人日で作れたから 残りの5ページは◯×5で

完成するはず

だから

と単純に考えるのは大きな間違い

Page 17: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

ページを基準にすると 変なことに

Page 18: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

管理上のメリット̶̶なぜコンポーネント単位で考えるのか

「ページ」を最小の単位として進捗管理を行うと…コンポーネントの数と複雑さで全然工数が違う

ページごとに工数が平均化される訳ではない

次の「ページ」がいつ完成するのか実装担当者以外に予測が立て辛い

あるページは一瞬で完成するのに、あるページは中々完成しない

Page 19: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案1

Page 20: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

コンポーネント単位で 計画を立てる

提案1

Page 21: コンポーネント単位で考えるWeb制作
Page 22: コンポーネント単位で考えるWeb制作

チャンネルメンバー

プロフィールサイドバー

サイトヘッダー

チャンネルヘッダー

記事一覧フッター

関連記事一覧

記事フッター共有

記事本文

Page 23: コンポーネント単位で考えるWeb制作
Page 24: コンポーネント単位で考えるWeb制作
Page 25: コンポーネント単位で考えるWeb制作
Page 26: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

コンポーネントはチケット化しやすい

Page 27: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

ページではなくコンポーネントで進捗管理

Page 28: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案1: コンポーネント単位で計画を立てる

コンポーネントはチケット化しやすい1コンポーネント=1チケット 粒度として妥当 コンポーネントごとの見積りなら誤差が少ない コンポーネントの依存関係を「関連チケット」で表現できる 「あとどのモジュールが完成すればこのページができるのか」を可視化できる コミットログも書きやすい 分業しやすくレビューしやすい

Page 29: コンポーネント単位で考えるWeb制作

Web制作

実装上のメリット ̶̶豊かなデザインを少ないコーディングで

Page 30: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.D.R.Y.

Don’t Repeat Yourself

Page 31: コンポーネント単位で考えるWeb制作

コンポーネントA コンポーネントB

要素◯

要素△

要素☆

要素×

要素△

要素☆

Page 32: コンポーネント単位で考えるWeb制作

コンポーネントA コンポーネントB

要素◯

要素△

要素☆

要素×

要素△

要素☆

コンポーネントC

コンポーネントCの参照コンポーネントCの参照

Page 33: コンポーネント単位で考えるWeb制作
Page 34: コンポーネント単位で考えるWeb制作

別コンポーネントとして分離

参照

参照

Page 35: コンポーネント単位で考えるWeb制作

別コンポーネントとして分離

Page 36: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

HTMLプリプロセッサ

Page 37: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

サイトジェネレータや各種テンプレートエンジン

タスクランナー

Page 38: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

EJSの場合

Page 39: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

<%- include('./_global-navigator.ejs'); %>

_global-navigator.ejs

参照

Page 40: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

全く同じ物をまとめても芸がない

Page 41: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

ちょっと見た目が違うけど大体一緒のデザイン

Page 42: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

サイズやレイアウトが違うだけで要素は同じ

Page 43: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

Page 44: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

要素がちょっと追加/削除されてる

Page 45: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

ベース

要素削減版

Page 46: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

色や装飾が違うだけで他は同じ

Page 47: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

Page 48: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

構造化CSS ~modifier~

Page 49: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

構造化CSSにおけるmodifierの概念

Page 50: コンポーネント単位で考えるWeb制作

.block { /* 基本デザイン */}

.block̶small { /* 小さい版デザイン */ width: 50%; .block__icons { display: none; }}

.block̶news { /* 色違いデザイン */ background: blue;}

<!̶ 基本的な外観 ̶><div class="block"></div> <!̶ 小さい版の外観 ̶><div class="block block̶small"></div><!̶ 色違い版の外観 ̶><div class="block block̶news"></div><!̶ 両方のかけあわせ ̶><div class="block block̶small block̶news">

Page 51: コンポーネント単位で考えるWeb制作

<!̶ 基本的な外観 ̶><article class="article">

<!̶ 縦レイアウトアレンジ ̶><article class="article article̶vertical">

<!̶ 縦レイアウトアレンジ ̶><!̶ 紫アレンジ ̶><articleclass="article article̶vertical article̶biz">

HTML要素は一緒でclassのみ異なる

※本発表の為の便宜的な例であり、実際とは異なります

Page 52: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

include時にどうやってmodifierを変えるか

Page 53: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

パーシャルにパラメータを渡す

Page 54: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

<%- include('./_article', { modifier:'article—-small' }); %>

_article.ejs

<%- include('./_article'); %>

<article class="article <%= modifier %>"> <!-- 記事コンポーネント --></article>

パラメータを追加

Page 55: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

これだけじゃ上手くいかないパターン

Page 56: コンポーネント単位で考えるWeb制作

並び順が微妙に違う

Page 57: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

似てるけどCSSで吸収しにくい違い

Page 58: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案2

Page 59: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

modifierの概念をHTMLコンポーネントにも拡張

提案2

Page 60: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

modifierを条件にif文

Page 61: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

<ul class="sns <%= modifier %>"> <li>ツイート</li> <li>シェア</li> <li>いいね!</li> <% if (modifier === 'sns--vertical') { %> <li>Pocket</li> <li>はてブ</li> <li>Google+</li> <% } else { %> <li>はてブ</li> <li>Google+</li> <li>Pocket</li> <% } %></ul>

Page 62: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

CSSとHTMLの派生を同じ概念で整理できる!

Page 63: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案2:modifierの概念をHTMLコンポーネントにも拡張

includeとmodifierによる 派生コンポーネントの実装本来構造化CSSの為の概念であるmodifierによって、スタイルの差分とHTML要素の差分を横断的に管理 重複がなく、凝集度の高いHTMLとCSS 変更や拡張に強い

ifの中身が肥大化したら、更にファイルを分けて対応 CSSとHTMLを同じ概念で整理できる

Page 64: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

HTMLとCSSはセットで管理した方がいい?

Page 65: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案3

Page 66: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

ディレクトリ構造をコンポーネント中心に

提案3

Page 67: コンポーネント単位で考えるWeb制作

src

sass html

普通は言語ごとに分かれていて、それぞれのルールで構造化を図るが…

_base.scss_header.scss_footer.scss_article.scss

index.htmlarticle.htmlcategory.html

includes

_header.html_footer.html

Page 68: コンポーネント単位で考えるWeb制作

src

components

site-header

_site-header.scss_site-header.html article-item

_article-item.scss_article-item.htmlarticle-list

_article-list.scss_article-list.html

コンポーネントの中にセットで置いちゃう

pages

index.htmlarticle.html

sass

style.scss@import

include

Page 69: コンポーネント単位で考えるWeb制作

article-item

_article-item.scss_article-item.html

チケット

コード

コンポーネント

すごく把握しやすい!

Page 70: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案3:ディレクトリ構造をコンポーネント中心に

コンポーネントを軸にした ソース管理へ

1つのコンポーネント

1つのフォルダ

1つのチケット

1つのCSSファイル

1つのHTMLファイル

すごくスッキリ!

Page 71: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

One more thing…

Page 72: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

(静的実装だけど) データをビューから分離

Page 73: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

Page 74: コンポーネント単位で考えるWeb制作

写真+リンク+ 肩書き+ SNS+コメント

全部入りコンポーネント

架空のフルバージョンから派生して実体化

modifierとテキスト

ビュー

データ

構造化CSS

Page 75: コンポーネント単位で考えるWeb制作

_person.ejs

<section class="person <%= modifier %>"> <!-- メンバーコンポーネント —> <h1><%= data.head %></h1> <% if (modifier === 'person—-sidebar') { %>…<% } %> <% if (modifier === 'person—-channel') } %>…<% } %> <% if (modifier === 'person—-small') } %>…<% } %> </section>

<%# データを用意 %><% var arrayData = [ {modifier:’person--sidebar', head:'ナッツ', job:'4代目広報担当・編集長', tw:'...' }, {modifier:'person--channnel', head: 'ヨシキ', job: '漫画編集長', tw: '...'}, {modifier:'person--small', head: 'こやにい', job: 'メディアディレクター', tw: '...'} ]; %> <%# forEachでループ %><% arrayData.forEach(function (record) { %> <% include('./_person', { modifier:record.modifier, data:record } ); %><% }); %>

Page 76: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

提案2:modifierの概念をHTMLコンポーネントにも拡張

ビューとデータの分離

コンテンツの量産に最適

文言修正や文言の使い回しが楽 動的サイトのビューの設計にも応用可能

Page 77: コンポーネント単位で考えるWeb制作

まとめ

Page 78: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の まとめ

Web制作において「コンポーネント」を意識することによって

見積もりや進捗管理、分業など、プロジェクト管理上のメリットがある ビューの構造化をすすめ、開発効率を高める実装上のメリットもある

Page 79: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

ページの見積りはコンポーネント次第

まとめ

×ページ内のコンポーネントが

いくつあるか

それぞれのコンポーネントがどれだけ複雑か

サイト全体でコンポーネントが どれくらい共通化されているか

×

Page 80: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

提案1:コンポーネント単位で計画を立てる

まとめ

Page 81: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

重複を解消するinclude

まとめ

Page 82: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

構造化CSSのmodifier

まとめ

Page 83: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

提案2:modifierの概念を HTMLコンポーネントにも拡張

まとめ

Page 84: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

提案3:ディレクトリ構造をコンポーネント中心に

まとめ

Page 85: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今日の

One more thing…データをビューから分離

まとめ

Page 86: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今後の展開

Page 87: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

今後の展開:

今後の展開

WebpackでJavaScriptもパーシャル化 コンポーネント単位でテスト

Yeoman

Page 88: コンポーネント単位で考えるWeb制作

コンポーネント単位で考えるWeb制作

コンポーネント化で、Life is Good な制作を!

Page 89: コンポーネント単位で考えるWeb制作

Thank you!

http://qiita.com/y_hokkey株式会社LIG フロントエンドエンジニア 堀 祐磨 (ほりでー)