SlideShare a Scribd company logo
Web Components
part - I
Chang W. Doh
KIG 31st
Chang W. Doh
HTML5Rocks/KO Blogger
โ€œํƒœ์–‘ ์•„๋ž˜ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†๋‹ค.โ€
์ปดํฌ๋„ŒํŠธ์˜ ์ฃผ์š” ๊ฐœ๋…
1. ์žฌ์‚ฌ์šฉ์„ฑ
2. ์กฐํ•ฉ์„ฑ
3. ๋ชจ๋“ˆํ™”
Why?
์›น์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ
๋ฒ•
YUI
jQuery
KENDO UI
Angular
Sencha
โ€œ์šฐ๋ฆฌ ๊ตฌํ˜„์„ ์กฐ๊ธˆ ๋ฐ”๊พธ์–ด์•ผ๊ฒ ๋Š”๋ฐ?โ€
Web Components - Part.I, @KIG 30th
Tag soup
Do you love this?
Web Components - Part.I, @KIG 30th
๋ฌด์—‡์ด ํ•„์š”ํ•œ๊ฐ€?
โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ๊ฒƒ๋“ค ํ˜น์€ ๊ตฌ์กฐ ์ƒ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ
๋“ค์„ ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ์žฌํ™œ์šฉ์ด
๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•โ€
์กฐ๊ธˆ ๋” ๋‚˜์•„๊ฐ€์„œ...
โ— ํŠนํžˆ, UI ์š”์†Œ๋“ค์ด ๋งŽ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ๋Š”
โ—‹ โ€œ๋ฆฌ์†Œ์Šค ๊ด€์ ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” HTML, CSS, ์ž๋ฐ”
์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ 
๋‹ค.โ€
์›น ์ปดํฌ๋„ŒํŠธ!
ํ”„๋ก ํŠธ์—”๋“œ ์›น์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ ์‹œ์Šคํ…œ
์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€ํƒฑํ•˜๋Š” 4๊ฐ€์ง€ ๊ธฐ๋‘ฅ
1. Shadow DOM
2. Custom Elements
3. HTML Templates
4. HTML Imports
Quick Overview
โ— Shadow DOM
โ—‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” DOM, CSS, JS ์บก์Аํ™” ๋ฐ ์™ธ๋ถ€
๋กœ๋ถ€ํ„ฐ์˜ ๊ฐ„์„ญ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šค์ฝ”ํ”„ ๋ถ„๋ฆฌ
โ— HTML Template
โ—‹ ์ •์˜๋œ ๋งˆํฌ์—…์„ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ๋กœ๋”ฉ ๋ฐ ๋Ÿฐํƒ€์ž„
์‚ฌ์šฉ
โ— Custom Element
โ—‹ ์›น ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•  ์—˜๋ฆฌ๋จผํŠธ์˜ ๋™์ ์ธ ๋“ฑ๋ก ๋ฐ ํ™•์žฅ
โ— HTML Imports
โ—‹ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์›น ๋ฌธ์„œ ๋‚ด์— ๋ฌธ์„œ์˜ ์ผ๋ถ€/์ „์ฒด๋ฅผ ํฌํ•จํ•˜
๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ œ๊ณต
Shadow DOM
โ— ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ = ํ•˜๋‚˜์˜ ๋ฌธ์„œ
โ—‹ ๋‹ค๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ์ œ์–ด
โ—‹ ๊ฐœ๋ฐœ ์‹œ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ์˜ ๊ตฌ์กฐ์ ์ธ ์ด์Šˆ๋“ค์ด ๋ฐœ์ƒ
์™œ Shadow DOM์ธ๊ฐ€?
Shadow DOM 101
โ— ํŠน์ •ํ•œ DOM์„ ์„œ๋ธŒ DOM ํŠธ๋ฆฌ๋กœ ๋ Œ๋”๋ง
โ—‹ ์ฆ‰, ์ปจํ…์ธ ๋ฅผ ํ‘œํ˜„๊ณผ ๋ถ„๋ฆฌ
โ— Shadow Host vs. Shadow Root
โ—‹ root = hostNode.createShadowRoot()
โ—‹ <content select=โ€™queryโ€™></content>
โ—‹ DOM Visualizer
Shadow DOM 201
โ— Shadow DOM์˜ ์Šคํƒ€์ผ๋ง
โ—‹ ์„€๋„ ๊ฒฝ๊ณ„(Shadow Boundary)
<div><h3>Light DOM</h3></div>
<script>
var root = document.querySelector('div').createShadowRoot();
root.innerHTML = '<style>h3{ color: red; }</style>' +
'<h3>Shadow DOM</h3>';
</script>
Shadow DOM
Shadow DOM 201
โ— host: ์…€๋ ‰ํ„ฐ
โ—‹ hostNode์— ๋Œ€ํ•œ ์…€๋ ‰ํ„ฐ
<style>
:host {
opacity: 0.4;
transition: opacity 420ms ease-in-out;
}
:host:hover {
opacity: 1;
}
:host:active {
position: relative;
top: 3px;
left: 3px;
}
</style>
Shadow DOM 201
โ— ํ•จ์ˆ˜ํ˜• :host()
:host(x-foo:host) {
/* Applies if the host is a <x-foo> element.*/
}
:host(x-bar:host) {
/* Applies if the host is a <x-bar> element. */
}
:host(div) { {
/* Applies if the host element or an ancestor is a <div>. */
}
Shadow DOM 201
โ— hat - ^
<style>
#host ^ span {
color: red;
}
</style>
<div id="host">
<span>Light DOM</span>
</div>
<script>
var host = document.querySelector('div');
var root = host.createShadowRoot();
root.innerHTML = "<span>Shadow DOM</span>" +
"<content></content>";
</script>
Shadow DOM 201
โ— hat - contโ€™d
โ— cat - ^^
// No fun.
document.querySelector('x-tabs').shadowRoot
.querySelector('x-panel').shadowRoot
.querySelector('#foo');
// Fun.
document.querySelector('x-tabs ^ x-panel ^ #foo');
x-tabs ^^ x-panel {
...
}
Shadow DOM 201
โ— .resetStyleInheritance
โ—‹ true - ์ƒ์†๊ฐ€๋Šฅํ•œ ์†์„ฑ๋“ค์„ initial์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—‹ false - ์ƒ์† ๊ฐ€๋Šฅํ•œ CSS ์†์„ฑ๋“ค์ด ์ƒ์†์„ ์œ ์ง€ํ•ฉ๋‹ˆ
๋‹ค.
โ— .applyAuthorStyles
โ—‹ true - ์ €์ž‘์ž์˜ ๋ฌธ์„œ ๋‚ด์— ์ •์˜๋œ ์†์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ—‹ false - ๋””ํดํŠธ. ์Šคํƒ€์ผ์€ ์„€๋„ ํŠธ๋ฆฌ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต
๋‹ˆ๋‹ค.
Shadow DOM 201
โ— Cheat Sheet
์‹œ๋‚˜๋ฆฌ์˜ค applyAuthorStyles resetStyleInheritance
์ž์ฒด์ ์ธ ํ…Œ๋งˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ
์œผ๋‚˜ ๊ธฐ๋ณธ ์ƒ์† ์†์„ฑ์€ ์œ ์ง€
false false
์ž์ฒด์ ์ธ ์Šคํƒ€์ผ ํ…Œ๋งˆ ์œ ์ง€ false true
ํŽ˜์ด์ง€๋กœ๋ถ€ํ„ฐ ์Šคํƒ€์ผ ํ…Œ๋งˆ
๋งŒ
true true
์ตœ์žฌํ•œ ํŽ˜์ด์ง€์— ๊ฐ€๊น๊ฒŒ true false
Shadow DOM 201
โ— ::content - ํ˜ธ์ŠคํŠธ ๋…ธ๋“œ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ํ•œ์ •
<script>
var div = document.querySelector('div');
var root = div.createShadowRoot();
root.innerHTML = '
<style>
h3 { color: red; }
content[select="h3"]::content > h3 {
color: green;
}
::content section p {
text-decoration: underline;
}
</style>
<h3>Shadow DOM</h3>
<content select="h3"></content>
<content select="section"></content>';
</script>
Custom elements
Custom Elements
โ— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
โ—‹ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋“ฑ๋ก
โ—‹ ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์†ํ•œ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ํ™•์žฅ
โ—‹ Tag์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ ์ง€์ •/์ถ”๊ฐ€
โ—‹ ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋ฉ”์†Œ๋“œ/์ด๋ฒคํŠธ ํ™•์žฅ
Custom Elements
โ— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋“ฑ๋ก
โ— ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ํ™•์žฅ
var XFoo = document.registerElement('x-foo');
document.body.appendChild(new XFoo());
var MegaButton = document.registerElement('mega-button', {
prototype: Object.create(HTMLButtonElement.prototype)
});
Custom Elements
โ— ํ”„๋กœํผํ‹ฐ ๋ฐ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
var XFooProto = Object.create(HTMLElement.prototype);
// 1. x-foo์— foo() ๋ฉ”์„œ๋“œ ์ฃผ๊ธฐ.
XFooProto.foo = function() {
alert('foo() called');
};
// 2. read-only ์†์„ฑ์˜ "bar" ํ”„๋กœํผํ‹ฐ ์ •์˜.
Object.defineProperty(XFooProto, "bar", {value: 5});
// 3. x-foo์˜ ์ •์˜๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ.
var XFoo = document.registerElement('x-foo', {prototype: XFooProto});
// 4. x-foo ์ธ์Šคํ„ด์Šคํ™”.
var xfoo = document.createElement('x-foo');
// 5. xfoo ์ธ์Šคํ„ด์Šค๋ฅผ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€.
document.body.appendChild(xfoo);
Custom Elements
โ— ๋ช‡๊ฐ€์ง€ ์ฝœ๋ฐฑ
Callback Description
createdCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ
attachedCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ document์— ์‚ฝ์ž…๋˜์—ˆ์„ ๋•Œ
detachedCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ document์—์„œ ์‚ญ์ œ๋˜์—ˆ์„ ๋•Œ
attributeChangedCallback ์†์„ฑ์˜ ์ถ”๊ฐ€/์‚ญ์ œ/๊ฐฑ์‹ ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function() {...};
proto.attachedCallback = function() {...};
var XFoo = document.registerElement('x-foo', {prototype: proto});
HTML Template
HTML Template
โ— HTML Template ์ด์ „
โ—‹ Text Templating
โ—‹ Script Overloading
โ–  <script type=โ€text/template></script>
โ—‹ Offline DOM
โ–  ๋ณด์ด์ง€ ์•Š๋Š” DOM
HTML Template
โ— HTML Template ์ด์ „
โ—‹ Text Templating
โ—‹ Script Overloading
โ–  <script type=โ€text/template></script>
โ—‹ Offline DOM
โ–  ๋ณด์ด์ง€ ์•Š๋Š” DOM
HTML Template
โ— ์ง€์› ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
function supportsTemplate() {
return 'content' in document.createElement('template');
}
if (supportsTemplate()) {
// Good to go!
} else {
// Use old templating techniques or libraries.
}
โ— ํ…œํ”Œ๋ฆฟ์˜ ์„ ์–ธ
HTML Template
<template id="mytemplate">
<img src="" alt="great image">
<div class="comment"></div>
</template>
โ— ์ฃผ์š” ํŠน์ง•
โ—‹ ๋น„ํ™œ์„ฑํ™”
โ–  ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ 
โ–  ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ
โ–  ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ)๋Š” ๋กœ๋”ฉ๋˜์ง€ ์•Š๊ณ 
โ–  ๋ฌธ์„œ ๋‚ด์—์„œ ์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์•ก์„ธ์Šค๋˜์ง€ ์•Š์Œ
โ—‹ ๋ชจ๋“  ์œ„์น˜์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ
HTML Template
<table>
<tr>
<template id="cells-to-repeat">
<td>some content</td>
</template>
</tr>
</table>
โ— ํ…œํ”Œ๋ฆฟ์˜ ์‚ฌ์šฉ
HTML Template
<button onclick="useIt()">Use me</button>
<div id="container"></div>
<script>
function useIt() {
var content = document.querySelector('template').content;
// ํ…œํ”Œ๋ฆฟ DOM์—์„œ ๋ญ”๊ฐ€๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
var span = content.querySelector('span');
span.textContent = parseInt(span.textContent) + 1;
document.querySelector('#container').appendChild( document.importNode(content, true));
}
</script>
<template>
<div>Template used: <span>0</span></div>
<script>alert('Thanks!')</script>
</template>
HTML Imports
HTML Imports
โ— Imports ์ด์ „
โ—‹ <iframe>
โ—‹ Ajax
โ—‹ Script hack!
HTML Imports
โ— ๋ฌด์—‡์ด๋˜์ง€ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ฒ•์˜ ๋„๊ตฌ!
<head>
<link rel="import" href="/path/to/imports/stuff.html">
</head>
HTML Imports
โ— ์ง€์› ์—ฌ๋ถ€
function supportsImports() {
return 'import' in document.createElement('link');
}
if (supportsImports()) {
// ์ง€์›ํ•˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
} else {
// ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ require ์‹œ์Šคํ…œ๋“ค์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
}
HTML Imports
โ— Import ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง
<script async>
function handleLoad(e) {
console.log('Loaded import: ' + e.target.href);
}
function handleError(e) {
console.log('Error loading import: ' + e.target.href);
}
</script>
<link rel="import" href="file.html"
onload="handleLoad(event)" onerror="handleError(event)">
HTML Imports
โ— Scripting HTML Imports
var link = document.createElement('link');
link.rel = 'import';
link.href = 'file.html'
link.onload = function(e) {...};
link.onerror = function(e) {...};
document.head.appendChild(link);
HTML Imports
โ— link.import
โ— ๋‹จ, ์•„๋ž˜์˜ ๊ฒฝ์šฐ์—๋Š” null
โ—‹ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML Imports๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
โ—‹ <link>๊ฐ€ rel="import"๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ <link>๊ฐ€
DOM์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
โ—‹ <link>๊ฐ€ DOM์œผ๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ
โ—‹ ๋ฆฌ์†Œ์Šค๊ฐ€ 'CORS๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ'๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ.
var content = document.querySelector('link[rel="import"]').import;
HTML Imports
โ— ์‚ฝ์ž…์ž
<head>
<link rel="import" href="warnings.html">
</head>
<body>
...
<script>
var link = document.querySelector('link[rel="import"]');
var content = link.import;
// Grab DOM from warning.html's document.
var el = content.querySelector('.warning');
document.body.appendChild(el.cloneNode(true));
</script>
</body>
HTML Imports
โ— Scripting in importer
<link rel="stylesheet" href="http://www.example.com/styles.css">
<link rel="stylesheet" href="http://www.example.com/styles2.css">
...
<script>
// importDoc์€ import์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
var importDoc = document.currentScript.ownerDocument;
// mainDoc ๋ฉ”์ธ ๋„ํ๋จผํŠธ(์šฐ๋ฆฌ๊ฐ€ importํ•œ ํŽ˜์ด์ง€)๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
var mainDoc = document;
// ์ฒซ๋ฒˆ์งธ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ด import๋กœ๋ถ€ํ„ฐ ๋ถ™์žก์•„ ๋ณต์ œํ•˜๊ณ ,
// import๋œ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
var styles = importDoc.querySelector('link[rel="stylesheet"]');
mainDoc.head.appendChild(styles.cloneNode(true));
</script>
HTML Imports
โ— ์›น ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฐํฌ์— ์ ํ•ฉ
โ—‹ HTML Template
โ–  ์œ„์ ฏ์˜ ๋งˆํฌ์—…์„ ๊ตฌ์ถ•
โ—‹ Shadow DOM
โ–  ๋ฌธ์„œ์™€ ๋ถ„๋ฆฌ๋œ ์บก์Аํ™”๋œ HTML, JS, CSS ์ •์˜
โ—‹ Custom Element
โ–  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋“ฑ๋ก/ํ™•์žฅ
โ—‹ HTML Import ๊ทœ๊ฒฉ
โ–  HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฌถ์–ด์„œ ๋กœ๋”ฉํ•˜๋„๋ก
Importer ๊ตฌ์„ฑ
Tools
Tools
โ— Yeoman
โ—‹ Yo - ์ž‘์—… ํ๋ฆ„ ๊ด€๋ฆฌ ๋„๊ตฌ
โ—‹ Grunt - ๋นŒ๋“œ/ํ…Œ์ŠคํŒ… ๋“ฑ์˜ ํƒœ์Šคํฌ ๋Ÿฌ๋„ˆ
โ—‹ Bower - ์ปดํฌ๋„ŒํŠธ ๋ฐฐํฌ ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ
โ— Polymer
โ—‹ ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ Polyfill ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ
โ— Bricks
โ—‹ x-tag ๊ธฐ๋ฐ˜์˜ ์›น ์ปดํฌ๋„ŒํŠธ Polyfill ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Conclusion
Conclusion
์ƒ์‚ฐ์„ฑ, ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ํ
๋ฆ„
โ— โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ๊ฒƒ๋“ค ํ˜น์€ ๊ตฌ์กฐ ์ƒ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ
๊ฒƒ๋“ค์„ ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ์žฌ
ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•โ€
๋ฏธ๋ž˜๋ฅผ ์˜ˆ์ƒํ•ด๋ณด์ž๋ฉด...
โ— ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋„๊ตฌ์˜ ๋ณ€ํ™”๊ฐ€ ์˜ˆ์ƒ
โ— ์›น ๊ฐœ๋ฐœ ๋„๊ตฌ ์‹œ์žฅ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜ ๋ณ€ํ™”
Resources
HTML5Rocks: Web Component Tutorials
โ— Shadow DOM 101
โ— Shadow DOM 201: CSS & Styling
โ— Shadow DOM 301: Advanced Concepts & DOM API
โ— HTML Imports: #include for Web
โ— Custom Element: Defining new elements in HTML
โ— HTMLโ€™s new Template Tag: Standarizing client-side
templating
Further readings...
Resources
โ— Introduction to Web Components
โ— webcomponents.github.io
โ— Polymer Project
โ— Mozilla Brick
โ— Yeoman.io
Q&A
Thank you!
ํ”„๋ฆฌ์  ํ…Œ์ด์…˜ ์ž๋ฃŒ์—์„œ ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€์™€ ์†Œ์Šค ๋“ฑ์€ HTML5Rocks.com์˜ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ธ์šฉ๋˜์—ˆ
์Šต๋‹ˆ๋‹ค.

