Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Components Now!

Components Now!

WebComponents is a great idea! The problem is that WebComponents API is in working draft...

Why we don't use just Components? Why we are waiting for that Web- prefix? We can use them right now and without havy polyfills! He will show you how to write Components today!

Video https://www.youtube.com/watch?v=cROv1myc6NM

Mikhail Davydov

February 18, 2014
Tweet

More Decks by Mikhail Davydov

Other Decks in Technology

Transcript

  1. About myself •Front-End Engineer at Yandex •Developer of Yandex.Taxi and

    Yandex.Mobile •JavaScript Teacher •Blogger 02
  2. Code libraries •jQuery — fixes DOM •Underscore — fills ECMAScript

    3-5 gap •Backbone — brings MV* •They are created to fix Web For some historical reasons many good tools are libraries. The DOM is a Mess 2009 06
  3. Libraries are big •Heavy –jQuery 2.0.3 — 230K (unpacked) •Hard

    to understand –Cyclomatic complexity of $.ajax — 43 •Too powerful –$.ajax, $.animate, _ 08
  4. Libraries are tightly coupled •Hard to get a small part

    –$.Deferred, $.ajax –_.template •Manual extraction •Their modules don't help much 09
  5. Polyfills can fix the rest •CSS3 Selectors (slow, not recommended)

    •Cross-Origin Resource Sharing •HTML5 Elements •ECMAScript 5 HTML5 Please polyfills 15
  6. Components are simple •Lightweight –dom — 28K, 3K self (unpacked)

    •Single responsibility & KISS Principle •Easy to understand –Maintain –Write tests 21
  7. Components are standalone •Contain all dependencies –Most of them are

    external •Easy to reuse – bower i name – npm i name •It is simple to use a part 23
  8. Components are isolated •Do not interfere with others –Scoped CSS

    –Flexible layout –No globals leak •Have restricted access to others – require() 25
  9. WebComponents •Idea of Custom HTML Elements •API/Framework –Shadow DOM (Encapsulation)

    –HTML Imports & Templates –Template Binding Web components and the future of web development from MR 2013 27
  10. WebComponents in 2014 HTML Templates Shadow DOM Custom Elements HTML

    Imports It is possible to polyfill others using Polymer. 28
  11. Alternatives for these APIs WebComponents API Alternative Custom Elements Component

    engines Shadow DOM BEM Methodology HTML Templates Template engines HTML Imports Build tools Scoped CSS BEM or OOCSS Template Binding Data binding 29
  12. BEM briefly •Avoid CSS cascade •Block — Custom Element •Element

    — Shadow DOM •Modifier — Component State Maintainable frontend development with BEM from MR 2013 32
  13. Keep in mind that •Component is Simple –KISS •Component is

    Standalone –Dependencies •Component is Isolated –Layout, CSS, JS 36
  14. Package file is the contract // bower.json { "name" "name":

    "my-share" "my-share", "version" "version": "1.0.0" "1.0.0", "main" "main": ["my-share.js" "my-share.js"] } Bower and format of bower.json 01. 02. 03. 04. 05. 06. 38
  15. Private HTML Layout <!-- my-share.html --> <a a href href="

    "{{ href }} {{ href }}" " class class="my-share" "my-share"> <img img src src=" "{{ icon }} {{ icon }}" " class class="my-share__icon" "my-share__icon"/> <span span class class="my-share__label" "my-share__label">{{ label }}</span span> </a a> This template is written using BEM Methodology. 01. 02. 03. 04. 05. 40
  16. Interface <a a class class="my-share" "my-share" data-href="{{ href }}" data-icon="{{

    icon }}" >{{ label }}</a a> This interface is similar to the WebComponents. 01. 02. 03. 04. 42
  17. WebComponents for comparison <my-share my-share href="{{ href }}" icon="{{ icon

    }}" >{{ label }}</my-share my-share> 01. 02. 03. 04. 43
  18. CSS of Component . .my-share my-share {} .my my-share__icon {

    vertical-align vertical-align: middle; middle; height height: 16px; 16px; } .my my-share__label { padding-left padding-left: 5px; 5px; } 01. 02. 03. 04. 05. 06. 07. 08. 44
  19. CSS of WebComponent my-share {} .icon { vertical-align vertical-align: middle;

    middle; height height: 16px; 16px; } .label { padding-left padding-left: 5px; 5px; } 01. 02. 03. 04. 05. 06. 07. 08. 45
  20. CSS is isolated •WebComponent — DOM API – <style scoped>

    •BEM –Avoid CSS cascade –Naming conventions .block__element 46
  21. External dependencies // bower.json "dependencies" "dependencies": { "tpl" "tpl": "azproduction/lodash-template"

    "azproduction/lodash-template", "domify" "domify": "component/domify" "component/domify", "decl" "decl": "azproduction/decl" "azproduction/decl" } Declare all external dependencies. 01. 02. 03. 04. 05. 06. 48
  22. Component relations // my-share.js var var tpl = require('tpl' 'tpl'),

    decl = require('decl' 'decl'), domify = require('domify' 'domify'); var var html = require('templates/my-share' 'templates/my-share'), template = tpl(html); 01. 02. 03. 04. 05. 06. 07. 49
  23. Component logic function function MyShare(el) { this this.options = this

    this.collectOptions(el); this this.el = this this.render(); this this.delegateEvents(); this this.replaceElement(el); } decl('.my-share' '.my-share', MyShare); module.exports = MyShare; 01. 02. 03. 04. 05. 06. 07. 08. 50
  24. JavaScript is isolated •CommonJS/Modules –No globals leak –It asks for

    requirements –It provides resources •AMD can be used too 51
  25. Using my-share Component <a a class class="my-share" "my-share" ... ...>Tweet</a

    a> <link link rel rel="stylesheet" "stylesheet" href href=" "my-share.css my-share.css" "/> <script script src src=" "my-share.js my-share.js" "></script script> Compare with WebComponents. 01. 02. 03. 55
  26. Using my-share WebComponent <my-share my-share ... ...>Tweet</my-share my-share> <link link

    rel rel="import" "import" href href=" "my-share.html my-share.html" "/> 01. 02. 56
  27. Conclusion •Web is Fixed, Mobile is Growing •Libraries are big

    and clumsy •WebComponents == API •Write and use Components 60
  28. Useful resources •Code of my-share •You might not need jQuery

    •BEM Methodology •Web Components •Polymer Project 62
  29. Sources of images • minecraft.gamepedia.com/Blocks • fr.fotopedia.com/wiki/Bibliothèque#!/items/flickr-6899137527 • www.planetminecraft.com/project/minecraft-site/ •

    investments.academic.ru/1513/Форвардный_контракт • frozen-lama.deviantart.com/art/Minecraft-Compound-Door-209872466 • www.postandcourier.com/article/20120620/pc1002/120629985 • isintu.com/features/responsive-design/ • nicolaijuhler.wordpress.com/ • r3c0nic.deviantart.com/art/minecraft-Blueprint-293455933 • ru-wallp.com/view/1542/ 64