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
670
穏健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
9.6k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
160
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
9.9k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.2k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.4k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.7k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
620
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.2k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1k
Other Decks in Programming
See All in Programming
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
180
最新TCAキャッチアップ
0si43
0
190
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.7k
subpath importsで始めるモック生活
10tera
0
310
みんなでプロポーザルを書いてみた
yuriko1211
0
260
Micro Frontends Unmasked Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
100
ヤプリ新卒SREの オンボーディング
masaki12
0
130
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
Outline View in SwiftUI
1024jp
1
330
OSSで起業してもうすぐ10年 / Open Source Conference 2024 Shimane
furukawayasuto
0
110
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.4k
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
Featured
See All Featured
How GitHub (no longer) Works
holman
310
140k
Documentation Writing (for coders)
carmenintech
65
4.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Designing Experiences People Love
moore
138
23k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Optimizing for Happiness
mojombo
376
70k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Rails Girls Zürich Keynote
gr2m
94
13k
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 穏健!