More Related Content

PDF
Web Components & Polymer
PDF
Polymerแ„„แ…กแ„…แ…กแ„Œแ…กแ†ธแ„€แ…ต
PDF
Polymer, legoแ„€แ…กแ‡€แ„‹แ…ต แ„†แ…กแ†ซแ„ƒแ…ณแ„‚แ…ณแ†ซ แ„‹แ…ฐแ†ธแ„‹แ…ฅแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ
PPTX
๋” ๋‚˜์€ ์›นํ‘œ์ค€์„ ์œ„ํ•œ Web Components
PDF
๋‹ค์‹œ๋ณด๋Š” Angular js
PDF
Handlebars
PPTX
Web Components 101 polymer & brick
PDF
[XECon+PHPFest 2014] jQuery ๊ฐœ๋ฐœ์ž์—์„œ AngularJS ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ
Web Components & Polymer
Polymerแ„„แ…กแ„…แ…กแ„Œแ…กแ†ธแ„€แ…ต
Polymer, legoแ„€แ…กแ‡€แ„‹แ…ต แ„†แ…กแ†ซแ„ƒแ…ณแ„‚แ…ณแ†ซ แ„‹แ…ฐแ†ธแ„‹แ…ฅแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ
๋” ๋‚˜์€ ์›นํ‘œ์ค€์„ ์œ„ํ•œ Web Components
๋‹ค์‹œ๋ณด๋Š” Angular js
Handlebars
Web Components 101 polymer & brick
[XECon+PHPFest 2014] jQuery ๊ฐœ๋ฐœ์ž์—์„œ AngularJS ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ

