Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ng-japan meetup evolution of Angular Compiler
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yosuke Kurami
October 10, 2017
Programming
1.2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ng-japan meetup evolution of Angular Compiler
Yosuke Kurami
October 10, 2017
More Decks by Yosuke Kurami
See All by Yosuke Kurami
TypeScript LSP の今までとこれから
quramy
1
2.2k
フロントエンドテストの育て方
quramy
12
3.9k
App Router 悲喜交々
quramy
8
770
上手に付き合うコンポーネントテスト
quramy
6
2.4k
Patched fetch did not work
quramy
6
810
GraphQL あるいは React における自律的なデータ取得について
quramy
18
6k
Next.js App Router
quramy
15
4k
Fragment Composition of GraphQL
quramy
17
4.9k
reg-viz VRT tools
quramy
4
1.8k
Other Decks in Programming
See All in Programming
SREの越境 / SRE Collaboration
y0hgi
2
300
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
7
1.9k
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.8k
速習iPhone Duo対応
yuukiw00w
2
960
mrbgem 三角測量 開発
ogom
0
200
残高管理から台帳サービスへの進化
artoy
0
150
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
370
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
Simple Storage Service(S3) is not simple
iwatsukayura
0
210
Rでドレミ/Do-Re-Mi_with_R
florets1
0
120
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
390
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Chasing Engaging Ingredients in Design
codingconduct
0
340
Building AI with AI
inesmontani
PRO
1
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
460
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
450
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
HDC tutorial
michielstock
2
940
Transcript
"OHVMBS$PNQJMFSͷਐԽ ng-japan meetup 2017 Autumn by @Quramy
About me
Today’s theme:
Today’s theme: Compile w "OHVMBSͷͷதͰϚχΞοΫͳ෦ྨ w Βͳͯ͘ࠔΒͳ͍ w WͷςʔϚͷҰͭ ޙड़
$PNQJMBUJPOJO"OHVMBS
Think about Component w ͜ͷ$PNQPOFOUͷϨϯμϦϯάɺͲ͏࣮͠·͔͢ʁ @Component({ selector: 'app', template: `
<span>{{count}}</span> <button (click)="countUp()">count up</button> `, }) export class AppComponent { count = 0; countUp() { this.count += 1; } }
Naive implementation Ҋ $PNQPOFOUͷߋ৽ͷʹɺ5FNQMBUFͷϓϨʔεϗϧ μΛஔͯ͠JOOFS)5.- function renderView(hostElement, component) { hostElement.innerHTML
= Component.template.replace('{{count}}', component.count); hostElement.querySelector('button') .addEventLister('click', () => component.countUp()); }
Naive implementation w ͜ͷํ๏৭ʑͳ͕ܽؕ͋Δɿ wඳըͷʹશཁૉͷ࡞Γସ͕͑ൃੜ͍ͯ͠Δ wඳըͷʹΠϕϯτϋϯυϦϯάΛొ͍ͯ͠͠Δ w ͙͢ʹ%0.ͷੑೳྼԽΛҾ͖ىͯ͜͠͠·͏
Little better way w ͏গ͠ਅ໘ʹॻ͍ͯΈΑ͏ function createView(hostElement, component) { //
create <span></span> const sp = span = document.createElement('span'); hostElement.appendChild(sp); // create <button></button> const btnText = document.createTextNode('count up'); const btn = document.createElement('button'); btn.addEventLister('click', () => component.countUp()); btn.appendChild(btnText); hostElement.appendChild(btn); } function updateView(hostElement, component) { hostElement.children[0].textContet = component.count; }
Little better way w %0.ૢ࡞Λ࠷খݶʹ͢Δ w %0.ཁૉͷ࡞࠷ॳͷҰճ͚ͩ w $PNQPOFOUͷঢ়ଶߋ৽࣌ มߋݕ࣮ߦ࣌
ɺผ్ VQEBUF༻ͷؔΛ࣮ߦ͢Δ
That’s all w "OHVMBS$PNQJMFS͕͍ͬͯΔ͜ͱҰॹ w 5FNQMBUFΛQBSTFͯ͠ɺEFpOF7JFXVQEBUF7JFX૬ Λ࡞ͬͯ͘ΕΔ w ͜ΕΒͷؔΛ·ͱΊͨͷ͕$PNQPOFOU'BDUPSZ
ngfactory in real world w ϒϥβ͔Β֬ೝ͢Δ͜ͱ ҰԠ Ͱ͖Δ
What Angular Compiler does w ϑϨʔϜϫʔΫͷཉٻ w ։ൃऀ 5FNQMBUFΛ༻͍ͯ એݴతʹ7JFXΛΈཱͯ
Δ͜ͱ͕Ͱ͖Δ w ϒϥβ࠷খίετͰ%0.πϦʔ͕ߋ৽͞ΕΔ w ͜ΕΒཱ͕྆Ͱ͖Δͷɺ$PNQJMFS͕ %0.Λૢ࡞͢ΔؔΛੜͯ͘͠Ε͍ͯΔ͔Β
What Angular Compiler does w 5FNQMBUFҎ֎ͷ$PNQJMFର w $44 w "OJNBUJPO
w %* QSPWJEFS *OKFDUBCMF w .PEVMF JNQPSUTFYQPSUTEFDMBSBUJPOʜ w 3PVUJOH
When Compiler works w ίϯύΠϥͷಈ࡞λΠϛϯά w +J5 +VTUJO5JNF ΞϓϦ͕࣮ߦ͞ΕΔλΠϛϯάͰղੳ
w "P5 "IFBEPG5JNF Ϗϧυ࣌ʹιʔείʔυΛ੩తʹղੳ
Using JiT Compilation import { enableProdMode } from '@angular/core'; import
{ platformBrowserDynamic } from '@angular/platform-browser- dynamic'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } platformBrowserDynamic().bootstrapModule(AppModule);
Using AoT Compilation import { enableProdMode } from '@angular/core'; import
{ platformBrowser } from '@angular/platform-browser'; import { AppModuleNgFactory } from './app/app.module.ngfactory'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } platformBrowser().bootstrapModuleFactory(AppModuleNgFactory); $ ngc # create app.module.ngfactory
"P5WT+J5
JiT Compilation’s problem w ϒϥβͰಈ࡞ͤ͞Δ·Ͱ$PNQJMFΤϥʔʹؾ͚ͳ͍ w MBOHVBHFTFSWJDF ΤσΟλͰܰݮՄೳ w $PNQJMFSͷηΩϡϦςΟϦεΫ
w 944Λಥ͔Εͨ߹ɺҙͷ$PNQPOFOUΛಈతʹ࡞ ͞ΕΔϦεΫʹ
AoT Compilation’s problem w Ϗϧυʹ͕͔͔࣌ؒΔ w $PNQPOFOUʹΑΔ͕ɺඵΦʔμʔΛཁ͢Δ ͜ͱ w KTͷαΠζ͕ංେԽ͕ͪ͠
w 7JFX&OHJOF dW ಋೖͰɺWYͱൺֱ͢Δͱ ఔʹαΠζ͕ݮ͞Ε͍ͯΔ
͍ͭ·Ͱ"P5WT+J5ͳͷ͔
V5 theme https://docs.google.com/presentation/d/ 17XEE7dNq2e8CAgC68vM7Hn_1hR5jwnPoBiRmqzAF9DQ/preview
V5 and Compilation w 4JNQMJDJUZͦͦ+J5ͱ"P5͕ࠞࡏ͍ͯ͠Δ࣌Ͱγ ϯϓϧͰͳ͍ w +J5Λ͏ཧ༝"P5͕͍͕ނ w Α͠ɺ"P5Λ͘͠Α͏ʂ
"P5CZEFGBVMUʹ͚ͯ
5SBOTGPSNFST#BTFE $PNQJMFS"1*
Transformer Based Compiler w ҰݴͰ͍͏ͱʮKTग़ྗํ๏ͷվྑʯ w ֖ͳ͍ݴ͍ํΛ͢Δͱɺʮ5ZQF4DSJQUຐվʯ
compiler-cli(<= 4.2.x) w 5SBOTGPSNFSಋೖҎલͷDPNQJMFSDMJ
compiler-cli(>= 4.3.0) w 5SBOTGPSNFSಋೖҎ߱ͷDPNQJMFSDMJ !BOHVMBSDMJW
Waste of intermediate files w ैདྷͷDPNQJMFSDMJͰதؒϑΝΠϧͱͯ͠ɺ OHGBDUPSZUTΛੜ͠ɺͦͷޙʹKTΛੜ͍ͯͨ͠ w தؒϑΝΠϧͷॻ͖ࠐΈɺதؒϑΝΠϧͷQBSTFίε τ͕༨ܭʹ͔͔ͬͯ͠·͏
Why generate dot ts ? w 5ZQF4DSJQUར༻্ͷ੍ w UTKTͷ%PXO5SBOTQJMFॲཧΛ֦ு͢ΔΈଘ ࡏ͍ͯ͠ͳ͔ͬͨ
Custom Transformers w 5ZQF4DSJQUWͰɺΦϦδφϧͷτϥϯεύΠϧ ॲཧ 5SBOTGPSNFS ΛՃͰ͖ΔΑ͏ʹͳͬͨ
What’s Transformer? w "45 நߏจ Λผͷ"45ม͢Δػߏ w #BCFMʹ͓͚ΔQMVHJOͷΑ͏ͳͷ w 5ZQF4DSJQUͷ෦ͰτϥϯεύΠϧॲཧͦΕͧΕͷ
5SBOTGPSNFSͱ࣮ͯ͠͞Ε͍ͯΔ w FH&4༻ &4༻ &4༻ 54ຊମ༻
Transformation example var square = x ** 2; <variable-statement> <variable-declaration-list>
<identifier escaped-text="square" /> <binary-expression> <identifier escaped-text="x" /> <asterisk-asterisk-token /> <first-literal-token text="2" /> </binary-expression> </variable-declaration-list> </variable-statement>
Transformation example <variable-statement> <variable-declaration-list> <identifier escaped-text="square" /> <call-expression> <property-access-expression> <identifier
escaped-text="Math" /> <identifier escaped-text="pow" /> </property-access-expression> <identifier escaped-text="x" /> <first-literal-token text="2" /> </call-expression> </variable-declaration-list> </variable-statement> var square = Math.pow(x, 2);
Compiler and Transformers w ʮOHGBDUPSZΛੜ͢Δ5SBOTGPSNFSʯΛDPNQJMFSDMJ ͕༻ҙ͢Δ͜ͱͰɺ"P5$PNQJMF͕ߴԽ
"OHVMBS#B[FM3VMF
What’s Bazel ?
What’s Bazel ? w (PPHMF͕࡞ɾެ։͍ͯ͠ΔϏϧυπʔϧ #MB[Fͱ͍͏(PPHMFશࣾͰΘΕ͍ͯΔπʔϧ͕ϕʔε w ʹWϦϦʔε༧ఆʢݱঢ়CFUBʣ w ༷ʑͳݴޠͷQSKʹରԠ
$$ HP +BWB 0CKFDUJWF$ 4DBMB 3VTU FUD
How to make compilation faster w #B[FMɺϏϧυରΛࡉԽ্ͨ͠Ͱɺରؒͷґଘ ؔΛར༻ͯ͠ϏϧυΛߴԽ͍ͯ͘͠
Parallel Compilation w ಠཱ͍ͯ͠ΔՕॴฒߦͯ͠$PNQJMFΛ࣮ߦ
Incremental Compilation w มߋ͕͋ͬͨՕॴͷΈ$PNQJMFΛ࣮ߦ
Bazel and dependency graph w 1BDLBHFؒͷґଘؔΛఆٛ͢Δ͜ͱͰ w ޓ͍ʹಠཱͨ͠1BDLBHFΛฒߦʹCVJMEͰ͖Δ w CVJMEࡁΈͷ1BDLBHFͷSFCVJMEΛεΩοϓͰ͖Δ
w ʮࡉ͔͘Ϗϧυʯ͢Δ͜ͱͰແବͳ$PNQJMFΛආ͚Δ w طଘͷϏϧυπʔϧͰ͍͏ͱɺNBLFHVMQʹ͍ۙ
Bazel and Angular w !BOHVMBSCB[FM w CFUB͔ΒϦϦʔε͞Ε͍ͯΔ w "OHVMBSͷNPEVMFΛ#B[FMͰϏϧυ͢ΔͨΊͷϧʔϧ ηοτ
w ෦తʹOHD DPNQJMFSDMJ Λ࣮ߦ͍ͯ͠Δ
@angular/bazel package(default_visibility = ["//visibility:public"]) load("@angular//:index.bzl", "ng_module") load("@io_bazel_rules_sass//sass:sass.bzl", "sass_binary") sass_binary( name
= "hello-world-styles", src = "hello-world.component.scss", deps = [ "//src/shared:colors", "//src/shared:fonts", ], ) ng_module( name = "hello-world", srcs = glob(["*.ts"]), deps = ["//src/lib"], assets = [":hello-world-styles"], tsconfig = "//src:tsconfig.json", )
How to use Bazel w #B[FMΛૉͰ͏ͷ໘ʜ w +BWB #B[FMͷηοτΞοϓ w
Ϗϧυఆٛ༻ͷݴޠ4LZMBSL 1ZUIPO Λ֮͑Δ w ݸผͷ3VMF BOHVMBS TBTT FUDʜ ͷ͍ํΛ֮͑Δ
@angular/cli w !BOHVMBSDMJ͕ରԠ͢ΔͷΛͭͷ͕٢ CB[FMCSBODI্Ͱ࡞ۀ͞Ε͍ͯΔ༷ w ରԠ͞Εͨ߹ɺCVJMEʹ+7.͕ඞཁ IUUQTHJUIVCDPNBMFYFBHMFOHDPOUBJOFSͷΑ͏ͳ %PDLFS*NBHFΛ$*Ͱར༻͢Δͱྑͦ͞͏
4VNNBSZ
Summary w "OHVMBS$PNQJMFS41"QMBUGPSNͱͯ͠ͷཁ w "P5ΛσϑΥϧτʹ͢ΔํͰண࣮ʹਐԽ͍ͯ͠Δ w 5SBOTGPSNFST#BTFE"1*#B[FM3VMF w !BOHVMBSDMJΛ࠷৽ʹอ͓ͬͯ͘͠
5IBOLZPV
"QQFOEJY" 5SBOTGPSNFSͰͲΕ͘Β͍ ͘ͳͬͯΔͷ͔
Compilation performance w ݸͷ$PNQPOFOUͷOHDʹཁ͢Δ࣌ؒ w DPNQJMFSDMJ!TFD w DPNQJMFSDMJ!SDTFD w ݮͱ͍͔ͳ͍·Ͱɺ༗ҙʹ͕ࠩग़Δ
"QQFOEJY# l"P5CZEFGBVMUzͷԸܙ
Easy to reproduce errors w Τϥʔͷ࠶ݱํ๏ڞ༗͕؆୯ʹ w ʮ+J5Ͱى͖ͳ͍͚Ͳɺ"P5ͰͷΈΤϥʔ͕ʜʯͱ͍͏ έʔεͰɺڞ༗͢Δଆݕূ͢Δଆେมɻ w
1MOLFSͰ"P5ͷڞ༗͕͍͠
Demonstration edit.ng