Still got your Skate on

Trey (Z) Shugart

DogeScripter, Atlassian

@treshugart

slides.com/treshugart/still-got-your-skate-js-on/live

skate.js

Skate

Web component library focusing on the custom element spec.

  • Tag, attribute and class bindings
  • Element lifecycle handlers
  • Attribute lifecycle handlers
  • Event binding and delegation
  • Templating support
  • Works in IE9+
  • Super fast, super tiny

Custom Elements

Tag bindings

<my-component></my-component>
skate('my-component', {
  ...
});

Existing Elements

"is" attribute bindings

<div is="my-component"></div>
skate('my-component', {
  extends: 'div',
  ...
});

Attributes

Attribute bindings

<div my-component></div>
<span my-component></span>
<a my-component></a>
...
skate('my-component', {
  type: skate.types.ATTR
  ...
});

Restrict to <div>

skate('my-component', {
  type: skate.types.ATTR
  extends: 'div',
  ...
});

Classes

Class bindings

<div class="my-component"></div>
<span class="my-component"></span>
<a class="my-component"></a>
...
skate('my-component', {
  type: skate.types.CLASS
  ...
});

Restrict to <div>

skate('my-component', {
  type: skate.types.CLASS
  extends: 'div',
  ...
});

Element Lifecycle

Lifecycle callbacks

var MyComponent = skate('my-component', {
  created: function (element) {},
  attached: function (element) {},
  detached: function (element) {}
});
// created()
var element = new MyComponent(); // or: document.createElement('my-component')

// attached()
document.body.appendChild(element);

// detached()
element.remove();
// created(), then attached(), in that order
document.body.innerHTML = '<my-component></my-component>';

// detached();
document.body.elements[0].remove();

Custom Methods & Properties

document.querySelector('bad-doge').bark();
skate('bad-doge', {
  prototype: {
    bark: function () {
      ...
    }
  }
});

Attribute Lifecycle

Changes to any attribute

skate('my-component' {
  attributes: function (element, data) {}
});

Specific attributes

skate('my-component' {
  attributes: {
    'my-attribute': function (element, data) {}
  }
});

specific changes to an attribute

skate('my-component' {
  attributes: {
    'my-attribute': {
      created: function (element, data) {},
      updated: function (element, data) {},
      removed: function (element, data) {}
    }
  }
});

Events

Event binding

skate('my-component', {
  events: {
    click: function (element, eventObject) {}
  }
});

and delegation

skate('my-component', {
  events: {
    'click .selector': function (element, eventObject, currentTarget) {}
  }
});

Templating

Template hook

var template = Handlebars.compile('Hello, {{name}}!');

skate('my-component', {
  template: function (element) {
    element.innerHTML = template({
      name: 'World'
    });
  }
});

Why

Why don't we use:

  • Polymer
  • Ember
  • Angular
  • React
  • etc

Why

  • Size & speed
  • Backward compatibility
  • Framework agnostic
  • Easier to swallow
  • Future

Thanks!

github.com/skatejs/skatejs

Still got your Skate on

By Trey Shugart

Still got your Skate on

  • 2,861