What's hot (20)

PDF
ํ˜์‹ ์ ์ธ ์›น์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Polymer
PDF
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ดํŽด๋ณด๊ธฐ
PPTX
AngularJS์˜ ๊ฐœ๋ฐœ๋ฐฉ์‹์— ๋Œ€ํ•˜์—ฌ
PDF
ReactJS | ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ดํŠธ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š”
PPTX
[ํ•˜์ฝ”์‚ฌ์„ธ๋ฏธ๋‚˜] ํ•œ ์‹œ๊ฐ„ ๋งŒ์— ๋ฐฐ์šฐ๋Š” Jquery
PPTX
Angular2๋ฅผ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ
PDF
แ„‹แ…กแ†ฏแ„‹แ…กแ„‡แ…ฉแ†ธแ„‰แ…ตแ„ƒแ…ก, Polymer: Web Components & Web Animations
PPT
ch04
PPTX
3-2. selector api
PDF
Clean Front-End Development
PDF
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #4
PPTX
Hacosa jquery 1th
PDF
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
PDF
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #2
PDF
[DevOn 2013] Backbone.jsแ„…แ…ฉ แ„‚แ…ณแ†ผแ„ƒแ…ฉแ†ผแ„Œแ…ฅแ†จ M-V แ„ƒแ…ตแ„Œแ…กแ„‹แ…ตแ†ซ แ„€แ…ฎแ„’แ…งแ†ซแ„’แ…กแ„€แ…ต
PDF
Vuejs ์‹œ์ž‘ํ•˜๊ธฐ
PDF
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #3
PPTX
Angular2๋ฅผ ์œ„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
PDF
์ง„์งœ๊ธฐ์ดˆ Node.js
PDF
Html5 web workers
ํ˜์‹ ์ ์ธ ์›น์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Polymer
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ดํŽด๋ณด๊ธฐ
AngularJS์˜ ๊ฐœ๋ฐœ๋ฐฉ์‹์— ๋Œ€ํ•˜์—ฌ
ReactJS | ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ดํŠธ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š”
[ํ•˜์ฝ”์‚ฌ์„ธ๋ฏธ๋‚˜] ํ•œ ์‹œ๊ฐ„ ๋งŒ์— ๋ฐฐ์šฐ๋Š” Jquery
Angular2๋ฅผ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ
แ„‹แ…กแ†ฏแ„‹แ…กแ„‡แ…ฉแ†ธแ„‰แ…ตแ„ƒแ…ก, Polymer: Web Components & Web Animations
ch04
3-2. selector api
Clean Front-End Development
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #4
Hacosa jquery 1th
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #2
[DevOn 2013] Backbone.jsแ„…แ…ฉ แ„‚แ…ณแ†ผแ„ƒแ…ฉแ†ผแ„Œแ…ฅแ†จ M-V แ„ƒแ…ตแ„Œแ…กแ„‹แ…ตแ†ซ แ„€แ…ฎแ„’แ…งแ†ซแ„’แ…กแ„€แ…ต
Vuejs ์‹œ์ž‘ํ•˜๊ธฐ
แ„Žแ…ฅแ„‹แ…ณแ†ทแ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ, แ„Œแ…ฆแ„‹แ…ตแ„แ…ฏแ„…แ…ต #3
Angular2๋ฅผ ์œ„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
์ง„์งœ๊ธฐ์ดˆ Node.js
Html5 web workers
Ad

