SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
noteを
AngularJSで構築した話
株式会社ピースオブケイク 今 雄一 (@konpyu)
自己紹介
• KON Yuichi (@konpyu)!
• Engineer in Piece of Cake, Inc.

since 2013/8!
• Love Angular
Agenda
• noteについて
• Why Angular?
• 使ってみて感じたn個のこと
• Angular in future
note
note
• Tumblr + Gumroad + Medium
• クリエイターが、テキスト、画像、サウンド、動
画を簡単に作れる、販売できる。
• ファンとつながることが出来る
• (僕も一攫千金(note長者)を狙っています)
開発の規模感
• Rails 4.1 + nginx + MySQL + AngularJS
• coffeeで6500Lくらい
• 14 Controller, 33 Service, 31 Directive
開発の規模感
• エンジニア3名、デザイン + コーディング 2名
• 開発期間: 2013/12∼2014/4/7
Why Angular?
• アプリ化を見据え、APIベースで構築したい
• UX重視. 画面遷移を極力無くしたい
• jQueryは使いたくない
• 自由度が低いため決定しないといけないことが
少ない(後述)
AngularJS
使ってみて感じたn個のこと
学習コストの高さ
directive
$service
$scope
$route
isolate scope
custom filter
$provider
学ぶべき概念がやたら多い
$factory $apply
ng-bind
$setViewValue
ng-maxlength
$resource
$compier
$state
promiss $q
transclude
$broadcast
dependency injection
html5mode
$digest
jqLite
two way data binding
$location
$interpolate
$watch
$cookie
$on
angular expression
1
学習コストの高さ
• Builtin DirectiveやControllerの使い方など、
Dot installで学べる所位までは簡単
• Custom Directive/Filter/Validation, Service
などそこから先が複雑(しかし、覚えないとあ
まりAngularの恩恵はない)
1
Two way data binding
$scope.user.is_follow = true で即反映
DOMを直接いじらなくて良い安心感
2
↑ CLICK
本当に驚いたのはアプリケーションの行数が1万7千行から
わずか1,500行にまで減ったことに対してです。
フロントエンドのコードは1万7千行に達していた頃、開発
メンバーの1人Misko Heveryが大胆な発言をしました。彼が
趣味で作成していたオープンソースのライブラリを使えば、
プロジェクト全体のコードを2週間ですべて書き換えられる
というのです
Angular創世の小話
- AngularJS開発ガイドより
2
注意点
2
• パフォーマンスに影響が出やすい
• dirty-checking

→ scope内の変数について、特定のタイミングで前の値と
比較し、変化があればDOM書き換え

→ $digest loop と呼ぶ
• (1) 比較する変数を少なくする (2) 比較処理を軽くする
• 参考

http://qiita.com/zoetro/items/5156aef51222e81dd022
構成に悩まなくてよい
・Backbone.jsは使わないの?
・Angularは縛りが強く、何処に何を書くべきかが
最初から決まっている → 楽
Controller
Directive
Service
HTML
3
Service, Directiveが勘所
• 極力ServiceとDirectiveに処理を追い出す。Fat Controller化するの
を避ける。
4
• Directive: HTMLに宣言的指定を加える事でDOMの機能を拡張
• Service: 共通処理をまとめるためのSingletonオブジェクト
Directive
HTML
Directive
クリックするとフォローできる機
能をAタグに付加
関連付けるDirectiveを指定
4
Directive
• Directiveに切っておけば、followableを任意のDOMのattributeに指
定するだけで、フォロー機能が使いまわせる。

→ Controllerに書くと移植時にはコピペが必要 
• Directiveは基本的にA(Attribute)で作る。テンプレも含めてコンポー
ネント化したい時はE(Element)に。
• 外部ライブラリは大体Directiveの形で提供されている

ex) OnsenUI, Angular-Bootstrap, Angular-UI
4
Directive
• noteでのユースケース

→ クリックするとフォローする

→ コメント欄

→ ノート購入モーダル

→ Tw/Fbへのシェア

その他多用
4
Service
Service
Controller
認証ロジックをService
に追い出す
DIしてControllerから
利用
4
Service
• 要はjsのオブジェクト
• 異なるController間の値の受け渡しにも使える
• 必要なときに、DIで注入する
• noteでのユースケース

→ タイトルタグの置き換え

→ ツイート用文言の生成

→ XHRでのAPIアクセスを隠 

→ オートページャのためにスクロール位置を監視

→ タイムラインデータの保存 etc
4
どこまでWAFに仕事をさせるか
• WebApp高速化の基本 → Appサーバになるべく仕事をさせない
• Angularは静的HTMLとAPIがあればブラウザでHTMLを生成できる。
Appサーバーでビューを出力する処理は必須ではない
Viewの生成コストは安くない↑
5
どこまでWAFに仕事をさせるか
• いろいろな条件との兼ね合い
• 単純にRailsに慣れている
• 極力Railsの開発支援機構に頼って開発効率を上げたかったので, Rails側
でHTMLを生成している

