SlideShare a Scribd company logo
1 of 56
Download to read offline
WEB COMPONENTS
&
POLYMER
 박재성
ABOUT ME
네이버 AU 개발랩
 
일반적인 웹 개발은?
HTML CSS
JavaScript
WEB COMPONENTS?재사용 가능한 컴포넌트를 만들 수 있는 표준 기술들의 모음
 Custom Elements : 커스텀 태그를 통한 요소 생성
 HTML Imports : HTML 페이지 로딩
 HTML Templates : 템플릿
 Shadow DOM : DOM과 스타일의 캡슐화
CUSTOM ELEMENTS
커스텀 태그를 통한 요소 생성
새로운 HTML 요소를 생성
다른 요소를 확장해 생성가능
단일 태그에 커스텀 기능의 묶음 가능
기존 DOM 요소의 API를 확장
태그명에 '-'(dash)는 반드시 포함해야 한다.
CUSTOM ELEMENTS
기본 사용방법
// document.registerElement()를 통해 등록
var NTag=document.registerElement('n-tag');
// 또는 다음과 같이 특정 HTML 인터페이스를 사용해 등록할 수도 있다.
// custom element는 기본적으로 'HTMLElement'를 상속한다.
var NTag=document.registerElement('n-tag',{
prototype:Object.create(HTMLElement.prototype)
});
// 문서에 추가
document.body.appendChild(new NTag());
CUSTOM ELEMENTS
var NTag = document.registerElement('n-tag', {
prototype: Object.create(HTMLElement.prototype)
});
document.body.appendChild(new NTag());
//alert(document.querySelector("n-tag"));
//alert(document.getElementsByTagName("n-tag")[0].__proto__.constructor
+"");
JavaScript
CUSTOM ELEMENTS
기존 요소를 확장
// <button> 태그를 확장
var XButton=document.registerElement('x-button',{
prototype:Object.create(HTMLButtonElement.prototype),
extends:'button'
});
확장된 요소들은 type extension custom elements라 불리우며,
"element X is a Y"와 같이 사용
<button is="x-button"></button>
CUSTOM ELEMENTS
속성과 메서드 추가
// 1. HTML 객체 생성
var XTestProto = Object.create(HTMLElement.prototype);
// 2. ‘hi’ 메서드 추가
XTestProto.hi = function() { alert('안녕하세요.'); };
// 3. 읽기 전용 ‘bar’ 속성 설정
Object.defineProperty(XTestProto, "bar", {value: 5});
// 4. <x-test> 태그 등록. 태그명에는 '-'가 꼭 포함되어야 함.
var XTest = document.registerElement('x-test', { prototype: XTestProto
});
/*
JavaScript
HTML
CUSTOM ELEMENTS
Lifecycle callback
콜백 발생시점
createdCallback 인스턴스가 생성될 때
attachedCallback 생성된 인스턴스가 문서에 추가될때
detachedCallback 인스턴스가 문서에서 제거될 때
attributeChangedCallback
(attrName, oldVal, newVal)
속성이 변경될 때(추가/삭제/수정)
varproto=Object.create(HTMLElement.prototype);
//콜백 등록
proto.createdCallback=function(){... };
proto.attachedCallback=function(){... };
varXFoo=document.registerElement('x-foo',{prototype:proto});
CUSTOM ELEMENTS
컨텐츠가 포함된 custom element
var NTagProto = Object.create(HTMLElement.prototype);
NTagProto.createdCallback = function() {
this.innerHTML = "<b>반갑습니다~</b>";
};
var NTagHi = document.registerElement('n-tag-hi', { prototype: NTagProto
});
JavaScript
HTML
CUSTOM ELEMENTS
아직 요소의 등록이 제대로 되지 않은 상태인 경우,
FOUC* 상태로 페이지가 렌더링될 수 있다.
:unresolved pseudo class를 사용해 이를 방지할 수 있다.
x-test{... }
x-test:unresolved{opacity:0;}
*FOUC(Flash Of Unstyled Content) - http://en.wikipedia.org/wiki/Flash_of_unstyled_content
HTML IMPORTS
HTML 페이지를 로딩
JS/HTML/CSS를 묶음 형태로 사용 → 단일 URL로 호출
HTML Import를 통한 추가되는 컴포넌트들은 중복되는 경우라도 호출,
파싱 및 실행은 단 한 번만 수행
Import 내의 스크립트는 메인 문서의 파싱을 블럭하지 않음
스크립트는 import시 실행되나, 다른 요소(마크업,CSS 등)들은
메인 페이지에 추가되는 시점에 활성화
HTML IMPORTS
기본 사용방법
<link rel="import" href="/path/file_name.html">
다른 도메인의 파일을 임포트 하기 위해선
CORS가 활성화 되어 있어야 한다.
HTML IMPORTS
이벤트 (load & error)
<link rel="import" href="/path/file_name.html"
            onload="handleLoad(event)"
            onerror="handleError(event)">
브라우저가 <link rel="import"> 태그를 만나면
즉시 로딩하기 때문에 이벤트 핸들러는
import 태그 이전에 선언되어야 한다.
var el = document.createElement("link");
el.rel = "import";
el.href="./demo/blank.html";
el.onload = function(e) {
// TODO
};
document.head.appendChild(el);
JavaScript
HTML IMPORTS
import된 컨텐츠의 활용
import가 수행된다고 해서 그 지점에 컨텐츠가
포함되는 형태는 아니며, 브라우저가 해당 파일을
파싱하고 사용할 수 있도록 준비되는 것.
import 속성을 사용해 컨텐츠 문서에 접근할 수 있다.
// import된 문서를 얻는다.
var contentDoc = document.querySelector('link[rel="import"]').import;
// 컨텐츠 문서에서 셀렉터를 통해 요소를 선택한다.
//alert(contentDoc.querySelector("*").outerHTML);
JavaScript
main.html
import.html
HTML IMPORTS
페이지의 동작
<link rel="import" href="import.html">
<link rel="stylesheet" href="common.css">
<style>
</style>
<script>
</script>
    /* 이 블럭내의 스타일은 기본적으로 main.html에 반영됨 */