Similar to Web Components - Part.I, @KIG 30th (20)

PPTX
Introduction to Web Components
PDF
Polymer Codelab: Before diving into polymer
PDF
[์ „ํŒŒ๊ต์œก] css day 2014
PPTX
HTML๊ณผ CSS
ย 
PDF
แ„†แ…ฎแ†ซแ„ƒแ…ฉแ†ฏแ„‹แ…ตแ„€แ…ก แ„€แ…กแ„…แ…ณแ„Žแ…ตแ„‚แ…ณแ†ซ ์›น แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ 1แ„Žแ…กแ„‰แ…ต
PDF
Learning HTML5
PPTX
ํ”„๋ก ํŠธ์—”๋“œ์Šคํ„ฐ๋”” E02 css dom
PDF
ReactJS๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฐœ๋ฐœํ•˜๊ธฐ
PDF
React๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœํ•˜๊ธฐ
PDF
Web Standards HTML5_CSS3
PDF
HTML5 & CSS3
PPTX
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 4์ผ์ฐจ
PDF
์›นํ‘œ์ค€ ๊ต์œก
PPTX
Html5 css3 20161205-์›๊ด‘์„
ย 
PPTX
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 5์ผ์ฐจ
PDF
20131217 html5
ย 
PDF
WebStandards-Basic 1.Introduce
PDF
[D2 CAMPUS] ์•ˆ๋“œ๋กœ์ด๋“œ ์˜คํ”ˆ์†Œ์Šค ์Šคํ„ฐ๋””์ž๋ฃŒ - HTML, Android Animation
PDF
Html5_SYS4U
ย 
PPTX
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 2์ผ์ฐจ
Introduction to Web Components
Polymer Codelab: Before diving into polymer
[์ „ํŒŒ๊ต์œก] css day 2014
HTML๊ณผ CSS
ย 
แ„†แ…ฎแ†ซแ„ƒแ…ฉแ†ฏแ„‹แ…ตแ„€แ…ก แ„€แ…กแ„…แ…ณแ„Žแ…ตแ„‚แ…ณแ†ซ ์›น แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ 1แ„Žแ…กแ„‰แ…ต
Learning HTML5
ํ”„๋ก ํŠธ์—”๋“œ์Šคํ„ฐ๋”” E02 css dom
ReactJS๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฐœ๋ฐœํ•˜๊ธฐ
React๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœํ•˜๊ธฐ
Web Standards HTML5_CSS3
HTML5 & CSS3
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 4์ผ์ฐจ
์›นํ‘œ์ค€ ๊ต์œก
Html5 css3 20161205-์›๊ด‘์„
ย 
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 5์ผ์ฐจ
20131217 html5
ย 
WebStandards-Basic 1.Introduce
[D2 CAMPUS] ์•ˆ๋“œ๋กœ์ด๋“œ ์˜คํ”ˆ์†Œ์Šค ์Šคํ„ฐ๋””์ž๋ฃŒ - HTML, Android Animation
Html5_SYS4U
ย 
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐฐ์šฐ๋Š” HTML5 & CSS3 ๊ฐ•์˜์ž๋ฃŒ 2์ผ์ฐจ
Ad

