The Complementarity of – React.js and Web Components



The Complementarity of – React.js and Web Components

0 1


complementarity-of-react-and-web-components-presentation

Talk given at React.js Conf, January 29, 2015 at Facebook HQ

On Github andrewrota / complementarity-of-react-and-web-components-presentation

The Complementarity of

React.js and Web Components

React.js Conf 2015 | @AndrewRota

Image CC-SA 3.0 by Medeis

I ❤

Web Components

Web Components usher in a new era of web development based on encapsulated and interoperable custom elements that extend HTML itself. — Polymer Project

Custom Elements

Shadow DOM

HTML Imports

HTML Templates

Custom Elements

<my-element>Hello World.</my-element>
var MyElement = document.registerElement('my-element', {
    prototype: Object.create(HTMLElement.prototype)
});

Shadow DOM

// Create Shadow Root
var s = document.getElementById('my-element').createShadowRoot();

// Add Styles and Text
s.innerHTML += '<style>p { color: red; }</style>';
<my-custom-element customAttribute="foo"></my-custom-element>
<my-custom-element customAttribute="foo">
  <!-- SHADOW DOM -->
  <style>p { color: red; }</style>
  <div>
    <button name="button"><content></content></button>
    <p>Lorem Ipsum</p>
  </div>
  <script>doSomething();</script>
  <!-- /SHADOW DOM -->
</my-custom-element>

Web Components are portable, because their API is the web platform itself.

<input type="text" />

<a href="http://conf.reactjs.com/">Link!</a>

<video src="video.ogg" autoplay controls></video>

<x-calendar view="2015-01-29"></x-calendar>

<chart-pie values="[10, 20, 5, 50]"></chart-pie>

<my-custom-element customAttribute="foo"></my-custom-element>

I ❤

Virtual DOM

One-Way Data Flow

Ultra-High Performance

Synthetic Event System

Cohesive, Loosely Coupled Components

Client + Server Rendering

?

“I definitely think it's the wrong programming paradigm; I really hope that [web components] do not succeed.”

Pete Hunt

React or Web Components: Pick One?

Custom Elements
Shadow DOM
Encapsulation
Reusability
Portability

or

Virtual DOM
Synthetic Event System
One-Way Data Flow
Ultra-High Performance
Client + Server Rendering

Custom Elements
Shadow DOM
Encapsulation
Reusability
Portability

+

Virtual DOM
Synthetic Event System
One-Way Data Flow
Ultra-High Performance
Client + Server Rendering

<React/>

React

React

React

DOM

DOM

DOM

WC

WC

DOM

React.render(
  <my-custom-element>Web Components!!</my-custom-element>,
  document.getElementById('root')
);
ERROR in ./src/js/init.js
Module build failed:Error: Lower case componentnames (my-custom-element) are no longersupported in JSX: Seehttp://fb.me/react-jsx-lower-case

“The Whitelist Problem”

“every time there's a new HTML/SVG tag, you can't use it until we add it to the whitelist. You can't add it to the whitelist until you update your existing codebase.”

Sebastian Markbåge (Oct. 5, 2014)

v0.12-rc1

“To address this, we decided on a convention:All JSX tags that start with a lower-case letter or contain a dash are treated as HTML.

…This also introduces the possibility to consume custom elements (Web Components)”

Sebastian Markbåge (Oct. 16, 2014)

“The Web is continuously evolving.”

WHATWG

Goodbye, Whitelist

Removed unknown tag warning/whitelist. #2830

Goodbye, Warning

Removed unknown tag warning/whitelist. #2830

Hello, Custom Elements!

React.render(
  <my-custom-element>Web Components!!</my-custom-element>,
  document.getElementById('root')
);

Hello, Custom Elements!

React.render(
  React.createElement('my-custom-element', null, 'Web Components!!'),
  document.getElementById('root')
);

                    

                    

                    

                

Best Practices for BuildingWeb Components for React.js

Best Practices for BuildingWeb Components for    React.js    Anything

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

Good Idea

<my-button></my-button>

Bad Idea

<my-application></my-application>

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

Component API

Attributes

<paper-toast text="Hello, world">

Methods

   getDOMNode().toggle()

Events

      <paper-toast onClick={this.handleClick}>

Custom Events

React.createClass({
  render: function() {
    return (
      <paper-toast ref="myCustomElement" text="Hello, World"></paper-toast>
    );
  },
  componentDidMount: function() {
     this.refs.myCustomElement.getDOMNode()
       .addEventListener('core-overlay-close-completed', doSomething);
  },
  componentWillUnmount: function() {
     this.refs.myCustomElement.getDOMNode()
       .removeEventListener('core-overlay-close-completed', doSomething);
  }
});
                    

Not All Web Components Are Created Equal

<google-map></google-map>

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

“Try to keep as many of your components as possible stateless.”

React.js Documentation— Great advice for Web Components

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

Your application is only as fast as your slowest component.

Web Components Should Be…

- Small

- Extremely Encapsulated

- As Stateless as Possible

- Performant

tl;dr Web Components should seem no different than native DOM elements.

corollary: Use Web Components in React.js as if they were native DOM elements.

<React/>

React

React

React

DOM

DOM

DOM

WC

WC

DOM

React

React within Web Components?

The Future (?)

Custom Attribute Support (Issue #2746)

Custom Event Support

Thanks!

@AndrewRota