// import.html 문서를 가리킴. 즉, 현재 파일
var importDoc = document.currentScript.ownerDocument;
// main.html 문서를 가리킴. 즉, 현재 파일을 import 하는 파일
var mainDoc = document;
// import.html 문서내의 스타일시트를 main.html에 포함하고자 한다면, 아래와 같이 별도 추가작업이 필요
var styles = importDoc.querySelector('link[rel="stylesheet"]');
mainDoc.head.appendChild(styles.cloneNode(true));
HTML IMPORTS
기억할 점
스크립트는 window 문맥에서 실행
import는 메인 페이지의 파싱을 블럭하지는 않지만,
렌더링은 블럭
import되는 페이지에 style이 포함될 수 있으므로, 브라우저는 FOUC를 방지하기 위
해 렌더링을 블럭
비동기적으로 import 하고자 한다면 async 속성을 추가
<link rel="import" href="/path/some.html" async>
import 파일들은 일반적인 리소스와 마찬가지로 브라우저 캐싱
됨
HTML IMPORTS
<!-- main.html -->
<head><link rel="import" href="some.html"></head>
<body>
<script>
</script>
</body>
                var link = document.querySelector('link[rel="import"]');
                var content = link.import;
                var el = content.querySelector('div');
                document.body.appendChild(el.cloneNode(true));
        
<!-- some.html -->
<script> </script>
<div>
<style> </style>
<h3>HTMLImports</h3>
<p>안녕하세요.반갑습니다~!</p>
</div>
alert("파일이 import 되었습니다.");
 h3 { color: red; } 
