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
690
3
Share
穏健AngularJS 〜 あいつはフレームワーク
ng-kyoto Angular Meetup #2での発表に使用した資料です
OKUNOKENTARO
August 30, 2015
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
200
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.4k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.7k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
700
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.5k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Programming
See All in Programming
Ruby and LLM Ecosystem 2nd
koic
1
1.4k
AI-DLC 入門 〜AIコーディングの本質は「コード」ではなく「構造」〜 / Introduction to AI-DLC: The Essence of AI Coding Is Not “Code” but “Structure”
seike460
PRO
0
140
飯MCP
yusukebe
0
440
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.2k
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
110
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
380
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
270
ネイティブアプリとWebフロントエンドのAPI通信ラッパーにおける共通化の勘所
suguruooki
0
230
おれのAgentic Coding 2026/03
tsukasagr
1
120
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
530
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
130
Migration to Signals, Signal Forms, Resource API, and NgRx Signal Store @Angular Days 03/2026 Munich
manfredsteyer
PRO
0
200
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
Test your architecture with Archunit
thirion
1
2.2k
How to make the Groovebox
asonas
2
2.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
330
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
BBQ
matthewcrist
89
10k
The agentic SEO stack - context over prompts
schlessera
0
720
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
170
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
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 穏健!