Lightning 
Overview
+Changwook.Doh 
cwdoh.com
Web Components: Overview
What problems are we solving?
Tab UI๋ฅผ ๋งŒ๋“œ๋Š” 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•
G-Mail ํŒ€๋„ ํž˜๋“ค์–ด ํ•˜๋Š” ๊ฒƒ? 
TAG SOUP!!!
@polyme 
r 
#itshackademic
http://drbl.in/esYL 
Tab UI ์ •๋„๋Š” 
์ข€ ์‰ฝ๊ฒŒ!
What do we need?
โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ 
๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” 
์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ด์š”.โ€
โ€œํŠนํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” HTML, CSS, JS๋ฅผ 
ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ๋“ค์ผ ์ˆ˜ ์žˆ์œผ๋ฉด...โ€
Web 
Components 
๋” ์ ์€ ์ฝ”๋“œ. ๋œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ. 
<paper-tabs> 
<paper-tab>KNOWLEDGE</paper-tab> 
<paper-tab>HISTORY</paper-tab> 
<paper-tab>FOOD</paper-tab> 
</paper-tabs>
Web Component?
Custom Element 
โ— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ์ •์˜. ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ํ™•์žฅ 
HTML Imports 
โ— HTML, CSS, JS๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? 
Shadow DOM 
โ— ์บก์Аํ™”๋œ DOM, CSS์˜ ์Šค์ฝ”ํ”„ ๋ถ„๋ฆฌ 
Template 
โ— ๋“œ๋””์–ด ๋“ฑ์žฅํ•œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›๋˜๋Š” ํ…œํ”Œ๋ฆฟ 
Web Component๋ฅผ ์ง€ํƒฑํ•˜๋Š” 4๊ฐ€์ง€ ๊ทœ๊ฒฉ!
Custom Elements 
define new HTML/DOM elements
<paper-tabs selected=โ€œ1โ€> 
<paper-tab>Tab 1</paper-tab> 
<paper-tab>Tab 2</paper-tab> 
<paper-tab>Tab 3</paper-tab> 
</paper-tabs> 
Custom Elements 
์ƒˆ HTML ์—˜๋ฆฌ๋จผํŠธ์˜ ์ •์˜ 
์„ ์–ธ์ , ๊ฐ€๋…์„ฑ 
์ง๊ด€์ ์ธ HTML 
ํ™•์žฅ ๋ฐฉ๋ฒ•์˜ ์ผ๋ฐ˜ํ™” โ†’ ์žฌ์‚ฌ์šฉ์„ฑ 
@polyme 
r 
#itshackademic
Shadow DOM 
DOM/CSS scoping
<video src=โ€œfoo.webmโ€ controls></video> 
@polyme 
r 
#itshackademic
์‹ค์ œ๋กœ Shadow DOM 
<video src=โ€œfoo.webmโ€ controls></video> 
@polyme 
r 
#itshackademic
<video src=โ€œfoo.webmโ€ controls></video>
Templates 
native client-side templating
var 
compiled 
= 
_.template("hello: 
<%= 
name 
%>"); 
compiled({name: 
'moe'}); 
=> 
"hello: 
moe" 
<script type="text/template"> 
// ... 
</script> 
Templating 
HTML Templates ์ด์ „ 
Text Templating 
Script Overloading 
Offline DOM 
<div id="mytemplate" hidden> 
<img src="logo.png"> 
<div class="comment"></div> 
</div>
<template> 
<div class=โ€œcommentโ€> 
<img src=โ€œimage.pngโ€> 
</div> 
<script>...</script> 
</template> 
HTML Templates 
๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๊ตฌํ˜„๋œ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ฐ˜์˜ ํ…œํ”Œ๋ฆฟ 
DOM ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด DOM ์‚ฌ์šฉ โ†’ no 
XSS 
ํŒŒ์‹ฑ๋˜๋‚˜, ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ 
๋ณต์ œ/์‚ฌ์šฉ ์ „๊นŒ์ง€ ์ฝ˜ํ…์ธ ๋Š” ๋น„ํ™œ์„ฑ 
doc fragment โ†’ ํŽ˜์ด์ง€์™€ ๋ถ„๋ฆฌ๋จ 
1. ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ 
2. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ 
3. ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ)๋Š” ๋กœ๋”ฉ๋˜์ง€ ์•Š์Œ 
4. ๋ฌธ์„œ ๋‚ด์—์„œ ํ†ต์ƒ์ ์ธ DOM์œผ๋กœ ์•ก์„ธ์Šค ๋ถˆ๊ฐ€
HTML Imports 
loading web components
<script> 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', '...', true); 
xhr.responseType = 'document'; 
xhr.onload = function(e) {}; 
xhr.send(); 
</script> 
Importing 
HTML Imports ์ด์ „ 
<iframe> 
Ajax 
Script HACK! 
<script type="text/html" src="..."></script>
Custom Elements 
์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ DOM Element ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก... 
Templates 
์ปดํฌ๋„ŒํŠธ์˜ ๊ณจ๊ฒฉ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก... 
Shadow DOM 
์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ, DOM์˜ ํ‘œํ˜„์„ ์บก์Аํ™”ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก... 
HTML Imports 
์œ„์˜ ์š”์†Œ๋“ค์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค(Markup, JS, CSS)๋ฅผ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก... 
์›น ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ๊ณผ ๋ฐฐํฌ์— ์ ํ•ฉํ•œ 4๊ฐ€์ง€ ๊ทœ๊ฒฉ
Polyfills Web Components 
with webcomponents.js
Adds syntactic โ€œsugarโ€ 
with polymer.js
Browser support 
Summer 2014 (with Polymer)
Browser support 
Summer 2014 (with Polymer)
Further readings... 
Itโ€™s hackademic with Polymer 
์•Œ์•„๋ด…์‹œ๋‹ค, Polymer: Web Components & Web Animations 
Chrome Enchanted: 2014๋…„ ์ฃผ๋ชฉํ• ๋งŒํ•œ HTML5 ๊ทœ๊ฒฉ 4์ข… 
์›น ์ปดํฌ๋„ŒํŠธ: ์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์›น ๊ฐœ๋ฐœ๋กœ ๊ฐ€๋Š” ๊ด€๋ฌธ 
Introduction to Web Components 
Shadow DOM 101: ๊ธฐ์ดˆ 
Shadow DOM 201: CSS์™€ ์Šคํƒ€์ผ๋ง 
Shadow DOM 301: ๊ณ ๊ธ‰ ๊ฐœ๋…๊ณผ DOM API 
HTML Imports: ์›น์„ ์œ„ํ•œ #include 
Custom Element: HTML์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ •์˜ํ•˜๊ธฐ 
HTML์˜ ์ƒˆ๋กœ์šด ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ
ROCK You!