→ Haml, Sass, Coffee,minifyを透過的に扱える(sprockets)

→ デザイナーもRailsを使っている
• 理想は静的にhtmlを吐いてnginxで配信
5
SEO対策がめんどくさい
• クローラは、Angularによるレンダリング前のHTMLしか取得できない
• PhantomJSでレンダリング後のHTMLを返していた

→ たまにPhantomのプロセスが暴走. そもそも処理が重い

→ JSレンダリング用のSaaSはお高い.
!
• UserAgentでbotからのアクセスか否かを判定

→ botも色々あるのでキリがない
6
現状
6
OGPとタイトルを
Railsで静的生成
するだけ
基本的にPhantom
は使わない
googlebotだけ
PhantomJSで対応
正しい内容を返さ
ないとランクに影響
貧弱なルーティング
• $routeはURLに応じて<ng-view></ng-view>内でレンダリングする
HTMLとControllerを切り替えてくれる
7
貧弱なルーティング
7
• ng-viewの入れ子, 並列に複
数設置ができない

→ ui-routerを使う(とい
うか使わざるを得ない)
貧弱なルーティング
7
•
• routeが切り替わるとControllerを破棄して作りなおしちゃう

→ 前のControllerのデータを保存しない

→ ブラウザバックで戻った時に、もう一度構築し直す必要がある

→ 前の$scopeの内容を適当なServiceに逃しておく → たるい
・ex) タイムラインを沢山ページングして下まで掘る → ある記事に飛ぶ
→ ブラバする → タイムライン消えてる → F○ck!
セキュリティ
• 基本的には自動的にエスケープされる

→ ng-bind ( {{ hoge }} )

→ ng-href

→ ng-src

→ ng-style
8
セキュリティ
• CSRF対策

→ cookieにXSRF-TOKENをセットする

→ XSRF-TOKENがセットされているなら、$httpでXHRする際、
AngularがX-Xsrf-TokenをHeaderに付けてリクエストしてくれる

→ API側でそれをチェック
8
• http://stackoverflow.com/questions/8781937/rails-api-
authentication-sanity-check-and-advise
ライブラリ
• 外部ライブラリの充実度はフレームワーク選定の判断材料
• Angularはフルスタック. ビルトインの状態でもかなり充実している.

ex) promise, filter
• jQueryの資産を使いたい時は、Directiveでラップする

→ すでにgithubに結構UPされている
9
noteの場合
• Angular-Bootstrap

http://angular-ui.github.io/bootstrap/
• ui-router

https://github.com/angular-ui/ui-router
• angular-file-upload

https://github.com/danialfarid/angular-file-upload
• angular-loading-bar

http://chieffancypants.github.io/angular-loading-bar/
9
未来の話
バージョン
1.2 1.3 2.0
stable これから
使うなら
開発中 ← NEW
↑noteはこれ
3/18 Angular 2.0 Announced
2系の気になる変更点
• 複雑すぎるDirectiveの仕様を簡素に

→ 用途に応じてAPIを分ける

→ Decorator / Template / Component
• $routeの機能強化

→ シンプルなユースケースしか想定してなかったので綻びが

→ 複数・入れ子に対応/ 認証機能を提供 / 状態の保存
• Object.observe()で変更検知を高速化
• デザインノートを読むと1系の課題感が良くわかるのでオススメ
まとめ
• 学習コストは高い。dot installに されないように
• コード量は減らせる。2 way data binding素晴らしい
• DirectiveとServiceが重要です
• SEOめんどい。基本的には静的生成させるのが楽
• RailsはAPIだけ、viewは関与しないのが理想ではある
• はやく2系のAngularを触りたい
Have a happy angular life!
ご清聴ありがとうございました
• 公式ブログ

http://blog.angularjs.org/
• Googleでの活用事例

http://www.funnyant.com/using-angularjs-at-google-with-rhys-bret-bowen/
• Angular 2.0のドラフト(1系の設計思想を知る上でも有用)

https://docs.google.com/document/d/
1I3UC0RrgCh9CKrLxeE4sxwmNSBl3oSXQGt9g3KZnTJI/edit
• Angular 2.0 週次開発MTG議事録

https://docs.google.com/document/d/
150lerb1LmNLuau_a_EznPV1I1UHMTbEl61t4hZ7ZpS0/edit
• Angular Style Guide

https://github.com/mgechev/angularjs-style-guide

参考ドキュメント
参考ドキュメント
AngularJS
アプリケーション開発ガイド
Mastering Web Application
Development with AngularJS
オライリーから出た日本語の入門書。最初の1冊に。
サンプルアプリの例が充実

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
 
Angular jsの継続的なバージョンアップ
Angular jsの継続的なバージョンアップAngular jsの継続的なバージョンアップ
Angular jsの継続的なバージョンアップ
 
エンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb ComponentsハンズオンエンタープライヤーのためのWeb Componentsハンズオン
エンタープライヤーのためのWeb Componentsハンズオン
 
Angular2
Angular2Angular2
Angular2
 
