46
Desktop Application도전하는 JavaScript 권병철 SynapSoft WebOffice Team

Deview2013 track1 session7

Embed Size (px)

DESCRIPTION

DEVIEW2013 - 네이버 오피스 삽질기

Citation preview

Page 1: Deview2013 track1 session7

Desktop Application에

도전하는 JavaScript권병철

SynapSoft WebOffice Team

Page 2: Deview2013 track1 session7
Page 3: Deview2013 track1 session7
Page 4: Deview2013 track1 session7
Page 5: Deview2013 track1 session7

네이버 오피스는

어떻게 만들었나요?

Page 6: Deview2013 track1 session7

그러게요....

어떻게 만들었을까요?

Page 7: Deview2013 track1 session7

Naver Office 개발 뒷담화

Page 8: Deview2013 track1 session7

SynapSoft?

• 문서 처리 솔루션의 히든 챔피

• 문서 필터, HTML 변환기 제작

Page 9: Deview2013 track1 session7

WebOffice?

웹오피스,

만들지 않겠는가?

Page 10: Deview2013 track1 session7

그까이꺼 대~충

HTML 변환기

+

편집기능

Page 11: Deview2013 track1 session7

모든 게 잘 되는 것 같았다

Page 12: Deview2013 track1 session7

But...

Page 13: Deview2013 track1 session7

Performance Tuning

JavaScript에 날개를 달자

Page 14: Deview2013 track1 session7

Dynamic Rendering

Page 15: Deview2013 track1 session7

Dynamic Rendering

• Rendering 도중 브라우저 사망

Page 16: Deview2013 track1 session7

Dynamic Rendering

• render 대상을 chunk

• 브라우저 '응답 없음'의 기준

• 실행 시간(×)

• Function call 내 명령 수

• setInterval, setTimeout

• 뻗는 것보다 조금 느린 게 낫

다!

Page 17: Deview2013 track1 session7

Dynamic Rendering

• Rendering 이후

• 스크롤 안돼!

• 메뉴 클릭 안돼!!

• 편집도 안돼!!!

• DOM 객체가 많다

= DOM Tree가 무겁다

= 리소스를 많이 먹는다

Page 18: Deview2013 track1 session7

Dynamic Rendering

• 보이는 부분만 렌더링하면?

• 보이지 않는 부분은 소거

whole contents

browser window

Page 19: Deview2013 track1 session7

Dynamic Rendering

• 보이는 부분만 렌더링하면?

• 보이지 않는 부분은 소거

• 사용자 경험을 고려해 buffer

영역 설정

whole contents

browser window

buffer

Page 20: Deview2013 track1 session7

그래도 안 돼요!

• DOM element를 삽입/소거하

는 과정에서 reflow 발생!!

• 적게는 성능 하락

• 많게는

◀ 보시다시피 -_-;;

Page 21: Deview2013 track1 session7

Reflow & Repaint

repaint

reflow

insert / delete

nodereposition

resize font

bgColor

visibility

border

Page 22: Deview2013 track1 session7

Reflow & Repaint

// bad

var left = 10, top = 10;

el.style.left = left + "px";

el.style.top = top + "px";

// good

el.style.cssText +=

"; left: " + left +

"px; top: " + top + "px;";

• reflow가 일어날 상황은 한 번

에 몰아서 처리

Page 23: Deview2013 track1 session7

Reflow & Repaint

// bad

function setStyle(oStyle) {

// move if needed

// resize if needed

// set color if....

}

// good

function move(x, y) {...}

function resize(x, y) {...}

function setColor(c) {...}

• paint 함수를 세분화하여

repaint만 가능할 때는 repaint

만 하도록 유도

Page 24: Deview2013 track1 session7

Dynamic CSS Styling

Page 25: Deview2013 track1 session7

Dynamic CSS Styling

• 모든 node의 CSS style 재정의

• loop 돌다 브라우저 사망

hello, again :-P

Page 26: Deview2013 track1 session7

Dynamic CSS Styling

