Day 1 Keynote
- OSS and communities
- Developer Relations
- User stories
- https://goo.gle/angular-survey-2020
- Who is Angular for ?
- for Google
- for the world
- Angualr is in Google Core OSS project
- highly invested
- 1500+ projects in 2019
- 2000+ ing Spring 2020
- V9
- 10k+ Public v9 Apps march 2020
- Developer satisfaction growing
- ng-family
v9
- v9.1 3/25
- Ivy
- Big project
- Smaller / Faster / Simpler
- Simpler
- Tree-shaking
- Less generated code
- More processing in runtime
- Bundle size
- vs v8
- small -30% / mid -2% / large -25-40%
- vs v8
- Faster Builds
- separate dep compilation
- ngcc compile per package on demand
- No JSON conversion
- No metadata.json
- Use TypeScript only
- 40% faster in angular.io
- separate dep compilation
- Faster Tests
- compile at first for all tests.
- 40-50% faster
- Faster i18n
- Post-process translations
- Compile -> Bundele -> Minify -> L10N
- 10x Faster
- Post-process translations
- Simpler
- Debugging demo
- ECAIHBCError
- Jump into tempalte from stacktrace
- Add debugger, Watching
ctx.title
-
ng.getComponent($0)
-
AppComponeny_Template
in stacktrace (User code)
- ECAIHBCError
-
ng global
- Call CD in console
- inspect components / directives
- Debugging demo
- Simpler build errors
- compiler tells template location in an error
- Simpler type checking
-
strictTemplates
- Inputs
- $event
- Local ref
- Template context
-
- Simpler style merging
-
[class]
with[class.highlighted]
-
- Simpler module def
- no
entryComponents
- no
- Bugfixes over 100
- TypeScript 3.7/3.8
-
optional chaning
-
- Universal
-
ng add
andprerender
-
- Component Test Harnesses
- YouTube Player component
- Google Maps component
- 10.0 coming next
Http Interceptors: The Room Where It Happens
Ward Bell
https://1drv.ms/p/s!ArLFOyLcl1tjiMo0GbaNk4g8jUvs6g?e=9Koqvk
- Interceptors for
- inspect req
- modify req
- temnate req
- inspect resp
- modify resp
- replace resp
- Logging
- req: sync
- resp: pipe
- Busy interceptor
- show Busy at first req
- increment count
- hide Busy at last resp
-
finalize()
operator is useful (like try-finally)
-
- show Busy at first req
- Readonly interceptor
- blocking other than GETs (some POSTs are needed…)
-
return throwError(new Error(msg))
-
handleErrors
operator-
catchError
-
handle401
- check
WWW-Authenticate
(expiration)` - navigate to auth fail route
- return
EMPTY
to complete the request
- check
- HttpBackend i the last interceptor
-
How Ivy will improve your application architecture
Manfred Steyer
- component definition
- Template function
- Tree shakable functions of Ivy
- New architectures enabled by Ivy
- Lazy components
- using
import()
and CFR + ViewContainerRef - Ivy component is self-describing
- component definition
- Ivy: Locality
- Before Ivy: metadata within NgModules
- Potential
- Lazy loading
- Partial Hydration
- using
- HOC
- create component via factory function
- call other component in template functions
-
withRoute(DashboardPageComponent)
function - Potential
- more dynamic
- Framework extensions
- Standalone components (w/o NgModules)
-
directiveDefs
array for composing other directives -
@Component.deps
proposal from Minko - Demo:
@ComponentDeps
- bootstrapping
-
renderComponent()
-
- Potential
- New Project structure
- Slandalone components -> web components
-
- Conclusion
- Lazy loading
- Dynamic component/ HOC
- Standalone components
Deep dive into CLI Builders
Mike Hartington https://mhartington.io/builders-deep-dive/
- What CLI builder is?
-
ng build
> browser builder-
ng serve
-> dev-server builder -
ng test
-> karma builder
-
- Builder:
fn(option) => result
- Architect: high-level settings
- define commands
- call builder
- set options / configurations
- Make a builder
-
builder.json
- define builders in the package
-
implementation
/schema
-
-
export default createBuilder(fn: (options, context) => Promise)
- define builders in the package
- extends browser builder
-
export default createBuilder(fn: (options, context) => Observable)
-
targetFromTargetString(options.browserTarget)
- `formJoin(from(context.getTargetOptions), from(context.getBuilderNameForTarget))
-
from(context.validateOptions)
with schema -
concatMap(opts => extendBuilder(executeBrowserBuilder)(opts, context))
-
builder => return builder(option, context, { webpackConfiguration: config => config })
- modify
config
- modify
-
-
- Good examples
-
@ionic/angular-toolkit
- Replace node scripts
- integrate different workflows
Session #1 Q&A
Manfred Steyer Ward Bell Mike Hartington
- Ward
- debouncing same GET requests
A Philosophy for Designing Components with Composition
Jeremy Elbourn
- MatSelect
- 3 states
- initial / selecting / selected
- 3 states
- WAI-ARIA
-
<div role="combobox">
- complex roles
- tabs
- tab: same URL
- anchor: with navigation
- tabs
-
- Always START with your set of interaction patterns
- Composite roles
- Style customization is inevitable
- parameterized Sass Mixins
- decompose styles: base / color / typography / animations
- CSS Variables
- A solution
- Not in IE11
- Polyfills are not ideal
- Let use compose parts
- separate behaviors
-
<cool-table>
has all behavior in one component
- Design composable parts
- mat-table / mat-paginator / mat-sort-header
- don’t know each other
- depends on single data source
- autocomplete = input + options
- menu = trigger + options
- datepicker = input + button + options
- mat-table / mat-paginator / mat-sort-header
- Benefit
- Single Reponsibility
- Flexibility
- Surfaces native elements
- Use the platform
<button>
<input>
- Use the platform
- Cons
- More verbose APIs
- Overall larger API
- Conclusion
- Decompose and be deliberate with re-composition
- Customizing CSS is inevitable
- Designs have trade-offs
Angular Universal & Our New Prerenderer
Wagner Maciel
- Universal Basic
- SSR and Prerendering
- Why?
- for Fisrt Contentful Paint
- for fow low-power devices
- for web clawlers
- New features
- Live code reload
- watching client/server bundles
- Prerendering
- generate static pages and save
-
routes
array -
routesFile
path
- Live code reload
Why Should You Care About RxJS Higher-order Mapping Operators?
Deborah Kurata
- Higher-order mapping operator
- FIrst Order vs Higher Order
- First Order: map()
- value to value
- HO
- value to Observable
- First Order: map()
- First Order
- transform value
- extracting
- extending
- converting
- transform value
- HO Mapping
- OuterObservable -> InnerObservable
- xxxMap()
- automatically subscribe/unsub
- mergeMap
- To process items in parallel
- order doesn’t matter
- concatMap
- sequence version of mergeMap
- switchMap
- unsubscribe the prior incomplete inner observable
The Phantom of the Template Error
Brian Love
- 15%
- Typechecking can detect bugs in JavaScript
- 3 mode
- Basic / Full / Strict
- Reduce runtime errors
Session #2 Q&A
Jeremy Elbourn Wagner Maciel Deborah Kurata Brian Love
- a11y tools
- lighthouse
- axe
- unittest
- light/dark theme
- A. separate CSS with
<link>
- small payload
- B. media query
- manage themed styles in the same file
- A. separate CSS with
- fixing Template errors
- try strict at first and know problems
- fix errors with basic in sprint
Common Challenges facing Angular Enterprises
Stephen Fluin
- New pain points
- Use source-map-explorer
- reduce bundle size
- Top 5 Challenges
- Micro frontends
- SSR
- Monorepo / Core sharing
- Varied Environments
- Business Justifications
- Micro Frontends
- “what do you mean?”
- Enterprises want
- Fast initial load
- Answer
- Angular updates
- SSR
- Answer
- Seamless transitions
- Answer
- Angular’s strength
- Answer
- Independent deploy
- pushing into monorepo
- problems
- Guarantee API compatibility
- Enforce Constraints
- Intelligent build system
- answers
- Use Libraries
- Future: Ivy & dynamic imports
- Fast initial load
- SSR
- Day 3 keynote
- Monorepo
- Coodination Problem
- Tools
- GitHub
- Bazel
- Pullapprove
- The Viral Monorepo
- One App + One Library
- Two Apps + One Library
- Varied Envs
- Angular is good at orchestration
- Angular Elements
- Custom Elements
- Angular is good at orchestration
- Business Justification
- Security
- One version
- Performance
- Recommended path
- Component Usage Tracking
- Invest in the most used components
- Quantify value of shared code
- http://bit.ly/stephen-survey
Preload Strategies: Step in Time, Step in Time!
John Papa
- Eager/Lazy Loading
- Eager: Users wait for everything to load
- Lazy: Users wait when they navigate
- Preloading: You control the user experience
- Watching the network traffic
- wait for Time to Interactive
- Preload strategies
- None (default)
- All (high network usage)
- Custom
- Optin
- Ondemand
- NetworkAware
Farewell Entry Components
Yvonne Allen
-
entryComponents
is no longer needed!
Session #3 Q&A
John Papa Yvonne Allen Stephen Fluin
- TBD