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
11k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
190
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.3k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.5k
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
Select API from Kotlin Coroutine
jmatsu
1
170
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
190
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
160
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
530
AIコーディング道場勉強会#2 君(エンジニア)たちはどう生きるか
misakiotb
1
230
SODA - FACT BOOK
sodainc
1
1k
Go Modules: From Basics to Beyond / Go Modulesの基本とその先へ
kuro_kurorrr
0
120
Cursor AI Agentと伴走する アプリケーションの高速リプレイス
daisuketakeda
1
120
try-catchを使わないエラーハンドリング!? PHPでResult型の考え方を取り入れてみよう
kajitack
3
520
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
160
A comprehensive view of refactoring
marabesi
0
790
GraphRAGの仕組みまるわかり
tosuri13
7
430
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Designing for humans not robots
tammielis
253
25k
How STYLIGHT went responsive
nonsquared
100
5.6k
Raft: Consensus for Rubyists
vanstee
140
7k
Docker and Python
trallard
44
3.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Writing Fast Ruby
sferik
628
61k
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 穏健!