// Internet Explorer

document.styleSheets

.addRule(sel, idx);

document.styleSheets

.rules[idx].style.cssText= "...";

// FireFox & Chrome

document.styleSheets

.insertRule(sel, idx);

document.styleSheets

.deleteRule(idx);

• document.styleSheets 객체

• 스타일 시트 정의

• script level에서 임의로 추

가/수정/삭제 가능

Page 27: Deview2013 track1 session7

Exploits

브라우저의 한계를 회피하는 꼼수(?)

Page 28: Deview2013 track1 session7

Local Font Detection

Page 29: Deview2013 track1 session7

Local Font Detection

• 임의의 DIV에 문자열 삽입

• 글꼴 적용

• 높이/너비가 변경되는지 확인!

hello, world!

hello, world!

hello, world!

not installed

installed

Page 30: Deview2013 track1 session7

Clipboard Handling

• 외부 클립보드 데이터가 브라

우저와 호환되지 않음

• 브라우저 clipboard 객체에서

접근 불가능한 정보도 존재

• [office Object]

Page 31: Deview2013 track1 session7

Clipboard Handling

• 브라우저간/제품간 클립보드

정보 공유

• 각 process별로 독립된 클립보

드 제어

• 제품간 적절한 문서 모델로 변

Page 32: Deview2013 track1 session7

Clipboard Handling

• hidden iframe to hook

Ctrl+C/V

Page 33: Deview2013 track1 session7

Clipboard Handling

• 객체의 type에 따라

• base64 인코딩

• html로 변환

• 태그 정렬 등등...

encodemodel

↔ html

strip

tags

pic?

obj?

text?typ

e

Page 34: Deview2013 track1 session7

Vector Element Events

• 이벤트의 기본은 직교 영역

• 사용자 직관을 벗어남

click!

selected

?

<SVG> or <VML>,whatever it is...

BOOO~!

Page 35: Deview2013 track1 session7

Vector Element Events(Non-IE)

• pointer-events property

• SVG 전용 속성

• "그려진 부분"만 이벤트가 적

용되게 할 수 있음

• mouseDown

• mouseOver

• mouseUp

click!

selected!

pointerEvents == "auto"?

Page 36: Deview2013 track1 session7

Vector Element Events(IE)

• 특정 클래스명을 검사

• 실제 path와 상위 VML 클

래스명이 다름

• 이벤트가 적절하지 않으면

• document

.elementFromPoint()

• nextElement.fireEvent()

click!

selected!

className=="manipulable"

?

Page 37: Deview2013 track1 session7

Conclusion

단언컨대,

JavaScript는 가장 hot한 언어입니다.

Page 38: Deview2013 track1 session7

JavaScript Rules!

Toy Trash

Page 39: Deview2013 track1 session7

JavaScript Rules!

Trend

Page 40: Deview2013 track1 session7

JavaScript Rules!

• HTML5 + CSS3 Standard

• Plentiful API & Framework

• Server-side Language

Page 41: Deview2013 track1 session7

JavaScript Rules!

• HTML5 + CSS3 Standard

• Plentiful API & Framework

• Server-side Language

Page 42: Deview2013 track1 session7

JavaScript Rules!

• HTML5 + CSS3 Standard

• Plentiful API & Framework

• Server-side Language

Page 43: Deview2013 track1 session7

하지만 실제론...

Just another Community app

with bootstrap!

Page 44: Deview2013 track1 session7

• 워드 : 인쇄 결과물과 동일한 편집 페이지 분할(pagination)

• 공동 편집

• 오프라인 캐시

• 더욱 강력한 기능들

• 문서 효과(그림자, 반사 등)

• 글머리 기호

• 애니매이션

• 겹선 테두리

• 기타등등...

우린 아직 배고프다!

Page 45: Deview2013 track1 session7

도전하세요!

Page 46: Deview2013 track1 session7

Thank You!

[email protected]

twitter.com/overockaffe

facebook.com/overockaffe

Any Questions?