Componentization for Reality

53
アメーバ事業本部 フロントエンドディベロッパー 五藤 佑典 Componentization for Reality

description

フロントエンドのコンポーネントベース開発についての話

Transcript of Componentization for Reality

Page 1: Componentization for Reality

アメーバ事業本部フロントエンドディベロッパー 五藤 佑典

Componentizationfor Reality

Page 2: Componentization for Reality

@ygoto3_ ygoto3.com

Page 3: Componentization for Reality

フロントエンドのコンポーネントベース開発の話

Page 4: Componentization for Reality

app ├─ js │ ├─ main.js │ ├─ sideMenu.js │ └─ ….js├─ css │ ├─ sideMenu.css │ ├─ header.css │ └─ ….css ├─ images │ ├─ banner.png │ └─ ….png . .

Page 5: Componentization for Reality
Page 6: Componentization for Reality

最初は整理されていたのに

Sira Anamwong / FreeDigitalPhotos.net

Page 7: Componentization for Reality

いつの間にか汚なくなり

Bill Longshaw / FreeDigitalPhotos.net

Page 8: Componentization for Reality

あるコードに修正を入れたら

marin / FreeDigitalPhotos.net

Page 9: Componentization for Reality

全然知らない場所が壊れた

Witthaya Phonsawat / FreeDigitalPhotos.net

Page 10: Componentization for Reality

この画像、差し替えでお願いしまーす!!って言われ

stockimages / FreeDigitalPhotos.net

Page 11: Componentization for Reality

どこにあるんやろ、これ?ってなる

stockimages / FreeDigitalPhotos.net

Page 12: Componentization for Reality

最初は小さいプロジェクトだと思っていても

Serge Bertasius Photography / FreeDigitalPhotos.net

Page 13: Componentization for Reality

思ってたより大きくなってしまった時の弊害は大きい

David Castillo Dominici / FreeDigitalPhotos.net

Page 14: Componentization for Reality

やがてコードが

人が認識できる単位ではなくなり

整理できなくなる

app ├─ js │ ├─ main.js │ ├─ sideMenu.js │ └─ ….js ├─ css │ ├─ sideMenu.css │ ├─ header.css │ └─ ….css├─ templates │ ├─ header.html │ ├─ sideMenu.html │ └─ ….html ├─ images │ ├─ banner.png │ └─ ….png . .

Page 15: Componentization for Reality

人が認識できる単位

ディレクトリ=

Page 16: Componentization for Reality

人が認識できる単位

 コンポーネント化

Page 17: Componentization for Reality

概念的なこと

Page 18: Componentization for Reality

コンポーネントとして大事なこと

• 再利用が可能

• 交換が可能

Page 19: Componentization for Reality

さらにプロダクト開発においては

• 機能のカプセル化が可能

• コンポーネントの組み合わせで新たなコンポーネント作成が可能

• コンポーネント間のコミュニケーションが可能

Page 20: Componentization for Reality

コンポーネント化の対象

• UI = コンポーネント

• サービスとしてのロジック = モジュール

Page 21: Componentization for Reality

Web Component ?

Page 22: Componentization for Reality
Page 23: Componentization for Reality

platform.js ?

Page 24: Componentization for Reality
Page 25: Componentization for Reality

しかし

• ブラウザによって挙動が異なる

• Shadow DOM の CSS はカプセル化できない

• パフォーマンス的な懸念

• 外部依存コンポーネントの重複ロードによるリクエスト増加

Page 26: Componentization for Reality

UI の完璧なコンポーネント化は

(まだ)難しい

Page 27: Componentization for Reality

現実的な

コンポーネントベース開発

Page 28: Componentization for Reality

リソース管理だけでもいい

• コンポーネントに必要なリソースを1つの場所で管理できればいい

• コンポーネント単位でユニットテストも管理できればいい

• 別のプロジェクトを始めるときに再利用しやすければいい

Page 29: Componentization for Reality

ディレクトリ構造の強制

リソースのロード

スタイルの適用

ビューの生成

JS

Page 30: Componentization for Reality

これを比較的簡単に行うために

ツールを活用する

Page 31: Componentization for Reality

ディレクトリ構造の強制

Page 32: Componentization for Reality

基本となる JavaScript と共にStyle / Template / 画像などのリソースも一緒に管理

components ├─ menu │ ├─ menu.js │ ├─ menuSpec.js │ ├─ style.css │ └─ template.html├─ user-list │ ├─ user-list.js│ ├─ user-listSpec.js │ ├─ style.css │ ├─ template.html │ └─ icon.png ├─ sns-button │ ├─ banner.png . . . .

Page 33: Componentization for Reality
Page 34: Componentization for Reality

コンポーネントのパターンが複数ある。

パターン分サブジェネレータを作る

Test Spec も一緒にジェネレートする

Page 35: Componentization for Reality

button というパターンのコンポーネント用に1サブジェネレータ作成しておく

$ yo my-proj:button upload-button

components└─ upload-button ├─ upload-button.js ├─ upload-buttonSpec.js ├─ style.css └─ template.html

Page 36: Componentization for Reality

リソースのロード

Page 37: Componentization for Reality
Page 38: Componentization for Reality

AMD も CommonJS もサポートする最強ローダー=

Page 39: Componentization for Reality

規模が大きくなるのでコードを分割したい。

分離したい箇所だけ Chunk で分割する

Page 40: Componentization for Reality

Chunk を使用することによってエントリーポイントから辿ってまとめる必要のないファイルを簡単に分割できる

require.ensure([‘modal’], function (require) { var modal = require(‘modal’); modal.create();});

Page 41: Componentization for Reality

スタイルの適用

Page 42: Componentization for Reality

insert-css restyle.js

Page 43: Componentization for Reality

substack が作った CSS の文字列を <head> に挿入するライブラリ=

insert-css

Page 44: Componentization for Reality

コンポーネントが呼び出されたときに CSS を適用させたい。CSS Preprocessor に Stylus を使いたい。

WebPack の style 系 loader と一緒使う挿入した <style> を取り除く機能がないので、ラップするinsert-css

Page 45: Componentization for Reality

WebPack で Stylus をロードし、insertCss() に渡すだけでコンポーネントのスタイルを適用できる

var style = require(‘!raw!stylus!./button.styl’);insertCss(style);

Page 46: Componentization for Reality

ddpavumba / FreeDigitalPhotos.net

Page 47: Componentization for Reality

ビューの生成

Page 48: Componentization for Reality
Page 49: Componentization for Reality

コンポーネント単位でユニットテストしたい。

テスト環境の充実

カスタムエレメントでビューを扱いたい。

Element Directive を活用

Page 50: Componentization for Reality

ディレクトリ構造の強制

リソースのロード

スタイルの適用

ビューの生成

JS

Page 51: Componentization for Reality

JS

Page 52: Componentization for Reality

Reference• Componentizing the Webhttp://code.tutsplus.com/tutorials/componentizing-the-web--cms-20602

• The State of the Componentised Webhttp://www.futureinsights.com/home/the-state-of-the-componentised-web.html

• The Problem With Using HTML Imports For Dependency Management http://tjvantoll.com/2014/08/12/the-problem-with-using-html-imports-for-dependency-management/

• Why Web Components Aren’t Ready for Production… Yethttp://developer.telerik.com/featured/web-components-arent-ready-production-yet/

• Why Web Components Are Ready For Productionhttp://developer.telerik.com/featured/web-components-ready-production/

Page 53: Componentization for Reality

ありがとうございました