SlideShare a Scribd company logo
1 of 102
Download to read offline
ZONE.JS
DEEP DIVE
A B O U T M E
{
"name": "Ilia Idakiev",
"experience": [
“Google Developer Expert (GDE)“,
"Developer & Co-founder @ HILLGRAND",
"Lecturer in 'Advanced JS' @ Sofia University",
"Contractor / Consultant",
"Public / Private Courses”
],
"involvedIn": [
"Angular Sofia", "SofiaJS / BeerJS",
]
}
The Event Loop 😬
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
JS enginesetTimeout(…)
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
STACK
Macrotask Queue
JS engine
STACK
Macrotask Queue
Promise.resolve().then(fn) JS engine
STACK
Macrotask Queue
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
setTimeout(…, 0) JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
requestAnimationFrame(…) JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
Promise.resolve().then(fn) JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
! Micro Tasks - A microtask is work which will execute as soon as possible on empty stack frame. A
microtask is guaranteed to run before host environment performs rendering or I/O operations. A
microtask queue must be empty before another MacroTask or EventTask runs.

(i.e. Promise.then() executes in microtask)
! Macro Tasks - Macro tasks are interleaved with rendering and I/O operations of the host environment.
(ie setTimeout, setInterval, etc..). Macro tasks are guaranteed to run at least once or canceled
(some can run repeatedly such as setInterval). Macro tasks have an implied execution order.
! Event Tasks - Event tasks are similar to macro tasks, but unlike macro tasks they may never
run. Event tasks are scheduled using addEventListener('click', eventCallback), or similar mechanisms.
Tasks
What is a zone? 😒
A zone is an execution context that persists across async tasks, and allows
the creator of the zone to observe and control the execution of the code
within the zone.
Zone
Why do we need it? 🤔
! Knowing when a task has executed and when the micro task queue is empty allows frameworks to know
when it’s time to re-render the UIs.
! Enforcing that no tasks are scheduled allows test frameworks to ensure that the tests are synchronous and
fast (controlling time).
! Tracking when all scheduled tasks are executed allows a test framework to know when an async test has
completed.
! Long stack traces between async operations.
! Measuring latency for user operations (Profiling).
! And many more…
Use Cases
How does it work? 🤔
The zone library ships with code which monkey patches all of the browsers's
asynchronous API and redirects them through the zone for interception.
Zone.js
Monkey Patching 🐒
const originalSetTimeout = global.setTimeout;
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
}
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
setTimeout(function () {
  console.log('Hello!')
}, 0);
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
setTimeout(function () {
  console.log('Hello!')
}, 0);
// > 'Timeout was called'
// > 'Hello!'
BROWSER
ZONE.JS
setTimeout Promise.resolve().then
Working with Zones 😬
const rootZone = Zone.current;
const rootZone = Zone.current;
const myZone = rootZone.fork({ 
  name: 'myZone', 
  properties: { user: null, debug: false } 
});
myZone.run(() => {
  console.log(Zone.current.name);
  // > 'myZone' (get the name of the current zone)
  console.log(Zone.current.get('user'));
  // > null (get the poperty called user)
  console.log(Zone.current.parent.name)
  // > '<root>' (get the name of the root zone)
});
myZone.run(() => {
  console.log(Zone.current.name);
  // > 'myZone' (get the name of the current zone)
  console.log(Zone.current.get('user'));
  // > null (get the poperty called user)
  console.log(Zone.current.parent.name)
  // > '<root>' (get the name of the root zone)
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  myZoneChild.run(() => {
    
  });
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  myZoneChild.run(() => {
    console.log(Zone.current.name); 
    // > 'myZoneChild' (get the name of the current zone)
    console.log(Zone.current.get('user')); 
    // > { name: 'Ivan' } (get the property called user)
    console.log(Zone.current.get('debug')); 
    // > false (get the property called user)
    console.log(Zone.current.parent.name) 
    // > 'MyZone' (get the name of the parent zone)
  });
});
! Each stack frame is associated with one zone (execution context).
! Data attached to the zone is shallow immutable.
! Once the zone is forked its properties cannot be changed.
! Child zones inherit parent zones properties (we can use them for communication).
Zones Basics Summary
Intercepting zones 😬
const timingZone = Zone.current.fork({
  name: 'timingZone',
  
});
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
    var end = performance.now();
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
    var end = performance.now();
    console.log(
      'Zone:', targetZone.name,
      'Intercepting zone:', currentZone.name,
      'Duration:', end - start
    );
  }
});
const appZone = timingZone.fork({ name: 'appZome' });
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
});
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
  console.log('Zone:', Zone.current.name, 'Hello World!')
});
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
  console.log('Zone:', Zone.current.name, 'Hello World!')
});
// Output: 
// > Zone: appZone Hello World!
// > Zone: appZone Intercepting zone: timingZone Duration: 919.128399014473
! We can intercept zone.run using the onInvoke hook and delegate.invoke inside.
! We can intercept zone.wrap using the onIntercept hook and delegate.intercept inside.
! We can intercept zone.form using the onFork hook and delegate.fork inside.
! We can’t use inheritance because the Zone.current is dynamic and we can’t know it on define time so we
need to use hooks and delegates.
! We can’t simply call a parent zone method because doing so would create a callback which is bound to
the parent zone and we are interested in intercepting the callback before it is bound to any zone so we
need to use hooks and delegates.
Zones Interception Summary
! Zone composition
! Observability of task execution
! Centralised error handling
Zones Interception Benefits
Scheduling tasks 😬
const originalSetTimeout = global.setTimeout;
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
    }
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
  return task;
};
const task = setTimeout(function () {
  console.log(123);
}, 1000);
// > task start
// > 123
// > task end
What if we want to clear the
timeout? 🤔
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
 originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
