SlideShare a Scribd company logo
@LostInBrittany#WebComponents @CodemotionWorld
ROME - APRIL 13/14 2018
The Web Components
Interoperability Challenge
Horacio Gonzalez ( @LostInBrittany )
@LostInBrittany#WebComponents @CodemotionWorld
Horacio Gonzalez
@LostInBrittany
Spaniard lost in Brittany, developer, dreamer
and all-around geek
@LostInBrittany#WebComponents @CodemotionWorld
We want the code!
https://github.com/LostInBrittany/web-components-interop
@LostInBrittany#WebComponents @CodemotionWorld
Polymer tour 2014-2018
@LostInBrittany#WebComponents @CodemotionWorld
Web components == Revolution
Image:bu.edu
@LostInBrittany#WebComponents @CodemotionWorld
Build a world brick by brick
Images:BitRebels&Brickset
@LostInBrittany#WebComponents @CodemotionWorld
Variations of the same questions
Does it work in real life?
Image:ideas.lego.com
@LostInBrittany#WebComponents @CodemotionWorld
Web Components
@LostInBrittany#WebComponents @CodemotionWorld
A very basic web component
class MyElement extends HTMLElement {
// This gets called when the HTML parser sees your tag
constructor() {
super(); // always call super() first in the ctor.
this.msg = 'Hello, Codemotion!';
}
// Called when your element is inserted in the DOM or
// immediately after the constructor if it’s already in the DOM
connectedCallback() {
this.innerHTML = `<p>${this.msg}</p>`;
}
}
customElements.define('my-element', MyElement);
@LostInBrittany#WebComponents @CodemotionWorld
Custom Elements:
● Let you define your own HTML tag
with bundled JS behavior
● Trigger lifecycle callbacks
● Automatically “upgrade” your tag
when inserted in the document
@LostInBrittany#WebComponents @CodemotionWorld
Custom Elements don’t:
● Scope CSS styles
○ Shadow DOM
● Scope JavaScript
○ ES2015
● “Reproject” children into <slot> elements
○ Shadow DOM
@LostInBrittany#WebComponents @CodemotionWorld
Adding ShadowDOM
class MyElementWithShadowDom extends HTMLElement {
// This gets called when the HTML parser sees your tag
constructor() {
super(); // always call super() first in the ctor.
this.msg = 'Hello from inside the ShadowDOM, Codemotion!';
this.attachShadow({ mode: 'open' });
}
// Called when your element is inserted in the DOM or
// immediately after the constructor if it’s already in the DOM
connectedCallback() {
this.shadowRoot.innerHTML = `<p>${this.msg}</p>`;
}
}
customElements.define('my-element-with-shadowdom', MyElementWithShadowDom);
@LostInBrittany#WebComponents @CodemotionWorld
Adding ShadowDOM
@LostInBrittany#WebComponents @CodemotionWorld
Lifecycle callbacks
class MyElementLifecycle extends HTMLElement {
constructor() {
// Called when an instance of the element is created or upgraded
super(); // always call super() first in the ctor.
}
// Tells the element which attributes to observer for changes
// This is a feature added by Custom Elements
static get observedAttributes() {
return [];
}
connectedCallback() {
// Called every time the element is inserted into the DOM
}
disconnectedCallback() {
// Called every time the element is removed from the DOM.
}
attributeChangedCallback(attrName, oldVal, newVal) {
// Called when an attribute was added, removed, or updated
}
adoptedCallback() {
// Called if the element has been moved into a new document
}
}
@LostInBrittany#WebComponents @CodemotionWorld
A simple click counter
As a vanilla Web Component
@LostInBrittany#WebComponents @CodemotionWorld
my-counter custom element
class MyCounter extends HTMLElement {
constructor() {
super();
this._counter = 0;
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render();
this.display();
}
static get observedAttributes() { return [ 'counter' ] }
attributeChangedCallback(attr, oldVal, newVal) {
if (oldVal !== newVal) {
this[attr] = newVal;
}
}
@LostInBrittany#WebComponents @CodemotionWorld
my-counter custom element
get counter() {
return this._counter;
}
set counter(value) {
if (value != this._counter) {
this._counter = Number.parseInt(value);
this.setAttribute('counter', value);
this.display();
}
}
increment() {
this.counter = this.counter + 1;
}
@LostInBrittany#WebComponents @CodemotionWorld
my-counter custom element
render() {
let button = document.createElement('button');
button.innerHTML = '+';
button.addEventListener('click', this.increment.bind(this));
this.shadowRoot.appendChild(button);
this.output = document.createElement('span');
this.shadowRoot.appendChild(this.output);
this.style.display = 'block';
this.style.fontSize = '5rem';
button.style.fontSize = '5rem';
button.style.borderRadius = '1rem';
button.style.padding = '0.5rem 2rem';
this.output.style.marginLeft = '2rem';
}
display() {
this.output.innerHTML = `${this.counter}`;
}
@LostInBrittany#WebComponents @CodemotionWorld
my-counter custom element
@LostInBrittany#WebComponents @CodemotionWorld
Polymer
Adding syntactic sugar
to the standard
@LostInBrittany#WebComponents @CodemotionWorld
Everything is better with sugar
<link rel="import" href="./bower_components/polymer/polymer.html">
<dom-module id="my-polymer-counter">
<template>
<style>
:host {
font-size: 5rem;
}
button {
font-size: 5rem;
border-radius: 1rem;
padding: 0.5rem 2rem;
}
</style>
<button on-click="increment">+</button>
<span>[[counter]]</span>
</template>
@LostInBrittany#WebComponents @CodemotionWorld
Everything is better with
sugar
<script>
class MyPolymerCounter extends Polymer.Element {
static get is() { return 'my-polymer-counter'; }
static get properties() {
return {
counter: { type: Number, reflectToAttribute:true, value: 0 }
}
}
increment() {
this.counter = Number.parseInt(this.counter) + 1;
}
}
customElements.define('my-polymer-counter', MyPolymerCounter);
</script>
</dom-module>
@LostInBrittany#WebComponents @CodemotionWorld
Everything is better with sugar
Polymer is like jQuery for Web components
@notwaldorf
@LostInBrittany#WebComponents @CodemotionWorld
But they are still custom elements
100% interoperables
@LostInBrittany#WebComponents @CodemotionWorld
Interoperation pattern
Attributes for data in
Events for data out
@LostInBrittany#WebComponents @CodemotionWorld
To infinity and beyond!
There is a world outside Polymer
@LostInBrittany#WebComponents @CodemotionWorld
Lots of web components libraries
For different need and sensibilities
@LostInBrittany#WebComponents @CodemotionWorld
Lots of web components libraries
And the frameworks work on it too!
Angular Elements Vue Web Component
Wrapper
@LostInBrittany#WebComponents @CodemotionWorld
Slim.js
@LostInBrittany#WebComponents @CodemotionWorld
Slim.js
@LostInBrittany#WebComponents @CodemotionWorld
Slim.js
● Lightweight web component library
● Extended capabilities for components
○ data binding
● Using es6 native class inheritance
● Optional Shadow DOM
Like a lighter and lesser-featured Polymer
Fast & Robust Front-End Micro-framework based on modern standards
@LostInBrittany#WebComponents @CodemotionWorld
Slim.js
Slim.tag('my-slim-counter', `
<style> [...] </style>
<div class="container">
<div class="button" s:id="button"> <img src="./img/slim.png"> </div>
<div class="value" bind> {{counter}} </div>
</div>`,
class extends Slim {
onCreated() {
if (this.counter == undefined) {
this.counter = Number.parseInt(this.getAttribute('counter'))||'0';
}
this.button.onclick = () => {
this.counter++;
this.dispatchEvent(new CustomEvent('counter-changed', {detail: {counter: this.counter}}));
}
}
static get observedAttributes() { return [ 'counter' ] }
attributeChangedCallback(attr, oldVal, newVal) {
if (oldVal !== newVal) { this[attr] = newVal; }
}
});
@LostInBrittany#WebComponents @CodemotionWorld
Bram.js
@LostInBrittany#WebComponents @CodemotionWorld
Bram.js
@LostInBrittany#WebComponents @CodemotionWorld
Bram.js
● Lightweight web component library
● Extended capabilities for components
○ data binding
● Using es6 native class inheritance
● With optional Shadow DOM
Like a lighter and lesser-featured Polymer
A simple 4kB web components library
@LostInBrittany#WebComponents @CodemotionWorld
Bram.js
let template=`
<style> [...] </style>
<div class="container">
<div class="button" on-click="increase"> <img src="./img/bram.png"> </div>
<div class="value" > {{counter}} </div>
</div>`;
class MyBramCounter extends Bram(HTMLElement) {
static get template() {
let t = document.createElement('template');
t.innerHTML = template;
return t;
}
static get events() { return ['counter-changed']; }
constructor() {
super();
this.model.counter = this.getAttribute('counter') || 0;
}
static get observedAttributes() { return [ 'counter' ] }
attributeChangedCallback(attr, oldVal, newVal) {
if (oldVal !== newVal) { this[attr] = newVal; }
}
increase() {
this.model.counter++;
this.dispatchEvent(new CustomEvent('counter-changed', {detail: {counter: this.model.counter}}));
}
}
@LostInBrittany#WebComponents @CodemotionWorld
Skatejs
@LostInBrittany#WebComponents @CodemotionWorld
Skatejs
@LostInBrittany#WebComponents @CodemotionWorld
Skatejs
● Lightweight web component library
● Abstracts away attribute / property semantics
● Very very fast
● Can use many renderers
○ Basic innerHTML (default)
○ preact
○ lit-html
Nice if you dislike declarative syntax and DOM...
@LostInBrittany#WebComponents @CodemotionWorld
Skatejs
import { props, withComponent } from '/node_modules/skatejs/dist/esnext/index.js';
class MySkateCounter extends withComponent() {
constructor() {
super();
this.counter = this.counter || 0;
this.addEventListener('click', e => this.increment());
}
static get props() {
return {
// By declaring the property an attribute, we can now pass an initial value for the count as part of the HTML.
counter: props.string({ attribute: true })
};
}
render({ counter }) {
return `${this.style()}
<div class="container">
<div class="button"><img src="./img/skate.png"></div>
<div class="value">${counter}</div>
</div>`;
}
increment() {
this.counter = Number.parseInt(this.counter) + 1;
this.dispatchEvent(new CustomEvent('counter-changed', {detail: {counter: this.counter}}));
}
style() { return ` {...} `;
}
}
@LostInBrittany#WebComponents @CodemotionWorld
Stencil
A new breed of Web Components
@LostInBrittany#WebComponents @CodemotionWorld
Next generation Ionic
Ionic 4 will be fully based on web components
using a new toolkit: Stencil
@LostInBrittany#WebComponents @CodemotionWorld
New kid on the block
Announced during Polymer Summit
@LostInBrittany#WebComponents @CodemotionWorld
Not another library
A Web Component compiler
@LostInBrittany#WebComponents @CodemotionWorld
A build time tool
To generate standard web components
@LostInBrittany#WebComponents @CodemotionWorld
Fully featured
● Virtual DOM
● Async rendering
● Reactive data-binding
● TypeScript
● JSX
@LostInBrittany#WebComponents @CodemotionWorld
And the cherry on the cake
Server-Side Rendering
@LostInBrittany#WebComponents @CodemotionWorld
Clone the starter project
Start a live-reload server
Hands on Stencil
git clone https://github.com/ionic-team/stencil-app-starter my-app
cd my-app
git remote rm origin
npm install
npm start
@LostInBrittany#WebComponents @CodemotionWorld
Hands on Stencil
@LostInBrittany#WebComponents @CodemotionWorld
Hands on Stencil
@LostInBrittany#WebComponents @CodemotionWorld
Some concepts
JSX declarative template syntax
render() {
return (
<div>Hello {this.name}</div>
)
}
render() {
return (
<div>{this.name ? <p>Hello {this.name}</p> : <p>Hello World</p>}</div>
);
}
@LostInBrittany#WebComponents @CodemotionWorld
Some concepts
Decorators
import { Component } from '@stencil/core';
@Component({
tag: 'todo-list',
styleUrl: 'todo-list.scss'
})
export class TodoList {
@Prop() color: string;
@Prop() favoriteNumber: number;
@Prop() isSelected: boolean;
@Prop() myHttpService: MyHttpService;
}
@LostInBrittany#WebComponents @CodemotionWorld
Some concepts
Events
import { Event, EventEmitter } from '@stencil/core';
...
export class TodoList {
@Event() todoCompleted: EventEmitter;
someAction(todo: Todo) {
this.todoCompleted.emit(todo);
}
@Listen('todoCompleted')
todoCompletedHandler(event: CustomEvent) {
console.log('Received the custom todoCompleted event: ', event.detail);
}
}
@LostInBrittany#WebComponents @CodemotionWorld
Some concepts
Optional Shadow DOM
@Component({
tag: 'shadow-component',
styleUrl: 'shadow-component.scss',
shadow: true
})
export class ShadowComponent {
}
@LostInBrittany#WebComponents @CodemotionWorld
Some concepts
Generate distribution
stencil.config.js
exports.config = {
namespace: 'myname',
generateDistribution: true,
generateWWW: false,
...
};
@LostInBrittany#WebComponents @CodemotionWorld
Stencilimport { Component, Prop, PropWillChange, State, Event, EventEmitter } from '@stencil/core';
@Component({
tag: 'stencil-counter',
styleUrl: 'stencil-counter.scss',
shadow: true
})
export class StencilCounter {
@Prop() counter: number;
@State() currentCount: number;
@Event() currentCountChanged: EventEmitter;
@Watch('counter')
counterChanged(newValue: number) {
this.currentCount = newValue;
}
componentWillLoad() {
this.currentCount = this.counter;
}
increase() {
this.currentCount++;
this.currentCountChanged.emit({ counter: this.currentCount });
}
render() {
return (
<div class="container">
<div class="button" onClick={() => this.increase()}> <img src="./img/stencil.png" /> </div>
<div class="value" > {this.currentCount} </div>
</div>
);
}
}
@LostInBrittany#WebComponents @CodemotionWorld
Working together
They are all web components
@LostInBrittany#WebComponents @CodemotionWorld
Inside a simple Vue app
@LostInBrittany#WebComponents @CodemotionWorld
Using the standard pattern
Attributes (or properties) in
Events out
@LostInBrittany#WebComponents @CodemotionWorld
All of them working together
@LostInBrittany#WebComponents @CodemotionWorld
Conclusion
That's all folks!
@LostInBrittany#WebComponents @CodemotionWorld
Thank you!

More Related Content

PDF
GWT integration with Vaadin
PDF
[FEConf Korea 2017]Angular 컴포넌트 대화법
PDF
Vaadin Components @ Angular U
PDF
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
PDF
JSLab. Алексей Волков. "React на практике"
ODP
OpenWebBeans/Web Beans
PDF
Vaadin Components
PDF
Integrating Plone with E-Commerce and Relationship Management: A Case Study i...
GWT integration with Vaadin
[FEConf Korea 2017]Angular 컴포넌트 대화법
Vaadin Components @ Angular U
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
JSLab. Алексей Волков. "React на практике"
OpenWebBeans/Web Beans
Vaadin Components
Integrating Plone with E-Commerce and Relationship Management: A Case Study i...

What's hot (20)

PDF
Web Components & Polymer 1.0 (Webinale Berlin)
PDF
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
KEY
Building Web Service Clients with ActiveModel
PPT
Introduction To ASP.NET MVC
PDF
Booting up with polymer
PDF
Client-side Auth with Ember.js
PPTX
An introduction to Vue.js
PDF
Creating GUI Component APIs in Angular and Web Components
PDF
Building Universal Web Apps with React ForwardJS 2017
PDF
EmberConf 2015 – Ambitious UX for Ambitious Apps
PDF
Introduction to web components
PDF
Angular 2 Component Communication - Talk by Rob McDiarmid
PPTX
Intro to AngularJs
PPTX
Orchard Harvest 2014 - The Future of Widgets?
PPTX
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
PDF
Angular JS2 Training Session #2
PPTX
Key Insights into Development Design Patterns for Magento 2 - Magento Live UK
PPTX
jQuery for Sharepoint Dev
PDF
The Complementarity of React and Web Components
PDF
Usability in the GeoWeb
Web Components & Polymer 1.0 (Webinale Berlin)
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Building Web Service Clients with ActiveModel
Introduction To ASP.NET MVC
Booting up with polymer
Client-side Auth with Ember.js
An introduction to Vue.js
Creating GUI Component APIs in Angular and Web Components
Building Universal Web Apps with React ForwardJS 2017
EmberConf 2015 – Ambitious UX for Ambitious Apps
Introduction to web components
Angular 2 Component Communication - Talk by Rob McDiarmid
Intro to AngularJs
Orchard Harvest 2014 - The Future of Widgets?
CiklumJavaSat15112011:Andrew Mormysh-GWT features overview
Angular JS2 Training Session #2
Key Insights into Development Design Patterns for Magento 2 - Magento Live UK
jQuery for Sharepoint Dev
The Complementarity of React and Web Components
Usability in the GeoWeb
Ad

Similar to The Web Components interoperability challenge - Horacio Gonzalez - Codemotion Rome 2018 (20)

PDF
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
PDF
Polymer - pleasant client-side programming with web components
PDF
Introduction to Polymer and Firebase - Simon Gauvin
PPTX
Web Components: The Future of Web Development is Here
PDF
Devoxx France - Web Components, Polymer et Material Design
PDF
Web components the future is here
PDF
The Future of the Web
PDF
Web components - An Introduction
PPTX
Web Components: The Future of Web Development is Here
PDF
Web components are the future of the web - Take advantage of new web technolo...
PDF
Web Components for Java Developers
PDF
Webcomponents from 0-100 - with Google's Lit
PDF
Web Components Everywhere
PPTX
Polytechnic speaker deck oluwadamilare
PPTX
Polytechnic speaker deck oluwadamilare
PDF
Polymer
PDF
Polymer & the web components revolution 6:25:14
PDF
Interoperable Component Patterns
PPTX
Polymer 3.0 by Michele Gallotti
PDF
Introduction to Polymer
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Polymer - pleasant client-side programming with web components
Introduction to Polymer and Firebase - Simon Gauvin
Web Components: The Future of Web Development is Here
Devoxx France - Web Components, Polymer et Material Design
Web components the future is here
The Future of the Web
Web components - An Introduction
Web Components: The Future of Web Development is Here
Web components are the future of the web - Take advantage of new web technolo...
Web Components for Java Developers
Webcomponents from 0-100 - with Google's Lit
Web Components Everywhere
Polytechnic speaker deck oluwadamilare
Polytechnic speaker deck oluwadamilare
Polymer
Polymer & the web components revolution 6:25:14
Interoperable Component Patterns
Polymer 3.0 by Michele Gallotti
Introduction to Polymer
Ad

More from Codemotion (20)

PDF
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
PDF
Pompili - From hero to_zero: The FatalNoise neverending story
PPTX
Pastore - Commodore 65 - La storia
PPTX
Pennisi - Essere Richard Altwasser
PPTX
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
PPTX
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
PPTX
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
PPTX
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
PDF
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
PDF
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
PDF
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
PDF
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
PDF
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
PDF
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
PPTX
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
PPTX
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
PDF
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
PDF
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
PDF
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
PDF
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Pompili - From hero to_zero: The FatalNoise neverending story
Pastore - Commodore 65 - La storia
Pennisi - Essere Richard Altwasser
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019

Recently uploaded (20)

PDF
Empathic Computing: Creating Shared Understanding
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Approach and Philosophy of On baking technology
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPT
Teaching material agriculture food technology
PDF
Encapsulation theory and applications.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
cuic standard and advanced reporting.pdf
PPTX
Tartificialntelligence_presentation.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
Big Data Technologies - Introduction.pptx
Empathic Computing: Creating Shared Understanding
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Unlocking AI with Model Context Protocol (MCP)
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
NewMind AI Weekly Chronicles - August'25-Week II
Assigned Numbers - 2025 - Bluetooth® Document
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Approach and Philosophy of On baking technology
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Teaching material agriculture food technology
Encapsulation theory and applications.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
cuic standard and advanced reporting.pdf
Tartificialntelligence_presentation.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Big Data Technologies - Introduction.pptx

The Web Components interoperability challenge - Horacio Gonzalez - Codemotion Rome 2018