Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
穏健AngularJS 〜 あいつはフレームワーク
Search
OKUNOKENTARO
August 30, 2015
Programming
3
680
穏健AngularJS 〜 あいつはフレームワーク
ng-kyoto Angular Meetup #2での発表に使用した資料です
OKUNOKENTARO
August 30, 2015
Tweet
Share
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
11k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
190
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.4k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.6k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.7k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
670
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.4k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Programming
See All in Programming
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
220
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
280
20250704_教育事業におけるアジャイルなデータ基盤構築
hanon52_
5
910
GPUを計算資源として使おう!
primenumber
1
200
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
710
オンコール⼊⾨〜ページャーが鳴る前に、あなたが備えられること〜 / Before The Pager Rings
yktakaha4
1
770
状態遷移図を書こう / Sequence Chart vs State Diagram
orgachem
PRO
2
170
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
900
生成AI時代のコンポーネントライブラリの作り方
touyou
1
260
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
260
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
8.2k
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
240
Featured
See All Featured
Practical Orchestrator
shlominoach
189
11k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
740
A better future with KSS
kneath
238
17k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Agile that works and the tools we love
rasmusluckow
329
21k
Building an army of robots
kneath
306
45k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Rails Girls Zürich Keynote
gr2m
95
14k
Faster Mobile Websites
deanohume
307
31k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Designing for humans not robots
tammielis
253
25k
Transcript
穏健AngularJS あいつはフレームワーク Aug 30, 2015 @ ng-kyoto Angular Meetup #2
Hello! • 奥野 賢太郎 はちさん armorik83 • ng-kyoto代表 • 業務でAngularJSやったりします
• 趣味ではAngular 2やってます • あさってから東京 ダンボールの山の中でこの資料を書いた
あるng-kyotoミーティング
あるng-kyotoミーティング AngularJSのアーキテクチャにFlux合わせたら いい感じだった
AngularJSのアーキテクチャにFlux合わせたら いい感じだった _likrが入力中… あるng-kyotoミーティング
AngularJSのアーキテクチャにFlux合わせたら いい感じだった AngularJS使うならAngularJSやれよ あるng-kyotoミーティング
_人人人人人人人人人_ > AngularJSやれよ <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
AngularJSやってなかった…? • 今まで作ってきた資料は間違っていた…? • Angular 2の登場に狼狽しすぎたのか…? • AngularJSをAngularJSらしく使うとは一体…?
原点に帰る • 1.0が出た時の原点に、一旦帰ろう • Reactもなければ、Babelもなかった時代 • AngularJSはBackbone.jsやKnockout.jsと 同じ土俵で戦ったJavaScriptフレームワーク
チーム開発に参加 • ちょうどそんな時期に、某社某サービスの案件に参加 けっこう大規模 • AngularJSの「あいつはフレームワーク」感を 存分に味わえるチーム開発の現場 • 受託でチームに参入して過激なことなど やってはいけない!
そもそも過激って何 • 公式Docsが書いていないことを積極的に採り入れる • 他のライブラリ、フレームワークの流儀の 影響を受けすぎる • Angular 2の登場と移行について恐れたあまり AngularJSとの距離を取りたがる
• 自分がやりやすいというだけで、万人受けしない手法を 好んで試す
だいたいこいつ
穏健に行こう • 何が過激で、何が穏健かよく考えた上で、 本日のノウハウ集とします • 対象者: AngularJS経験が「ほどほど〜そこそこ」ある方 • 発表内容が過激と感じたら、すかさずハッシュタグ #ng_kyoto
で「まだ過激やぞ!」とお叱りください • マサカリが必要と感じたら即座に放ってください
過激1. AngularJSでも Fluxやってみた
• Reactと合わせて広まったFacebook Fluxアーキテクチャ • 8月になってから盛んにRedux! Redux!と騒がれる • このデータフローをAngularJS上で$broadcastとclassを 組み合わせて構築 •
83曰く「AngularJSのDirectiveとロジックの分離や 実装箇所の見通しがついて最高!」 詳しくは [イベント駆動AngularJS] [検索]
過激
穏健1. Serviceと $broadcastベースで
• Directive中心に設計しつつ、ストアとロジックをServiceに • ServiceはSingleton、言い換えると、これ自体が巨大グローバル変数 子DirectiveがバラバラにDIしない • 親 (Root) Directiveが責任を持ってDI 子DirectiveからServiceを操作したい場合は$rootScope.$broadcast()
• Serviceは$rootScope.$on()によってイベントを受ける • 子DirectiveはbindToControllerを用いてインタフェースを備え 親は必要な値を子に渡す • 子は渡された値のみをViewに利用する
• $emitにする必要はないのかとよく聞かれる これは親方向に限られたイベント伝播、設計変更に弱い • パフォーマンス面で言っても多量のng-repeatで 遅くなる問題に比べると誤差 • One-time bindingは積極的に活用しよう <p>{{::name}}</p>
• 一度レンダリングしたあと変える予定のない値は $digest loopの走査対象から外すことで高速化
過激2. AngularJSの DIなんて使わない
• DIはモック化を容易にし、テスト可能性を上げるための機構 • 83曰く「モックテストが実現できればAngularJSが備えて いるDIは使わなくてもいいんじゃね」 • proxyquireマジオススメ
• DIはモック化を容易にし、テスト可能性を上げるための機構 • 83曰く「モックテストが実現できればAngularJSが備えて いるDIは使わなくてもいいんじゃね」 • proxyquireマジオススメ • オススメでもなかった… あれは大規模になればなるほど、パス管理でハマってつらい
過激
穏健2. きっちりDI テストはKarmaで
• たしかにテスト時にモック化が可能ならばその機構は なんでもいいが、それはオレオレになっていないか • AngularJSは最初からDIが備わっているので、チーム内での学習 コスト分散を防ぐためにも、用意された機構は全員で正しく使う • テストはKarmaよりMochaのみで完結した方が実行だけなら短時間 • 短時間のテストを優先して歪な機構を生み出すか、
多少遅くても公式Docsの通りKarma + inject()を用いるか • どうせCIでも回すのだからKarmaのブラウザ起動コストは 無視できるレベルという見方もできる
過激3. $scopeは全廃
• Angular 2は$scopeを廃止する • だったらそれを見越して今から$scopeは全廃だ! • 一律でclass構文とthisにするぞ!
過激
穏健3. $scopeは削減
• Angular 2が$scopeを廃止するのは事実 • 長期的に活用を見越しているならば減らす方向に 手入れするのが吉 • ui-routerを使っている場合、特に起こりうるのがGC漏れ • $broadcast,
$onのイベントをすでに多階層で利用して いる場合、安易にすべての$scopeを置き換えると$destroyに よる適切なイベントの破棄がされずバグの温床 • ルーティング切り替えでどんどんリスナが溜まって処理が 重くなっていく…(その節はご迷惑おかけしました)
• Angular 2に移行する気が無いのなら、$scopeの件は 「一切気にしない」のもひとつの手 • ただし$scope削減はTypeScriptやES2015の利用時に 記述がシンプルになり有用なので、十分検討の価値がある • controller as構文やbindToControllerも活用する
function tabs($scope){ var panes = $scope.panes = []; $scope.select = function(pane) { angular.forEach(panes, function(pane) { pane.selected = false; }); pane.selected = true; } this.addPane = function(pane) { if (panes.length == 0) $scope.select(pane); panes.push(pane); } } class Tabs { constructor() { this.panes = []; } select(pane) { angular.forEach(this.panes, (_pane) => { _pane.selected = false; }); pane.selected = true; } addPane(pane) { if (panes.length == 0) { this.select(pane); } this.panes.push(pane); } }
穏健
これって? ? • Q1. npmとBrowserifyを組み合わせるのはですか?
これって? ? • Q1. npmとBrowserifyを組み合わせるのはですか? • A1. です AngularJSは1.3の途中から正式にCommonJSをサポートし npm
installも可能 • ただし記述には派閥があるっぽい • 各ソースでrequire('angular')する派 の参加した案件 旧ソースを引き継ぐと、こうなりがち • angular.moduleを細かく作って各ソースでexportする派 新規案件ならこの手法も採り入れやすい、OSSにも採用例あり
これって? ? • Q2. ui-routerを使うのはですか?
これって? ? • Q2. ui-routerを使うのはですか? • A2. です 公式もこのサードOSSは十分認識しており、積極的に使って問題ありません •
ただしui-viewネストには細心の注意を払った方がいい • 設計変更、値渡し、$rootScopeと$scopeの破棄タイミング等々 気にすることが一気に増えてしまう + チーム内への十分な周知やDocs整備も必要となってくる • プロトタイピングや初期開発でいきなり根深く組み込んでしまうと 忙しい時期に辛くなってくるかも
これって? ? • Q3. Angular 2とAngularJSは組み合わせられるそうですが、ですか?
これって? ? • Q3. Angular 2とAngularJSは組み合わせられるそうですが、ですか? • A3. です •
まだ早い • しっかり整うまで待とう • 一旦忘れよう • 詳しくは先週 "Angular 2@Grand-Frontend-Osaka 2015 Summer"で話した speakerdeck.com/armorik83/angular-2-at-grand-frontend-osaka-2015-summer
AngularJSを用いたチーム開発で フレームワークとしての本領を発揮
Have a nice 穏健!