const originalClearTimeout = global.clearTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
const originalClearTimeout = global.clearTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    },
    () => originalClearTimeout(id)
  );
};
But aren’t we returning a task? 

How will clearTimeout work?
🤔
global.clearTimeout = function (task) {
  Zone.current.cancelTask(task);
}
global.clearTimeout = function (task) {
  Zone.current.cancelTask(task);
}
const task = setTimeout(function () {
  console.log(123);
}, 1000);
clearTimeout(task);
! We can scheduleMacroTask, scheduleMicroTask, scheduleEventTask and
scheduleTask (mostly useful for existing task when they were cancelled and we want to
reschedule them).
! We can intercept task scheduling with onScheduleTask, onInvokeTask, onCancelTask,
onHasTask, onHandleError.
! Task Lifecycle
Zones Tasks Summary
Why is the interception API
so confusing? 🤔
! We can’t use inheritance because the Zone.current is dynamic and we can’t know it on
define time so we need to use hooks and delegates.
! We can’t simply call a parent zone method because doing so would create a callback
which is bound to the parent zone and we are interested in intercepting the callback before it is
bound to any zone so we need to use hooks and delegates.
Why do we need hooks and delegates?
DEMO TIME
(Custom Change Detection Implementation)
! async-listener - a similar library for node
! vizone - control flow visualizer that uses zone.js
Additional Resources
THANK YOU!
GitHub > https://github.com/iliaidakiev (/slides/ - list of future and past events)
Twitter > @ilia_idakiev

More Related Content

Similar to Zone.js Deep Dive - Understanding the JavaScript Event Loop and Zones

HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?Ankara JUG
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade ServerlessKatyShimizu
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsNodeXperts
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonLuciano Mammino
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016Frank Lyaruu
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineRicardo Silva
 
Akka lsug skills matter
Akka lsug skills matterAkka lsug skills matter
Akka lsug skills matterSkills Matter
 
Scaling Web Apps with Akka
Scaling Web Apps with AkkaScaling Web Apps with Akka
Scaling Web Apps with AkkaMaciej Matyjas
 
Asynchronous development in JavaScript
Asynchronous development  in JavaScriptAsynchronous development  in JavaScript
Asynchronous development in JavaScriptAmitai Barnea
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch
 
JavaScript Multithread or Single Thread.pptx
JavaScript Multithread or Single Thread.pptxJavaScript Multithread or Single Thread.pptx
JavaScript Multithread or Single Thread.pptxRAHITNATH
 
Zone.js 2017
Zone.js 2017Zone.js 2017
Zone.js 2017Jia Li
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTPMustafa TURAN
 
RxJS101 - What you need to know to get started with RxJS tomorrow
RxJS101 - What you need to know to get started with RxJS tomorrowRxJS101 - What you need to know to get started with RxJS tomorrow
RxJS101 - What you need to know to get started with RxJS tomorrowViliam Elischer
 

Similar to Zone.js Deep Dive - Understanding the JavaScript Event Loop and Zones (20)

HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?
 
Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
Zone.js
Zone.jsZone.js
Zone.js
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
Akka lsug skills matter
Akka lsug skills matterAkka lsug skills matter
Akka lsug skills matter
 
Scaling Web Apps with Akka
Scaling Web Apps with AkkaScaling Web Apps with Akka
Scaling Web Apps with Akka
 