More from Chang W. Doh (20)

PDF
Exploring what're new in Web for the Natively app
PDF
Kotlin์˜ ์ฝ”๋ฃจํ‹ด์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€
PDF
Hey Kotlin, How it works?
PDF
Kotlin, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”
PDF
introduction to Web Assembly
PDF
PWA Roadshow Seoul - Keynote
PDF
PWA Roadshow Seoul - HTTPS
PDF
CSS ๋‹ค์‹œ ํŒŒ์„œ ์–ด๋””์— ์“ฐ๋‚˜
PDF
Natively Web App & Service Worker
PDF
์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ 101
PDF
Service Worker 201 (ํ•œ๊ตญ์–ด)
PDF
Service Worker 201 (en)
PDF
Service Worker 101 (en)
PDF
Service Worker 101 (ํ•œ๊ตญ์–ด)
PDF
What is next for the web
PDF
Instant and offline apps with Service Worker
PDF
Chrome enchanted 2015
PDF
แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ แ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„…แ…ณแ†ฏ แ„‹แ…ฑแ„’แ…กแ†ซ แ„แ…ณแ„…แ…ฉแ†ท แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผแ„‹แ…ตแ†ซแ„Œแ…ก แ„‹แ…ตแ„’แ…ขแ„’แ…กแ„€แ…ต
PDF
SOSCON 2014: แ„†แ…ฎแ†ซแ„‰แ…ฅ แ„€แ…ตแ„‡แ…กแ†ซแ„‹แ…ด แ„‹แ…ฉแ„‘แ…ณแ†ซแ„‰แ…ฉแ„‰แ…ณ แ„€แ…ตแ„‹แ…งแ„’แ…กแ„€แ…ต
PDF
Chromium: NaCl and Pepper API
Exploring what're new in Web for the Natively app
Kotlin์˜ ์ฝ”๋ฃจํ‹ด์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€
Hey Kotlin, How it works?
Kotlin, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”
introduction to Web Assembly
PWA Roadshow Seoul - Keynote
PWA Roadshow Seoul - HTTPS
CSS ๋‹ค์‹œ ํŒŒ์„œ ์–ด๋””์— ์“ฐ๋‚˜
Natively Web App & Service Worker
์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ 101
Service Worker 201 (ํ•œ๊ตญ์–ด)
Service Worker 201 (en)
Service Worker 101 (en)
Service Worker 101 (ํ•œ๊ตญ์–ด)
What is next for the web
Instant and offline apps with Service Worker
Chrome enchanted 2015
แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ แ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„…แ…ณแ†ฏ แ„‹แ…ฑแ„’แ…กแ†ซ แ„แ…ณแ„…แ…ฉแ†ท แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผแ„‹แ…ตแ†ซแ„Œแ…ก แ„‹แ…ตแ„’แ…ขแ„’แ…กแ„€แ…ต
SOSCON 2014: แ„†แ…ฎแ†ซแ„‰แ…ฅ แ„€แ…ตแ„‡แ…กแ†ซแ„‹แ…ด แ„‹แ…ฉแ„‘แ…ณแ†ซแ„‰แ…ฉแ„‰แ…ณ แ„€แ…ตแ„‹แ…งแ„’แ…กแ„€แ…ต
Chromium: NaCl and Pepper API