Polymer Codelab: Before diving into polymer

  • 1.
  • 2.
  • 3.
  • 4.
    What problems arewe solving?
  • 5.
    Tab UI๋ฅผ ๋งŒ๋“œ๋Š”5๊ฐ€์ง€ ๋ฐฉ๋ฒ•
  • 6.
    G-Mail ํŒ€๋„ ํž˜๋“ค์–ดํ•˜๋Š” ๊ฒƒ? TAG SOUP!!!
  • 7.
  • 8.
    http://drbl.in/esYL Tab UI์ •๋„๋Š” ์ข€ ์‰ฝ๊ฒŒ!
  • 9.
  • 10.
    โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ด์š”.โ€
  • 11.
    โ€œํŠนํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”HTML, CSS, JS๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ๋“ค์ผ ์ˆ˜ ์žˆ์œผ๋ฉด...โ€
  • 12.
    Web Components ๋”์ ์€ ์ฝ”๋“œ. ๋œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ. <paper-tabs> <paper-tab>KNOWLEDGE</paper-tab> <paper-tab>HISTORY</paper-tab> <paper-tab>FOOD</paper-tab> </paper-tabs>
  • 13.
  • 14.
    Custom Element โ—์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ์ •์˜. ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ํ™•์žฅ HTML Imports โ— HTML, CSS, JS๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? Shadow DOM โ— ์บก์Аํ™”๋œ DOM, CSS์˜ ์Šค์ฝ”ํ”„ ๋ถ„๋ฆฌ Template โ— ๋“œ๋””์–ด ๋“ฑ์žฅํ•œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›๋˜๋Š” ํ…œํ”Œ๋ฆฟ Web Component๋ฅผ ์ง€ํƒฑํ•˜๋Š” 4๊ฐ€์ง€ ๊ทœ๊ฒฉ!
  • 15.
    Custom Elements definenew HTML/DOM elements
  • 17.
    <paper-tabs selected=โ€œ1โ€> <paper-tab>Tab1</paper-tab> <paper-tab>Tab 2</paper-tab> <paper-tab>Tab 3</paper-tab> </paper-tabs> Custom Elements ์ƒˆ HTML ์—˜๋ฆฌ๋จผํŠธ์˜ ์ •์˜ ์„ ์–ธ์ , ๊ฐ€๋…์„ฑ ์ง๊ด€์ ์ธ HTML ํ™•์žฅ ๋ฐฉ๋ฒ•์˜ ์ผ๋ฐ˜ํ™” โ†’ ์žฌ์‚ฌ์šฉ์„ฑ @polyme r #itshackademic
  • 18.
  • 19.
  • 20.
    ์‹ค์ œ๋กœ Shadow DOM <video src=โ€œfoo.webmโ€ controls></video> @polyme r #itshackademic
  • 21.
  • 22.
  • 23.
    var compiled = _.template("hello: <%= name %>"); compiled({name: 'moe'}); => "hello: moe" <script type="text/template"> // ... </script> Templating HTML Templates ์ด์ „ Text Templating Script Overloading Offline DOM <div id="mytemplate" hidden> <img src="logo.png"> <div class="comment"></div> </div>
  • 24.
    <template> <div class=โ€œcommentโ€> <img src=โ€œimage.pngโ€> </div> <script>...</script> </template> HTML Templates ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๊ตฌํ˜„๋œ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ฐ˜์˜ ํ…œํ”Œ๋ฆฟ DOM ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด DOM ์‚ฌ์šฉ โ†’ no XSS ํŒŒ์‹ฑ๋˜๋‚˜, ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ ๋ณต์ œ/์‚ฌ์šฉ ์ „๊นŒ์ง€ ์ฝ˜ํ…์ธ ๋Š” ๋น„ํ™œ์„ฑ doc fragment โ†’ ํŽ˜์ด์ง€์™€ ๋ถ„๋ฆฌ๋จ 1. ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ 2. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ 3. ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ)๋Š” ๋กœ๋”ฉ๋˜์ง€ ์•Š์Œ 4. ๋ฌธ์„œ ๋‚ด์—์„œ ํ†ต์ƒ์ ์ธ DOM์œผ๋กœ ์•ก์„ธ์Šค ๋ถˆ๊ฐ€
  • 25.
    HTML Imports loadingweb components
  • 26.
    <script> var xhr= new XMLHttpRequest(); xhr.open('GET', '...', true); xhr.responseType = 'document'; xhr.onload = function(e) {}; xhr.send(); </script> Importing HTML Imports ์ด์ „ <iframe> Ajax Script HACK! <script type="text/html" src="..."></script>
  • 29.
    Custom Elements ์ปดํฌ๋„ŒํŠธ๊ฐ€์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ DOM Element ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก... Templates ์ปดํฌ๋„ŒํŠธ์˜ ๊ณจ๊ฒฉ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก... Shadow DOM ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ, DOM์˜ ํ‘œํ˜„์„ ์บก์Аํ™”ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก... HTML Imports ์œ„์˜ ์š”์†Œ๋“ค์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค(Markup, JS, CSS)๋ฅผ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก... ์›น ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ๊ณผ ๋ฐฐํฌ์— ์ ํ•ฉํ•œ 4๊ฐ€์ง€ ๊ทœ๊ฒฉ
  • 30.
    Polyfills Web Components with webcomponents.js
  • 31.
  • 32.
    Browser support Summer2014 (with Polymer)
  • 33.
    Browser support Summer2014 (with Polymer)
  • 34.
    Further readings... Itโ€™shackademic with Polymer ์•Œ์•„๋ด…์‹œ๋‹ค, Polymer: Web Components & Web Animations Chrome Enchanted: 2014๋…„ ์ฃผ๋ชฉํ• ๋งŒํ•œ HTML5 ๊ทœ๊ฒฉ 4์ข… ์›น ์ปดํฌ๋„ŒํŠธ: ์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์›น ๊ฐœ๋ฐœ๋กœ ๊ฐ€๋Š” ๊ด€๋ฌธ Introduction to Web Components Shadow DOM 101: ๊ธฐ์ดˆ Shadow DOM 201: CSS์™€ ์Šคํƒ€์ผ๋ง Shadow DOM 301: ๊ณ ๊ธ‰ ๊ฐœ๋…๊ณผ DOM API HTML Imports: ์›น์„ ์œ„ํ•œ #include Custom Element: HTML์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ •์˜ํ•˜๊ธฐ HTML์˜ ์ƒˆ๋กœ์šด ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ
  • 35.