Asynchronous development in JavaScript
Asynchronous development  in JavaScriptAsynchronous development  in JavaScript
Asynchronous development in JavaScript
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
JavaScript Multithread or Single Thread.pptx
JavaScript Multithread or Single Thread.pptxJavaScript Multithread or Single Thread.pptx
JavaScript Multithread or Single Thread.pptx
 
Goto devoxx
Goto devoxxGoto devoxx
Goto devoxx
 
Zone.js 2017
Zone.js 2017Zone.js 2017
Zone.js 2017
 
mobl
moblmobl
mobl
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTP
 
RxJS101 - What you need to know to get started with RxJS tomorrow
RxJS101 - What you need to know to get started with RxJS tomorrowRxJS101 - What you need to know to get started with RxJS tomorrow
RxJS101 - What you need to know to get started with RxJS tomorrow
 

More from Ilia Idakiev

No more promises lets RxJS 2 Edit
No more promises lets RxJS 2 EditNo more promises lets RxJS 2 Edit
No more promises lets RxJS 2 EditIlia Idakiev
 
Enterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platformEnterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platformIlia Idakiev
 
RxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling TimeRxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling TimeIlia Idakiev
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlIlia Idakiev
 
No More Promises! Let's RxJS!
No More Promises! Let's RxJS!No More Promises! Let's RxJS!
No More Promises! Let's RxJS!Ilia Idakiev
 
Marble Testing RxJS streams
Marble Testing RxJS streamsMarble Testing RxJS streams
Marble Testing RxJS streamsIlia Idakiev
 
Deterministic JavaScript Applications
Deterministic JavaScript ApplicationsDeterministic JavaScript Applications
Deterministic JavaScript ApplicationsIlia Idakiev
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components EverywhereIlia Idakiev
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularIlia Idakiev
 
State management for enterprise angular applications
State management for enterprise angular applicationsState management for enterprise angular applications
State management for enterprise angular applicationsIlia Idakiev
 
Offline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and ReactOffline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and ReactIlia Idakiev
 
Testing rx js using marbles within angular
Testing rx js using marbles within angularTesting rx js using marbles within angular
Testing rx js using marbles within angularIlia Idakiev
 
Predictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platformPredictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platformIlia Idakiev
 
Angular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of SpeedAngular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of SpeedIlia Idakiev
 
Angular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJSAngular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJSIlia Idakiev
 
Introduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web ApplicationsIntroduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web ApplicationsIlia Idakiev
 
Reflective injection using TypeScript
Reflective injection using TypeScriptReflective injection using TypeScript
Reflective injection using TypeScriptIlia Idakiev
 
Predictable reactive state management - ngrx
Predictable reactive state management - ngrxPredictable reactive state management - ngrx
Predictable reactive state management - ngrxIlia Idakiev
 

More from Ilia Idakiev (18)

No more promises lets RxJS 2 Edit
No more promises lets RxJS 2 EditNo more promises lets RxJS 2 Edit
No more promises lets RxJS 2 Edit
 
Enterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platformEnterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platform
 
RxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling TimeRxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling Time
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-html
 
No More Promises! Let's RxJS!
No More Promises! Let's RxJS!No More Promises! Let's RxJS!
No More Promises! Let's RxJS!
 
Marble Testing RxJS streams
Marble Testing RxJS streamsMarble Testing RxJS streams
Marble Testing RxJS streams
 
Deterministic JavaScript Applications
Deterministic JavaScript ApplicationsDeterministic JavaScript Applications
Deterministic JavaScript Applications
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With Angular
 
State management for enterprise angular applications
State management for enterprise angular applicationsState management for enterprise angular applications
State management for enterprise angular applications
 
Offline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and ReactOffline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and React
 
Testing rx js using marbles within angular
Testing rx js using marbles within angularTesting rx js using marbles within angular
Testing rx js using marbles within angular
 
Predictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platformPredictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platform
 
Angular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of SpeedAngular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of Speed
 
Angular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJSAngular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJS
 
Introduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web ApplicationsIntroduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web Applications
 
Reflective injection using TypeScript
Reflective injection using TypeScriptReflective injection using TypeScript
Reflective injection using TypeScript
 
Predictable reactive state management - ngrx
Predictable reactive state management - ngrxPredictable reactive state management - ngrx
Predictable reactive state management - ngrx
 

Recently uploaded

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 

Recently uploaded (20)

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 

Zone.js Deep Dive - Understanding the JavaScript Event Loop and Zones