Web Components - Part.I, @KIG 30th

  • 1. Web Components part - I Chang W. Doh KIG 31st
  • 3. โ€œํƒœ์–‘ ์•„๋ž˜ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†๋‹ค.โ€
  • 4. ์ปดํฌ๋„ŒํŠธ์˜ ์ฃผ์š” ๊ฐœ๋… 1. ์žฌ์‚ฌ์šฉ์„ฑ 2. ์กฐํ•ฉ์„ฑ 3. ๋ชจ๋“ˆํ™”
  • 7. YUI
  • 12. โ€œ์šฐ๋ฆฌ ๊ตฌํ˜„์„ ์กฐ๊ธˆ ๋ฐ”๊พธ์–ด์•ผ๊ฒ ๋Š”๋ฐ?โ€
  • 14. Tag soup Do you love this?
  • 17. โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ๊ฒƒ๋“ค ํ˜น์€ ๊ตฌ์กฐ ์ƒ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๋“ค์„ ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•โ€
  • 18. ์กฐ๊ธˆ ๋” ๋‚˜์•„๊ฐ€์„œ... โ— ํŠนํžˆ, UI ์š”์†Œ๋“ค์ด ๋งŽ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ๋Š” โ—‹ โ€œ๋ฆฌ์†Œ์Šค ๊ด€์ ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” HTML, CSS, ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ  ๋‹ค.โ€
  • 20. ํ”„๋ก ํŠธ์—”๋“œ ์›น์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ ์‹œ์Šคํ…œ
  • 21. ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€ํƒฑํ•˜๋Š” 4๊ฐ€์ง€ ๊ธฐ๋‘ฅ 1. Shadow DOM 2. Custom Elements 3. HTML Templates 4. HTML Imports
  • 22. Quick Overview โ— Shadow DOM โ—‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” DOM, CSS, JS ์บก์Аํ™” ๋ฐ ์™ธ๋ถ€ ๋กœ๋ถ€ํ„ฐ์˜ ๊ฐ„์„ญ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šค์ฝ”ํ”„ ๋ถ„๋ฆฌ โ— HTML Template โ—‹ ์ •์˜๋œ ๋งˆํฌ์—…์„ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ๋กœ๋”ฉ ๋ฐ ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ โ— Custom Element โ—‹ ์›น ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•  ์—˜๋ฆฌ๋จผํŠธ์˜ ๋™์ ์ธ ๋“ฑ๋ก ๋ฐ ํ™•์žฅ โ— HTML Imports โ—‹ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์›น ๋ฌธ์„œ ๋‚ด์— ๋ฌธ์„œ์˜ ์ผ๋ถ€/์ „์ฒด๋ฅผ ํฌํ•จํ•˜ ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ œ๊ณต
  • 24. โ— ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ = ํ•˜๋‚˜์˜ ๋ฌธ์„œ โ—‹ ๋‹ค๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ์ œ์–ด โ—‹ ๊ฐœ๋ฐœ ์‹œ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ์˜ ๊ตฌ์กฐ์ ์ธ ์ด์Šˆ๋“ค์ด ๋ฐœ์ƒ ์™œ Shadow DOM์ธ๊ฐ€?
  • 25. Shadow DOM 101 โ— ํŠน์ •ํ•œ DOM์„ ์„œ๋ธŒ DOM ํŠธ๋ฆฌ๋กœ ๋ Œ๋”๋ง โ—‹ ์ฆ‰, ์ปจํ…์ธ ๋ฅผ ํ‘œํ˜„๊ณผ ๋ถ„๋ฆฌ โ— Shadow Host vs. Shadow Root โ—‹ root = hostNode.createShadowRoot() โ—‹ <content select=โ€™queryโ€™></content> โ—‹ DOM Visualizer
  • 26. Shadow DOM 201 โ— Shadow DOM์˜ ์Šคํƒ€์ผ๋ง โ—‹ ์„€๋„ ๊ฒฝ๊ณ„(Shadow Boundary) <div><h3>Light DOM</h3></div> <script> var root = document.querySelector('div').createShadowRoot(); root.innerHTML = '<style>h3{ color: red; }</style>' + '<h3>Shadow DOM</h3>'; </script> Shadow DOM
  • 27. Shadow DOM 201 โ— host: ์…€๋ ‰ํ„ฐ โ—‹ hostNode์— ๋Œ€ํ•œ ์…€๋ ‰ํ„ฐ <style> :host { opacity: 0.4; transition: opacity 420ms ease-in-out; } :host:hover { opacity: 1; } :host:active { position: relative; top: 3px; left: 3px; } </style>
  • 28. Shadow DOM 201 โ— ํ•จ์ˆ˜ํ˜• :host() :host(x-foo:host) { /* Applies if the host is a <x-foo> element.*/ } :host(x-bar:host) { /* Applies if the host is a <x-bar> element. */ } :host(div) { { /* Applies if the host element or an ancestor is a <div>. */ }
  • 29. Shadow DOM 201 โ— hat - ^ <style> #host ^ span { color: red; } </style> <div id="host"> <span>Light DOM</span> </div> <script> var host = document.querySelector('div'); var root = host.createShadowRoot(); root.innerHTML = "<span>Shadow DOM</span>" + "<content></content>"; </script>
  • 30. Shadow DOM 201 โ— hat - contโ€™d โ— cat - ^^ // No fun. document.querySelector('x-tabs').shadowRoot .querySelector('x-panel').shadowRoot .querySelector('#foo'); // Fun. document.querySelector('x-tabs ^ x-panel ^ #foo'); x-tabs ^^ x-panel { ... }
  • 31. Shadow DOM 201 โ— .resetStyleInheritance โ—‹ true - ์ƒ์†๊ฐ€๋Šฅํ•œ ์†์„ฑ๋“ค์„ initial์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. โ—‹ false - ์ƒ์† ๊ฐ€๋Šฅํ•œ CSS ์†์„ฑ๋“ค์ด ์ƒ์†์„ ์œ ์ง€ํ•ฉ๋‹ˆ ๋‹ค. โ— .applyAuthorStyles โ—‹ true - ์ €์ž‘์ž์˜ ๋ฌธ์„œ ๋‚ด์— ์ •์˜๋œ ์†์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. โ—‹ false - ๋””ํดํŠธ. ์Šคํƒ€์ผ์€ ์„€๋„ ํŠธ๋ฆฌ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต ๋‹ˆ๋‹ค.
  • 32. Shadow DOM 201 โ— Cheat Sheet ์‹œ๋‚˜๋ฆฌ์˜ค applyAuthorStyles resetStyleInheritance ์ž์ฒด์ ์ธ ํ…Œ๋งˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ ์œผ๋‚˜ ๊ธฐ๋ณธ ์ƒ์† ์†์„ฑ์€ ์œ ์ง€ false false ์ž์ฒด์ ์ธ ์Šคํƒ€์ผ ํ…Œ๋งˆ ์œ ์ง€ false true ํŽ˜์ด์ง€๋กœ๋ถ€ํ„ฐ ์Šคํƒ€์ผ ํ…Œ๋งˆ ๋งŒ true true ์ตœ์žฌํ•œ ํŽ˜์ด์ง€์— ๊ฐ€๊น๊ฒŒ true false
  • 33. Shadow DOM 201 โ— ::content - ํ˜ธ์ŠคํŠธ ๋…ธ๋“œ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ํ•œ์ • <script> var div = document.querySelector('div'); var root = div.createShadowRoot(); root.innerHTML = ' <style> h3 { color: red; } content[select="h3"]::content > h3 { color: green; } ::content section p { text-decoration: underline; } </style> <h3>Shadow DOM</h3> <content select="h3"></content> <content select="section"></content>'; </script>
  • 35. Custom Elements โ— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? โ—‹ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋“ฑ๋ก โ—‹ ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์†ํ•œ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ํ™•์žฅ โ—‹ Tag์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ ์ง€์ •/์ถ”๊ฐ€ โ—‹ ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋ฉ”์†Œ๋“œ/์ด๋ฒคํŠธ ํ™•์žฅ
  • 36. Custom Elements โ— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋“ฑ๋ก โ— ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์˜ ํ™•์žฅ var XFoo = document.registerElement('x-foo'); document.body.appendChild(new XFoo()); var MegaButton = document.registerElement('mega-button', { prototype: Object.create(HTMLButtonElement.prototype) });
  • 37. Custom Elements โ— ํ”„๋กœํผํ‹ฐ ๋ฐ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ var XFooProto = Object.create(HTMLElement.prototype); // 1. x-foo์— foo() ๋ฉ”์„œ๋“œ ์ฃผ๊ธฐ. XFooProto.foo = function() { alert('foo() called'); }; // 2. read-only ์†์„ฑ์˜ "bar" ํ”„๋กœํผํ‹ฐ ์ •์˜. Object.defineProperty(XFooProto, "bar", {value: 5}); // 3. x-foo์˜ ์ •์˜๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ. var XFoo = document.registerElement('x-foo', {prototype: XFooProto}); // 4. x-foo ์ธ์Šคํ„ด์Šคํ™”. var xfoo = document.createElement('x-foo'); // 5. xfoo ์ธ์Šคํ„ด์Šค๋ฅผ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€. document.body.appendChild(xfoo);
  • 38. Custom Elements โ— ๋ช‡๊ฐ€์ง€ ์ฝœ๋ฐฑ Callback Description createdCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ attachedCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ document์— ์‚ฝ์ž…๋˜์—ˆ์„ ๋•Œ detachedCallback ์—˜๋ฆฌ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ document์—์„œ ์‚ญ์ œ๋˜์—ˆ์„ ๋•Œ attributeChangedCallback ์†์„ฑ์˜ ์ถ”๊ฐ€/์‚ญ์ œ/๊ฐฑ์‹ ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function() {...}; proto.attachedCallback = function() {...}; var XFoo = document.registerElement('x-foo', {prototype: proto});
  • 40. HTML Template โ— HTML Template ์ด์ „ โ—‹ Text Templating โ—‹ Script Overloading โ–  <script type=โ€text/template></script> โ—‹ Offline DOM โ–  ๋ณด์ด์ง€ ์•Š๋Š” DOM
  • 41. HTML Template โ— HTML Template ์ด์ „ โ—‹ Text Templating โ—‹ Script Overloading โ–  <script type=โ€text/template></script> โ—‹ Offline DOM โ–  ๋ณด์ด์ง€ ์•Š๋Š” DOM
  • 42. HTML Template โ— ์ง€์› ์—ฌ๋ถ€ ๊ฒ€์‚ฌ function supportsTemplate() { return 'content' in document.createElement('template'); } if (supportsTemplate()) { // Good to go! } else { // Use old templating techniques or libraries. }
  • 43. โ— ํ…œํ”Œ๋ฆฟ์˜ ์„ ์–ธ HTML Template <template id="mytemplate"> <img src="" alt="great image"> <div class="comment"></div> </template>
  • 44. โ— ์ฃผ์š” ํŠน์ง• โ—‹ ๋น„ํ™œ์„ฑํ™” โ–  ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ  โ–  ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ โ–  ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ)๋Š” ๋กœ๋”ฉ๋˜์ง€ ์•Š๊ณ  โ–  ๋ฌธ์„œ ๋‚ด์—์„œ ์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์•ก์„ธ์Šค๋˜์ง€ ์•Š์Œ โ—‹ ๋ชจ๋“  ์œ„์น˜์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ HTML Template <table> <tr> <template id="cells-to-repeat"> <td>some content</td> </template> </tr> </table>
  • 45. โ— ํ…œํ”Œ๋ฆฟ์˜ ์‚ฌ์šฉ HTML Template <button onclick="useIt()">Use me</button> <div id="container"></div> <script> function useIt() { var content = document.querySelector('template').content; // ํ…œํ”Œ๋ฆฟ DOM์—์„œ ๋ญ”๊ฐ€๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. var span = content.querySelector('span'); span.textContent = parseInt(span.textContent) + 1; document.querySelector('#container').appendChild( document.importNode(content, true)); } </script> <template> <div>Template used: <span>0</span></div> <script>alert('Thanks!')</script> </template>
  • 47. HTML Imports โ— Imports ์ด์ „ โ—‹ <iframe> โ—‹ Ajax โ—‹ Script hack!
  • 48. HTML Imports โ— ๋ฌด์—‡์ด๋˜์ง€ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ฒ•์˜ ๋„๊ตฌ! <head> <link rel="import" href="/path/to/imports/stuff.html"> </head>
  • 49. HTML Imports โ— ์ง€์› ์—ฌ๋ถ€ function supportsImports() { return 'import' in document.createElement('link'); } if (supportsImports()) { // ์ง€์›ํ•˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. } else { // ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ require ์‹œ์Šคํ…œ๋“ค์„ ์‚ฌ์šฉํ•˜์„ธ์š”. }
  • 50. HTML Imports โ— Import ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง <script async> function handleLoad(e) { console.log('Loaded import: ' + e.target.href); } function handleError(e) { console.log('Error loading import: ' + e.target.href); } </script> <link rel="import" href="file.html" onload="handleLoad(event)" onerror="handleError(event)">
  • 51. HTML Imports โ— Scripting HTML Imports var link = document.createElement('link'); link.rel = 'import'; link.href = 'file.html' link.onload = function(e) {...}; link.onerror = function(e) {...}; document.head.appendChild(link);
  • 52. HTML Imports โ— link.import โ— ๋‹จ, ์•„๋ž˜์˜ ๊ฒฝ์šฐ์—๋Š” null โ—‹ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML Imports๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ โ—‹ <link>๊ฐ€ rel="import"๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ <link>๊ฐ€ DOM์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ โ—‹ <link>๊ฐ€ DOM์œผ๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ โ—‹ ๋ฆฌ์†Œ์Šค๊ฐ€ 'CORS๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ'๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ. var content = document.querySelector('link[rel="import"]').import;
  • 53. HTML Imports โ— ์‚ฝ์ž…์ž <head> <link rel="import" href="warnings.html"> </head> <body> ... <script> var link = document.querySelector('link[rel="import"]'); var content = link.import; // Grab DOM from warning.html's document. var el = content.querySelector('.warning'); document.body.appendChild(el.cloneNode(true)); </script> </body>
  • 54. HTML Imports โ— Scripting in importer <link rel="stylesheet" href="http://www.example.com/styles.css"> <link rel="stylesheet" href="http://www.example.com/styles2.css"> ... <script> // importDoc์€ import์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. var importDoc = document.currentScript.ownerDocument; // mainDoc ๋ฉ”์ธ ๋„ํ๋จผํŠธ(์šฐ๋ฆฌ๊ฐ€ importํ•œ ํŽ˜์ด์ง€)๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. var mainDoc = document; // ์ฒซ๋ฒˆ์งธ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ด import๋กœ๋ถ€ํ„ฐ ๋ถ™์žก์•„ ๋ณต์ œํ•˜๊ณ , // import๋œ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. var styles = importDoc.querySelector('link[rel="stylesheet"]'); mainDoc.head.appendChild(styles.cloneNode(true)); </script>
  • 55. HTML Imports โ— ์›น ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฐํฌ์— ์ ํ•ฉ โ—‹ HTML Template โ–  ์œ„์ ฏ์˜ ๋งˆํฌ์—…์„ ๊ตฌ์ถ• โ—‹ Shadow DOM โ–  ๋ฌธ์„œ์™€ ๋ถ„๋ฆฌ๋œ ์บก์Аํ™”๋œ HTML, JS, CSS ์ •์˜ โ—‹ Custom Element โ–  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋“ฑ๋ก/ํ™•์žฅ โ—‹ HTML Import ๊ทœ๊ฒฉ โ–  HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฌถ์–ด์„œ ๋กœ๋”ฉํ•˜๋„๋ก Importer ๊ตฌ์„ฑ
  • 56. Tools
  • 57. Tools โ— Yeoman โ—‹ Yo - ์ž‘์—… ํ๋ฆ„ ๊ด€๋ฆฌ ๋„๊ตฌ โ—‹ Grunt - ๋นŒ๋“œ/ํ…Œ์ŠคํŒ… ๋“ฑ์˜ ํƒœ์Šคํฌ ๋Ÿฌ๋„ˆ โ—‹ Bower - ์ปดํฌ๋„ŒํŠธ ๋ฐฐํฌ ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ โ— Polymer โ—‹ ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ Polyfill ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ โ— Bricks โ—‹ x-tag ๊ธฐ๋ฐ˜์˜ ์›น ์ปดํฌ๋„ŒํŠธ Polyfill ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • 59. Conclusion ์ƒ์‚ฐ์„ฑ, ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ํ ๋ฆ„ โ— โ€œ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ๊ฒƒ๋“ค ํ˜น์€ ๊ตฌ์กฐ ์ƒ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ์žฌ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•โ€ ๋ฏธ๋ž˜๋ฅผ ์˜ˆ์ƒํ•ด๋ณด์ž๋ฉด... โ— ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋„๊ตฌ์˜ ๋ณ€ํ™”๊ฐ€ ์˜ˆ์ƒ โ— ์›น ๊ฐœ๋ฐœ ๋„๊ตฌ ์‹œ์žฅ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜ ๋ณ€ํ™”
  • 61. HTML5Rocks: Web Component Tutorials โ— Shadow DOM 101 โ— Shadow DOM 201: CSS & Styling โ— Shadow DOM 301: Advanced Concepts & DOM API โ— HTML Imports: #include for Web โ— Custom Element: Defining new elements in HTML โ— HTMLโ€™s new Template Tag: Standarizing client-side templating Further readings...
  • 62. Resources โ— Introduction to Web Components โ— webcomponents.github.io โ— Polymer Project โ— Mozilla Brick โ— Yeoman.io
  • 63. Q&A
  • 64. Thank you! ํ”„๋ฆฌ์  ํ…Œ์ด์…˜ ์ž๋ฃŒ์—์„œ ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€์™€ ์†Œ์Šค ๋“ฑ์€ HTML5Rocks.com์˜ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ธ์šฉ๋˜์—ˆ ์Šต๋‹ˆ๋‹ค.