STORES.jp x AngularJS
STORES.jp x AngularJSSTORES.jp x AngularJS
STORES.jp x AngularJS
 
イベント駆動AngularJS / 今から書くAngular 2.0
イベント駆動AngularJS / 今から書くAngular 2.0イベント駆動AngularJS / 今から書くAngular 2.0
イベント駆動AngularJS / 今から書くAngular 2.0
 
【ABC2014Spring LT】AngularJSでWEBアプリ開発
【ABC2014Spring LT】AngularJSでWEBアプリ開発【ABC2014Spring LT】AngularJSでWEBアプリ開発
【ABC2014Spring LT】AngularJSでWEBアプリ開発
 
スキスキIonic
スキスキIonicスキスキIonic
スキスキIonic
 
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリAngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
 
AngularJS入門の巻
AngularJS入門の巻AngularJS入門の巻
AngularJS入門の巻
 
俺とAngular JS 2
俺とAngular JS 2俺とAngular JS 2
俺とAngular JS 2
 
Angular 4がやってくる!? 新機能ダイジェスト
Angular 4がやってくる!? 新機能ダイジェストAngular 4がやってくる!? 新機能ダイジェスト
Angular 4がやってくる!? 新機能ダイジェスト
 
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
 
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfkSpring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
 
One-time Binding & $digest
One-time Binding & $digestOne-time Binding & $digest
One-time Binding & $digest
 
これからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへこれからフロントエンジニアを目指すあなたへ
これからフロントエンジニアを目指すあなたへ
 
いい感じのフロントエンド開発環境を作ってみた
いい感じのフロントエンド開発環境を作ってみたいい感じのフロントエンド開発環境を作ってみた
いい感じのフロントエンド開発環境を作ってみた
 
普段Reactを触ってる僕が Angularを触ってみた感想を共有する
普段Reactを触ってる僕が Angularを触ってみた感想を共有する普段Reactを触ってる僕が Angularを触ってみた感想を共有する
普段Reactを触ってる僕が Angularを触ってみた感想を共有する
 
Angular1&2
Angular1&2Angular1&2
Angular1&2
 

Semelhante a noteをAngularJSで構築した話

KobeGTUG GAE/Java
KobeGTUG GAE/JavaKobeGTUG GAE/Java
KobeGTUG GAE/Java
takagig
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
 
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
Kentaro Matsumae
 

Semelhante a noteをAngularJSで構築した話 (20)

Our Track to Modern Angular
Our Track to Modern AngularOur Track to Modern Angular
Our Track to Modern Angular
 
Our Track to Modern Angular #2
Our Track to Modern Angular #2Our Track to Modern Angular #2
Our Track to Modern Angular #2
 
Ng mtg#3
Ng mtg#3Ng mtg#3
Ng mtg#3
 
20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru
20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru
20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru
 
ヌーラボのサービス開発の裏側公開しちゃいます
ヌーラボのサービス開発の裏側公開しちゃいますヌーラボのサービス開発の裏側公開しちゃいます
ヌーラボのサービス開発の裏側公開しちゃいます
 
KobeGTUG GAE/Java
KobeGTUG GAE/JavaKobeGTUG GAE/Java
KobeGTUG GAE/Java
 
20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して
 
AngularJS で ハイスピードSI
AngularJS で ハイスピードSIAngularJS で ハイスピードSI
AngularJS で ハイスピードSI
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
ニコニコ動画iOSアプリの UX・マネタイズ・技術の話
 
Ssi 20150519
Ssi 20150519Ssi 20150519
Ssi 20150519
 
20140529 JS Ojisan #2 LT あの「note」はAngular.js
20140529 JS Ojisan #2 LT あの「note」はAngular.js20140529 JS Ojisan #2 LT あの「note」はAngular.js
20140529 JS Ojisan #2 LT あの「note」はAngular.js
 
ngJapan報告会
ngJapan報告会ngJapan報告会
ngJapan報告会
 
Fun tech14-alibaba cloud api gateway-swagger
Fun tech14-alibaba cloud api gateway-swaggerFun tech14-alibaba cloud api gateway-swagger
Fun tech14-alibaba cloud api gateway-swagger
 
UI/UXデザインでサイトを改善しよう
UI/UXデザインでサイトを改善しようUI/UXデザインでサイトを改善しよう
UI/UXデザインでサイトを改善しよう
 
我が家のフロントエンド開発事情
我が家のフロントエンド開発事情我が家のフロントエンド開発事情
我が家のフロントエンド開発事情
 
ionic - cross platform mobile app 開発
ionic - cross platform mobile app 開発ionic - cross platform mobile app 開発
ionic - cross platform mobile app 開発
 
Innovation eggcloudnative
Innovation eggcloudnativeInnovation eggcloudnative
Innovation eggcloudnative
 
Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13
Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13
Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13
 
Web開発の 今までとこれから
Web開発の 今までとこれからWeb開発の 今までとこれから
Web開発の 今までとこれから
 

noteをAngularJSで構築した話