HTML IMPORTS
// TODO : import "./demo/some.html"
/*
var link = document.querySelector('link[rel="import"]');
var content = link.import;
var el = content.querySelector('div');
document.getElementById("content02").appendChild(el.cloneNode(true));
*/
JavaScript
HTML TEMPLATES
재사용을 위한 템플릿
비활성화 상태의 복제 가능한 DOM chunk
새로운 태그 : <template> ⋯ </template>
태그 내의 태그들은 사용되기 전까진 파싱은 되나 렌더링되지 않음
컨텐츠는 클론/사용 되기전까진 비활성
페이지의 일부분이 아님
중첩된 <template>은 동작하지 않음
HTML TEMPLATES
// 1. content 속성을 사용해 템플릿의 노드(#document-fragment)에 접근할 수 있다.
var content=document.getElementById("count").content;
// 2. 템플릿내의 DOM에 대한 작업을 한다.
var span=content.querySelector('span');
span.textContent=parseInt(span.textContent,10)+1;
// 3. 메인 DOM에 document.importNode()를 통해 추가한다.
document.getElementById("content03").appendChild(
document.importNode(content,true));
<!-- 템플릿 -->
<template id="count">
<div>Templateused:<span>0</span></div>
<script> </script>
</template>
alert('클릭하셨네요!');
HTML TEMPLATES
// 1. content 속성을 사용해 템플릿의 노드(#document-fragment)에 접근할 수 있다.
var content = document.getElementById("count").content;
// 2. 템플릿내의 DOM에 대한 작업을 한다.
var span = content.querySelector('span');
span.textContent = parseInt(span.textContent, 10) + 1;
// 3. 메인 DOM에 document.importNode()를 통해 추가한다.
document.getElementById("content03").appendChild(document.importNode(con
tent, true));
JavaScript
<template id="count">
<div>Template used: <span>0</span></div>
<script>alert('클릭하셨네요!');</script>
</template>
HTML
SHADOW DOM
DOM과 스타일의 캡슐화
별도의 스코프를 갖는 DOM
새로운 root node → "shadow root"
shadow root를 가지고 있는 요소는 "shadow host"라고 불리움
shadow host의 컨텐츠는 렌더링되지 않으며, 대신 shadow root의 컨텐츠가 렌더링됨
Polymer에서 생성하는 모든 요소들은 shadow DOM으로 처리
<video src="http://v2v.cc/~j/theora_testsuite/320x240.ogg" controls="controls"></video>
0:03
SHADOW DOM
기본 사용방법
// shadow root를 포함할 host를 얻는다.
var host = document.getElementById('shadow_btn');
// shadow root를 생성한다.
var root = host.createShadowRoot();
root.textContent = '안녕하세요.';
JavaScript
<button id="shadow_btn">Hello, world!</button> HTML
SHADOW DOM
Pesudo class
Shadow DOM에 정의된 css 스타일은
기본적으로 ShadowRoot 스코프를 갖는다.
:host / :host(selector)
host 요소를 의미 (ShadowRoot context내에서만 사용가능)
var host = document.getElementById('shadow_btn2');
var root = host.createShadowRoot();
// ShadowRoot를 host 하는 요소를 가리킨다.
root.innerHTML = '<style>' +
':host { text-transform: uppercase; }' +
'</style>' +
'<content></content>';
JavaScript
My Button
SHADOW DOM
Pesudo class
:host-context(selector)
host의 조상 요소들중 selector와 매칭되는 경우에만 host에 스타일을 지정
var host = document.getElementById('shadow_btn3');
var root = host.createShadowRoot();
// ShadowRoot를 host 하는 조상 요소들 중 매칭되는 경우에만 스타일을 지정
root.innerHTML = '<style>' +
':host-context(.host-context) { text-transform: uppercase; }' +
'</style>' +
'<content></content>';
JavaScript
<div class="host-context">
<button id="shadow_btn3">My Button</button>
</div>
HTML
SHADOW DOM
Pesudo element
::shadow
ShadowRoot를 갖는 요소
var host = document.getElementById('shadow_div');
var root = host.createShadowRoot();
root.innerHTML = '<span>Shadow DOM</span>' +
'<content></content>';
JavaScript
<style>#shadow_div::shadow span { color: red }</style>
<div id="shadow_div">
<span>Light DOM</span>
</div>
HTML
SHADOW DOM
<content> : host의 특정 요소를 출력(포함)
var host = document.getElementById('shadow_div06');
var root = host.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>';
JavaScript
<div id="shadow_div06"><h3>Light DOM</h3>
<section>
<div>I'm not underlined</div>
<p>I'm underlined in Shadow DOM!</p>
</section></div>
HTML
SHADOW DOM
몇가지 특징
한개의 host에서 여러 개의 ShadowRoot를 만들 수 있음
하지만, LIFO(Last In, First Out) 스택과 같이 마지막에 추가된
ShadowRoot가 렌더링됨
제일 처음 추가된 트리는 'older tree'
→ .olderShadowRoot 속성을 통해 접근
제일 마지막에 추가된 트리는 'yonger tree'
→ .shadowRoot를 통해 접근
SHADOW DOM
<shadow> : shadow root에서 shadow 요소를 출력(포함)
var host = document.getElementById('shadow_div7');
var root1 = host.createShadowRoot();
var root2 = host.createShadowRoot();
root1.innerHTML = '<div>루트 1</div><content></content>';
root2.innerHTML = '<div>루트 2</div><shadow></shadow>';
JavaScript
<div id="shadow_div7">Light DOM</div> HTML
SHADOW DOM
Element.getDistributedNodes()
<content>로 포함된 노드들을 접근할 수 있도록 한다.
var host = document.getElementById('shadow_div8');
var root = host.createShadowRoot();
// 템플릿을 ShadowRoot에 추가한다.
var template = document.getElementById('sdom');
var clone = document.importNode(template.content, true);
root.appendChild(clone);
var html = [];
[].forEach.call(root.querySelectorAll('content'), function(el) {
html.push(el.select + ': ');
JavaScript
<div id="shadow_div8">
<span>HTML</span> <span>5</span>
<div>Shadow DOM</div>
<h5>footer</h5>
</div>
HTML
SHADOW DOM
Element.getDestinationInsertionPoints()
자신을 포함시킨 ShadowRoot 요소에 접근
var host = document.getElementById('shadow_div9');
var root1 = host.createShadowRoot();
var root2 = host.createShadowRoot();
root1.innerHTML = '<content select="h2"></content>';
root2.innerHTML = '<shadow></shadow>';
// 해당 요소를 ShadowRoot에 포함시킨 요소에 접근
var h2 = document.querySelector('#shadow_div9 h2');
var insertionPoints = h2.getDestinationInsertionPoints();
var html = [];
[].forEach.call(insertionPoints, function(contentEl) {
html.push(contentEl.outerHTML);
JavaScript
<div id="shadow_div9">
<h2>Light DOM</h2>
</div>
HTML
WEB COMPONENT를
사용하면?
태그 형태로 특정 기능을 갖는 UI 컴포넌트들을
삽입할 수 있어, 손쉬운 재사용이 가능해집니다!
POLYMER?The Polymer library is designed to make it easier and faster
for developers to create great,
reusable components for the modern web.
Is built on Web Components.
https://www.polymer-project.org/
POLYMER ARCHITECTURE
Polymer Elements : polymer.js
Polyfill : webcomponents.js 
( ) 0.5.0 이전 버전은 platform.js
POLYFILL?
브라우저가 네이티브 하게 지원하지 않는 기능을
사용 가능하도록 만들어주는 코드 모음
http://remysharp.com/2010/10/08/what-is-a-polyfill/
Web Components polyfill
Mozilla X-Tag : 
Google Polymer : 
http://www.x-tags.org/
http://www.polymer-project.org/
브라우저 호환성
NATIVE LINK
(Chrome 36+ 부터 웹컴포넌트 스펙들은 네이티브하게 지원)
POLYFILL LINK
POLYMER 는
EVERGREEN BROWSER*에서
문제없는 실행을 목표.
*Evergreen Web Browser is a web browser
that updates itself without prompting the user.
http://tomdale.net/2013/05/evergreen-browsers/
POLYMER ELEMENTS : IRON ELEMENTS
유틸리티 요소와 공통적 UI 요소들의 모음
Ajax, 애니메이션, 드래그&드롭, 아이콘 모음, 툴팁, etc.
Iron Elements (35)
A set of visual and non-visual utility elements. Includes elements for working with
layout, user input, selection, and scaffolding apps
Name Description Tags Action
iron-a11y-announcer a11y, live
iron-a11y-keys
a11y,
input
A singleton
element that
simplifies
announcing
text to screen
readers.
A basic
element
implementation
of iron-a11y-
keys-behavior,
matching the
Search Elements
Products
All Elements
Iron Elements
Paper Elements
Google Web Components
Gold Elements
Neon Elements
Catalog
Fe
Md
Go
Au
Ne
https://elements.polymer-project.org/browse?package=iron-elements
POLYMER ELEMENTS : PAPER ELEMENTS
Material design*이 적용된 UI 요소들의 모음
버튼, 체크박스, 다이얼로그, 입력요소, 탭, 토스트, etc.
Paper Elements (31)
Paper elements are a set of visual elements that implement Google's Material
Design.
Name Description Tags Action
paper-badge
badge,
notification
paper-behaviors behavior
paper-button button
Material
design status
message for
elements
Common
behaviors
across the
paper
elements
Material
design
Search Elements
Products
All Elements
Iron Elements
Paper Elements
Google Web Components
Gold Elements
Neon Elements
Catalog
Fe
Md
Go
Au
Ne
https://elements.polymer-project.org/browse?package=paper-elements
MATERIAL DESIGN?
"머티리얼 디자인에서 표면과 그림자는 물리적인 구조를 형성하여,
사용자들이 화면 상의 어떤 부분을 터치할 수 있고
움직일 수 있는지 쉽게 이해할 수 있도록 돕습니다."
Material design
다양한 디바이스를 아우르는 일관된 디자인
질감이 느껴지는 표면(tactile surfaces)
대담하고 선명한 그래픽 디자인 (bold graphic design)
자연스러운 애니메이션
사용방법 #1
이미 만들어진 요소들을 사용하는 방법
1. webcomponents.js를 페이지에 로딩
2. 사용할 요소를 페이지에 로딩
3. 페이지 내에 새로 추가된 요소를 태그로 선언
<script src="bower_components/webcomponentsjs/webcomponents.js"></script>
<link rel="import" href="bower_components/paper-input/paper-input.html">
<paper-input></paper-input>
이미 만들어진 요소들을 사용하는 방법
<!-- paper elements -->
<paper-input label="이름을 입력하세요."><br>
<paper-checkbox>체크 1</paper-checkbox><br>
<paper-radio-button>선택 2</paper-radio-button>
HTML
사용방법 #2 - 직접 요소를 생성
Step 1: 요소에 해당되는 페이지 작성
1. Polymer core를 페이지에 삽입
2. <dom-element>를 사용해 새로운 태그 등록
<link rel="import" href="bower_components/polymer/polymer.html">
<dom-element name="사용자정의-태그" noscript>
<template>
<span>내용</span>
</template>
</dom-element>
<script>
    // element registration
    Polymer({
        is: "사용자정의-태그",
        ready:function(e) {
            // when element is ready
        },
        hi: function() {
            alert("안녕하세요~");
        },
사용방법 #2 - 직접 요소를 생성
Step 2: 사용될 페이지에서 요소 페이지 삽입 후, 태그로 선언
<head>
<script src="bower_components/webcomponentsjs/webcomponents.js"></script>
<link rel="import" href="./파일.html">
</head>
<body>
<사용자정의-태그></사용자정의-태그>
</body>
직접 생성한 요소를 사용하는 방법
JavaScript
<naver-search></naver-search> HTML
POLYMER DEMO APP / More on : Topeka Built with Polymer
Sign In
Choose an Avatar
First Name
Last Initial
VULCANIZE사용되는 웹 컴포넌트 파일들을 병합해
HTTP request를 줄일 수 있도록 해주는 도구
# 설치
$sudo npminstall-gvulcanize
# 사용
$vulcanize대상파일.html--inline-scripts>결과파일.html
https://github.com/Polymer/vulcanize
WEB COMPONENTS ECOSYSTEM
다양한 웹컴포넌트 생태계
http://component.kitchen/
http://customelements.io/
BOWER
대다수의 웹컴포넌트들은
Bower*를 통한 손쉬운 설치를 제공
$bowerinstall컴포넌트명
*A package manager for the web - http://bower.io/
<CLOCK-FACE>
$bowerinstallclock-face
<clock-face></clock-face>
<!-- <clock-face hour="9" minute="30" second="10" class="red big">
</clock-face> -->
HTML
<GOOGLE-MAP>
$bowerinstallGoogleWebComponents/google-map
<google-map
latitude="37.3596274"
longitude="127.105464"
zoom="17" fitToMarkers="true">
<google-map-marker latitude="37.3596274" longitude="127.105464"
title="NAVER 그린팩토리"></google-map-marker>
</google-map>
HTML
MOZILLA BRICK
모질라에서 개발한 UI 웹컴포넌트
Brick
Blog
Components
action
appbar
calendar
deck
flipbox
form
layout
menu
tabbar
storage-
indexeddb
Brick
Brick is a collection of UI components designed for the easy and quick building of
web application UIs. Brick components are built using the Web Components standard
to allow developers to describe the UI of their app using the HTML syntax they
already know.
Install
Brick can be installed using the Bower package manager:
bower install mozbrick/brick
To use Brick in your project, place the following in the <head>of your main HTML:
<script src="bower_components/brick/dist/platform/platform.js"></script>
<link rel="import" href="bower_components/brick/dist/brick.html">
https://mozbrick.github.io/
REFERENCE
WebComponents.org
Google I/O 2014 - Polymer and Web Components change everything you know about
Web development
Google I/O 2014 - Polymer and the Web Components revolution
Google I/O 2014 - Unlock the next era of UI development with Polymer
Custom Elements
HTML Imports
HTML's New Template Tag
Shadow DOM
http://webcomponents.org/
https://www.youtube.com/watch?v=8OJ7ih8EE7
https://www.youtube.com/watch?v=yRbOSdAe_JU
https://www.youtube.com/watch?v=HKrYfrAzqFA
http://www.html5rocks.com/en/tutorials/webcomponents/customelements/
http://www.html5rocks.com/en/tutorials/webcomponents/imports/
http://www.html5rocks.com/en/tutorials/webcomponents/template/
http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/
http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/
http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-301/
<thank-you><thank-you>
   고맙습니다.고맙습니다.
</thank-you></thank-you>

More Related Content

What's hot

Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brickyongwoo Jeon
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Jin wook
 
다시보는 Angular js
다시보는 Angular js다시보는 Angular js
다시보는 Angular jsJeado Ko
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVCArawn Park
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 
[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery정석 양
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template EngineOhgyun Ahn
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2성일 한
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기Kyoung Up Jung
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기Jeado Ko
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSKenneth Ceyer
 
Html5 web workers
Html5 web workersHtml5 web workers
Html5 web workersWoo Jin Kim
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyondJae Sung Park
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기Chang W. Doh
 
우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구Jae Sung Park
 

What's hot (20)

Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brick
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발
 
다시보는 Angular js
다시보는 Angular js다시보는 Angular js
다시보는 Angular js
 
Deview2013 track1 session7
Deview2013 track1 session7Deview2013 track1 session7
Deview2013 track1 session7
 
3-2. selector api
3-2. selector api3-2. selector api
3-2. selector api
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVC
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 
[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template Engine
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJS
 
Html5 web workers
Html5 web workersHtml5 web workers
Html5 web workers
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구
 

Similar to Web Components & Polymer

First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax KoreanTerry Cho
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]WSConf.
 
Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Doo Sung Eom
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design patternSukjin Yun
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web ComponentsEunYoung Kim
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차Michael Yang
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial우림 류
 
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522jieun kim
 
Image styling with_web_components
Image styling with_web_componentsImage styling with_web_components
Image styling with_web_components민정 김
 
Modern web application with meteor
Modern web application with meteorModern web application with meteor
Modern web application with meteorJaeho Lee
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차Michael Yang
 
Couchbase .net client 개발
Couchbase .net client 개발Couchbase .net client 개발
Couchbase .net client 개발세진 김
 
Couchbase .net client 개발
Couchbase .net client 개발Couchbase .net client 개발
Couchbase .net client 개발jr p
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지yongwoo Jeon
 

Similar to Web Components & Polymer (20)

Hacosa jquery 1th
Hacosa jquery 1thHacosa jquery 1th
Hacosa jquery 1th
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax Korean
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Reflow and repaint 성능 비용
Reflow and repaint 성능 비용
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design pattern
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
웹표준 교육
웹표준 교육웹표준 교육
웹표준 교육
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
 
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522
집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522
 
Image styling with_web_components
Image styling with_web_componentsImage styling with_web_components
Image styling with_web_components
 
Modern web application with meteor
Modern web application with meteorModern web application with meteor
Modern web application with meteor
 
Hibernate 기초
Hibernate 기초Hibernate 기초
Hibernate 기초
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
 
Hacosa js study 6th
Hacosa js study 6thHacosa js study 6th
Hacosa js study 6th
 
Couchbase .net client 개발
Couchbase .net client 개발Couchbase .net client 개발
Couchbase .net client 개발
 
Couchbase .net client 개발
Couchbase .net client 개발Couchbase .net client 개발
Couchbase .net client 개발
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
 

More from Jae Sung Park

[SOSCON 2018] 오픈소스 개발: Behind the scenes
[SOSCON 2018] 오픈소스 개발: Behind the scenes[SOSCON 2018] 오픈소스 개발: Behind the scenes
[SOSCON 2018] 오픈소스 개발: Behind the scenesJae Sung Park
 
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기Jae Sung Park
 
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지Jae Sung Park
 
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기Jae Sung Park
 
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjsJae Sung Park
 
How jQuery event works
How jQuery event worksHow jQuery event works
How jQuery event worksJae Sung Park
 
현실적 Angular js
현실적 Angular js현실적 Angular js
현실적 Angular jsJae Sung Park
 
가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJSJae Sung Park
 
모바일 웹 디버깅
모바일 웹 디버깅모바일 웹 디버깅
모바일 웹 디버깅Jae Sung Park
 
스마트 TV 앱 개발 맛보기
스마트 TV 앱 개발 맛보기스마트 TV 앱 개발 맛보기
스마트 TV 앱 개발 맛보기Jae Sung Park
 
How to create Aptana Ruble
How to create Aptana RubleHow to create Aptana Ruble
How to create Aptana RubleJae Sung Park
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
Developing game audio with the Web Audio API
Developing game audio with the Web Audio APIDeveloping game audio with the Web Audio API
Developing game audio with the Web Audio APIJae Sung Park
 
Jindo Plugin for Aptana Studio 3
Jindo Plugin for Aptana Studio 3Jindo Plugin for Aptana Studio 3
Jindo Plugin for Aptana Studio 3Jae Sung Park
 

More from Jae Sung Park (20)

[SOSCON 2018] 오픈소스 개발: Behind the scenes
[SOSCON 2018] 오픈소스 개발: Behind the scenes[SOSCON 2018] 오픈소스 개발: Behind the scenes
[SOSCON 2018] 오픈소스 개발: Behind the scenes
 
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기
[DEVIEW 2018] JavaScript 배틀그라운드로부터 살아남기
 
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지
[SOSCON 2017] 네이버의 FE 오픈소스: jindo에서 billboard.js까지
 
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기
[DEVIEW 2017] 14일만에 GitHub 스타 1K 받은 차트 오픈소스 개발기
 
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
 
현실적 PWA
현실적 PWA현실적 PWA
현실적 PWA
 
How jQuery event works
How jQuery event worksHow jQuery event works
How jQuery event works
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
 
현실적 Angular js
현실적 Angular js현실적 Angular js
현실적 Angular js
 
가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS가볍게 살펴보는 AngularJS
가볍게 살펴보는 AngularJS
 
모바일 웹 디버깅
모바일 웹 디버깅모바일 웹 디버깅
모바일 웹 디버깅
 
CSS Functions
CSS FunctionsCSS Functions
CSS Functions
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
스마트 TV 앱 개발 맛보기
스마트 TV 앱 개발 맛보기스마트 TV 앱 개발 맛보기
스마트 TV 앱 개발 맛보기
 
How to create Aptana Ruble
How to create Aptana RubleHow to create Aptana Ruble
How to create Aptana Ruble
 
Web Audio API
Web Audio APIWeb Audio API
Web Audio API
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
Developing game audio with the Web Audio API
Developing game audio with the Web Audio APIDeveloping game audio with the Web Audio API
Developing game audio with the Web Audio API
 
Jindo Plugin for Aptana Studio 3
Jindo Plugin for Aptana Studio 3Jindo Plugin for Aptana Studio 3
Jindo Plugin for Aptana Studio 3
 
Web Application SG
Web Application SGWeb Application SG
Web Application SG
 

Web Components & Polymer