540 likes | 751 Views
Web Components 개요. Agenda. Web Components 란 무엇인가 ? Web Components 의 구성요소 템플릿 데코레이터 커스텀 요소 Shadow DOM Web Components 는 Web 을 어떻게 바꿀 것인가 ?. Web Components 란 무엇인가 ?. →Web 의 UI 를 「 컴포넌트화 」 하기 위한 스펙군. Web 에는 컴포넌트화가 필요하다. 유지 , 보수성. Web 에는 컴포넌트화가 필요하다. 재이용성. 개발효율.
E N D
Agenda • Web Components란 무엇인가? • Web Components의 구성요소 • 템플릿 • 데코레이터 • 커스텀 요소 • Shadow DOM • Web Components는 Web을 어떻게 바꿀 것인가?
Web Components란 무엇인가? →Web의 UI를「컴포넌트화」하기 위한 스펙군
유지, 보수성 Web에는컴포넌트화가필요하다. 재이용성 개발효율
Web Components 개요 • Google에 의해 스펙 제안 • 2012/10 현재, Google Chrome이 일부를 이미 구현함 • 일부 스펙이 공식 초안으로써 공개 • 일반적으로 사용 가능하게끔 하기 위해서는 아직 시간이 걸릴 듯 하다
Web Components의 구성요소 • Web Components를 구성하는 4개의 요소 템플릿 데코레이터 커스텀 요소 Shadow DOM
HTML 템플릿 • 현재 JavaScript로 UI를 주무르는 방법은 두가지가 있다. • 문자열 템플릿 • DOM조작
HTML 템플릿 • 현재 JavaScript로 UI를 주무르는 방법은 두가지가 있다. • 문자열 템플릿 • DOM을 고려하지 않음 • 비표준 • DOM조작 <script id="tmpl1" type="text/x-handlebars-template"> <div>...</div> </script>
HTML 템플릿 • 현재 JavaScript로 UI를 주무르는 방법은 두가지가 있다. • 문자열 템플릿 • DOM조작 • 코드를 작성하기 힘들다 • 결과를 예측하기 어렵다 var div = document.getElementById('...'); div.setAttribute('key', 'value'); var p = document.createElement('p'); p.innerHTML = '...'; div.appendChild(p);
HTML 템플릿 • 현재 JavaScript로 UI를 주무르는 방법은 두가지가 있다. • 문자열 템플릿 • DOM조작 • 코드를 작성하기 힘들다 • 결과를 예측하기 어렵다 HTML템플릿으로 해결!
HTML 템플릿 정의방법 • <template>요소를 사용한다. • <template> 안에 평소대로 HTML를 기술한다 • <template>은 랜더링되지 않는다. • <body>, <head>에 정의 <html> <head> <template id="t"> <div id="message"></div> </template> </head> <body></body> </html>
HTML 템플릿을 사용한다 • Content 설정으로부터 내부 DOM을 취득한다. <template id="t"> <div id="message"></div> </template> vartmplElem = document.getElementById('t'); vartmpl = tmplElem.content.cloneNode(); … elem.appendChild(tmpl);
HTML템플릿 • 솔직히, 이것만으로는 전혀 편리하지 않다. • 데코레이터, 커스텀 요소에서 사용되는 범용요소라고 이해해야한다. • 「템플릿이다」라는 시맨틱을 부여할 수 있다는 것이 장점. • 지금까지의 <script>요소보다 보기좋다. <script type="text/x-handlbars-template"> </script>
CSS의 한계를 뛰어넘는다 CSS의 한계는? DOM 조작이 불가능하다
<ul> <li> <i>아이콘</i> <span>앱 센터</span> <span>2</span> </li> … </ul> … 대충 요정도로 끝날것 같은 부분이지만… 쩜쩜쩜
데코레이터 • 요소를 「데코레이션」하기위한 구조 • HTML안에서 정의하고, CSS안에서 사용한다
데코레이터의 정의 • <decorator>요소와<template>요소를 사용하여 정의한다. <decorator id="labelDecorator"> <template> 라벨: </template> </decorator>
데코레이터의 사용 • CSS안에서 decorator설정을 사용하여 요소에 지정한다. /* 모든 label요소를 「라벨:」 로 변경 */ label { decorator: url(#labelDecorator); } <label for="name"> 이름 </label> <input id="name">
데코레이터의 사용 • 템플릿 안에서 <content>요소를 사용하여 요소내용을 투입할 장소 지정이 가능하다. <decorator id="labelDecorator"> <template> <!-- 여기에 요소내용이 투입됨 --> <content></content>: </template> </decorator> <label for="name"> 이름 </label> <input id="name">
여러 개의 <content>요소 지정하기 • <content>는 복수지정이 가능하다. • Select속성을 적용하여 요소내용의 일부를 추출하여 투입할 수 있다. <decorator id="fieldRowDecorator"> <template> <div> <!– 여기에 요소 내용이 투입됨--> <content select="label"></content>: </div> <!– 남은 요소는 여기에 투입됨--> <div id="field"><content></content></div> </template> </decorator>
여러 개의 <content>요소 지정하기 /* 라벨과 필드의 조합 */ .fieldRow { decorator: url(#fieldDecorator); } <div class="fieldRow"> <label for="name"> 이름 </label> <input id="name"> </div>
Advanced:데코레이터의 스타일링 • scope 속성이 부여된 style요소를 사용 <decorator id="fieldRowDecorator"> <template> <style scoped>...</style> … </template> </decorator>
Advanced:데코레이터내의 이벤트 처리 • 데코레이터는listen()이라는 메소드를 사용하여 이벤트 핸들러를 등록한다. • 데코레이터의 코드가 실행되는것은, 로드될때 딱 한 번. <decorator id="decorator-event-demo"> <script> function h(event) { alert(event.target); } this.listen( {selector: "#b", type: "click", handler: h}); </script> <template> <content></content> <button id="b">Bar</button> </template> </decorator>
데코레이터 • 어디까지나 “표시”를 목적으로 하는 기능이다. • Shadow DOM(나중에 설명)은 지니지 않는다. • 데코레이터로 정의된 DOM에는 접근할 방법이 없다. • 스타일링 목적의 필요없는마크업을 극적으로 줄일 수 있기 때문에 꽤 강력하다.
커스텀 요소란? 요소를 내가 직접 만들수 있어요!!!!
커스텀 요소의 정의 • <element>요소를 사용한다. • name속성에 요소명을 지정한다. • 새로 만드는 요소에는 「x-」라는 접두어를 반드시 붙여야한다. • extends속성에 미지원 브라우저에서 보일 요소를 지정해 준다. <element name="x-fancybutton” extends="button"> <template> <!–- 데코레이터와 동일 --> … </template> </element>
커스텀 요소의 사용 • 요소에 is속성을 지정하여 커스텀 요소의 명칭을 지정한다. • 대상이 되는 요소는 커스텀 요소의 extends와 일치해야할 필요가 있다. <buttonis="x-fancybutton"> <span>버튼입니당</span> </button>
Advanced:커스텀 요소의 인스턴스화 • 커스텀 요소는 통상적인 요소와 동일하게 document.createElement()로 인스턴스화가 가능하다. • constructor속성으로 생성자를 생성할 수도 있다. var e = document.createElement('x-fancybutton'); <element name="x-fancybutton" extends="button" constructor="FancyButton">...</element> varfancyButton = new FancyButton();
Advanced:커스텀 요소의 클래스 정의 • 생성자의 프로토 타입을 변경하여 요소의 독자적인 퍼포먼스를 추가한다. <element ... constructor="FancyButton"> <script> FancyButton.prototype.razzle = ... // constructor속성을 사용하지 않은 경우에는 // 아래 코드로 생성자에 접근 // varFancyButton = this.generatedConstructor; </script> ... </element>
Advanced:커스텀 요소의 라이프 사이클 • 커스텀 요소는 아래와 같은 라이프 사이클 이벤트를 잡고 처리를 행한다. • created • attributeChanged • inserted • removed <element extends="time" name="x-clock"> <script> this.lifecycle({ inserted: function(){ this.startUpdatingClock(); }, removed: function() { this.stopUpdatingClock(); } }); </script> </element>
Shadow DOM이란? • 개발자의 시선에서 숨겨진 DOM 트리 • 복잡한 내부구조를 은폐하고 심플한 DOM으로 보이게 할 수 있다.(=캡슐화)
Shadow DOM의 구현상황 • Google Chromeに은 Shadow DOM이 구현되어 있다. • 표준적인 요소의 대부분이 Shadow DOM으로 구현되어 있다. • video/audio/textarea/details/input...
Shadow DOM을 “보자” • chrome://flags에서 다음의 설정을 ON으로 한다. • Shadow DOM을 체크 • <style scoped>을 체크 • Shadow DOM을 사용하기 위해서 필요 • 개발자 툴의 테스트를 사용하기로 설정한다. • Shadow DOM 내용을 개발자툴에서 보기 위해서 필요
Shadow DOM을 “보자” • 표준적인 요소가 Shadow DOM에 의해 구축되어있는것을 확인한다.
Advanced:Shadow DOM의 동작 이해하기 • Shadow DOM을 사용한 요소(Shadow Host)의 “안쪽”에는 2개의 DOM트리가 있다. <element name="x-fancybutton" extends="button"> <template> <content></content> <div>...</div> </template> </element> 커스텀 요소의 정의에 포함되는 DOM트리. 이 트리는 개발자의 눈에 보이지 않는다. (Shadow DOM) 커스텀 요소 내에 중첩되어있는 DOM트리. 이 트리는 Shadow DOM으로 대체된다. <button is="x-fancybutton"> <span>버튼</span> </button>
Advanced:Shadow DOM의 동작 이해하기 • 두 종류의 DOM트리
Advanced:Shadow DOM의 동작 이해하기 • Shadow DOM으로 대체된다.
Advanced:Shadow DOM의 동작 이해하기 • 본래의 DOM트리는 <content>요소 위치에 투입된다. <element name="x-fancybutton" extends="button"> <template> <content></content> <div>...</div> </template> </element> <button is="x-fancybutton"> <span>버튼</span> <div>...</div> </button> <button is="x-fancybutton"> <span>버튼</span> </button>
Advanced:Shadow DOM 사용 • Chrome에서는 이미 Shadow DOMAPI를 이용 가능도록 되어있다. • WebKitShadowRoot를 적용하여 임의의 요소를 Shadow Host로 할 수 있다.
Advanced:Shadow DOM 사용 • 아래의 코드를 Shadow DOMAPI를 사용하여 형성한다. <!DOCTYPE html> <div id="shadowHost"> 본래 있던 DOM트리 </div> <div id="shadowSubtree"> <style scoped> #origTree { color: red; } </style> <h1>Shadow DOM Subtree</h1> <div id="origTree"> <content></content> </div> </div>
Advanced:Shadow DOM 사용 // Shadow Host가 되는 요소를 취득 var shadowHost = document.getElementById('shadowHost'); // Shadow Host로 변환 // 이 시점에서 본래의 DOM트리는 일단 비표시됨 varshadowRoot = new WebKitShadowRoot(shadowHost); // Shadow DOM 서브트리가 되는 요소 varshadowSubtree = document.getElementById('shadowSubtree'); // Shadow DOM서브트리로 지정 // 표시되는것은 이 요소가 된다. // <content>요소 부분에 본래의 DOM트리가 표시된다.shadowRoot.appendChild(shadowSubtree);
UI프레임워크의이용방법이 통일됨 $('#list').somelist(); <ul data-role="listview"> </ul> <ulis="x-somelist"> </ul> <uldojoType="x.y.SomeList"> </ul>
외부 컴포넌트를 불러옴 • link엘리먼트를 사용하여 외부 컴포넌트를 불러올 수 있다. <link rel="components" href="URL"> CDN에 의한 컴포넌트 배포등을 기대할 수 있다
Web UI개발의 분업이 가능해짐 컴포넌트 이용자 (Low skill) HTML마크업 CSS 스타일링 컴포넌트 개발자 (high skill) HTML/CSS/JS를 구사한 컴포넌트 개발 개발 표준 책정 타사 컴포넌트의 선정 등