SlideShare a Scribd company logo
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冊に。
サンプルアプリの例が充実

More Related Content

PPTX
Angular js開発事例
PDF
今後のWeb開発の未来を考えてangularJSにしました
PPTX
【eLV勉強会】AngularJSでのモバイルフロントエンド開発
PDF
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
PDF
AngularJSで業務システムUI部品化
PDF
開発ライフサイクルから見たAngularJS
PDF
Enterprise x AngularJS
PDF
Directiveで実現できたこと
Angular js開発事例
今後のWeb開発の未来を考えてangularJSにしました
【eLV勉強会】AngularJSでのモバイルフロントエンド開発
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
AngularJSで業務システムUI部品化
開発ライフサイクルから見たAngularJS
Enterprise x AngularJS
Directiveで実現できたこと

What's hot (20)

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

Similar to noteをAngularJSで構築した話 (9)

PDF
20140823 LL diver Angular.js で構築した note に関して
PDF
20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru
PDF
20140529 JS Ojisan #2 LT あの「note」はAngular.js
PDF
AngularJS 概説
PDF
AngularJS×Milkcocoaでちょっとくらい社会貢献してみたい
PDF
あの時AngularJSと出会った僕らは
PPTX
20161125 米田 angular_jsを触ってみた
PDF
Angular js meets cakephp at cloud on the beach 2014 前夜祭
PDF
エンジニアじゃなくてもAngularJS×milkcocoaでチャットアプリが1時間!? 非エンジニアから見たAngularJSの感動するポイント3つ
20140823 LL diver Angular.js で構築した note に関して
20141112 Tech Valley #3 note - スタートアップでこだわったこと - takamaru
20140529 JS Ojisan #2 LT あの「note」はAngular.js
AngularJS 概説
AngularJS×Milkcocoaでちょっとくらい社会貢献してみたい
あの時AngularJSと出会った僕らは
20161125 米田 angular_jsを触ってみた
Angular js meets cakephp at cloud on the beach 2014 前夜祭
エンジニアじゃなくてもAngularJS×milkcocoaでチャットアプリが1時間!? 非エンジニアから見たAngularJSの感動するポイント3つ
Ad

noteをAngularJSで構築した話