Top Banner
JavaScript 実践講座 Framework, Tool, Performance taiga.jp Taiga Hirohata
54

JavaScript 実践講座 Framework, Tool, Performance

May 17, 2015

Download

Technology

taiga.jp
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: JavaScript 実践講座 Framework, Tool, Performance

JavaScript 実践講座

Framework, Tool, Performance

taiga.jp Taiga Hirohata

Page 2: JavaScript 実践講座 Framework, Tool, Performance

About

Freelance engineer (Flash, Flex, AIR, JavaScript etc)

Principle Classmethod, Inc.

Adobe Community Professional

http://taiga.jp/

@taiga

© 2013 taiga.jp 2 / 54

Page 4: JavaScript 実践講座 Framework, Tool, Performance

Agenda

Framework

Tools

Performance

© 2013 taiga.jp 4 / 54

Page 5: JavaScript 実践講座 Framework, Tool, Performance

当セッションにおける要素

問題 解決策 将来

© 2013 taiga.jp 5 / 54

Page 6: JavaScript 実践講座 Framework, Tool, Performance

Frameworks

© 2013 taiga.jp 6 / 54

Page 7: JavaScript 実践講座 Framework, Tool, Performance

ブラウザ対応

一貫性のないブラウザ API

Ex : 9 以前の IE は attachEvent() 9 以降は addEventListener() を使用

ブラウザ機能の矛盾

Ex : <input type="data">

© 2013 taiga.jp 7 / 54

Page 8: JavaScript 実践講座 Framework, Tool, Performance

JavaScript Libraries

Utility

jQuery(event listeners, XHR, etc.) http://api.jquery.com/category/events/ http://api.jquery.com/Types/#jqXHR

Underscore(collections, etc) http://underscorejs.org/#collections

© 2013 taiga.jp 8 / 54

Page 9: JavaScript 実践講座 Framework, Tool, Performance

JavaScript Libraries

Polyfills 古いブラウザでもモダンブラウザと同等の機能を提供

html5shiv / html5shim

selectivizr

es5-shim

Mozilla Developer Network samples

© 2013 taiga.jp 9 / 54

Page 10: JavaScript 実践講座 Framework, Tool, Performance

JavaScript Libraries

Feature detection 特徴検出

Moderinizr http://modernizr.com/

YepNope http://yepnopejs.com/

© 2013 taiga.jp 10 / 54

Page 11: JavaScript 実践講座 Framework, Tool, Performance

JavaScript Libraries

Ease of library use

Library bundles (HTML5 Boilerplate)

Package managers (Bower)

Scaffolding generators (Yeoman)

© 2013 taiga.jp 11 / 54

Page 12: JavaScript 実践講座 Framework, Tool, Performance

非常に積極的にリリースされている

これまで以上に速く近代化している

今まで以上に標準に従っていく

ブラウザの改善

© 2013 taiga.jp 12 / 54

Page 13: JavaScript 実践講座 Framework, Tool, Performance

http://www.w3counter.com/trends

ブラウザの改善

© 2013 taiga.jp 13 / 54

Page 14: JavaScript 実践講座 Framework, Tool, Performance

依存関係分かりますか?

本当にすべてのファイル使ってますか?

これらは正しい順序でロードされていますか? <script src="script3.js"></script>

<script src="script1.js"></script>

<script src="script11.js"></script>

<script src="script21.js"></script>

<script src="script30.js"></script>

依存関係、スパゲッティ

© 2013 taiga.jp 14 / 54

Page 15: JavaScript 実践講座 Framework, Tool, Performance

http://requirejs.org/

Module Pattern

RequireJS Pattern

RequireJS

© 2013 taiga.jp 15 / 54

Page 16: JavaScript 実践講座 Framework, Tool, Performance

Logger.js

RequireJS

define(...) { ... function print(msg) {

console.log(msg);

}

// Define public API

exports.print = priint;

});

define(function(require, exports, module) { var Logger = require("pkg/Logger"); function sayHelloWorld() {

Logger.print("Hello, world!");

}

// Define public API

exports.sayHelloWorld = sayHelloWorld;

});

© 2013 taiga.jp 16 / 54

Page 17: JavaScript 実践講座 Framework, Tool, Performance

Modules in ES6 Harmony

module "foo" { import "pkgLogger" as Logger; function sayHelloWorld() {

Logger.print("Hello, world!");

}

// Define public API

export sayHelloWorld;

}

© 2013 taiga.jp 17 / 54

Page 18: JavaScript 実践講座 Framework, Tool, Performance

非同期プログラムは難しい

コールバックは悪くない …が改善の余地がある

非同期コード

© 2013 taiga.jp 18 / 54

Page 19: JavaScript 実践講座 Framework, Tool, Performance

非同期処理完了のリスニング

リスナーにはオブジェクトが返される

Promises

var options = … ; var promise = beginSomeAsyncOperation(options); promise.done(function(result) {

console.log("Operation finishes with result:" + result); }); promise.fail(function(errorCode) {

console.log("Operation failed. Error:" + errorCode); });

© 2013 taiga.jp 19 / 54

Page 20: JavaScript 実践講座 Framework, Tool, Performance

内部的に、非同期 API は処理完了後に 遅延オブジェクトを生成して返します

Promises

function beginSomeAsyncOperation(options) { var result = new $.Deffered(); sendNetworkRequest( function(response) {

if(response.error) result.reject(response.error); else result.resolve(response.data); });

return result.promise(); //req still pending here }

© 2013 taiga.jp 20 / 54

Page 21: JavaScript 実践講座 Framework, Tool, Performance

「ピラミッド」を回避 Callbacks authenticate(userName, password,

fucntion () { findRecord(itemId,... function(item) {

applyUpdates(item);

saveRecord(item,

function (result) {

indicateSucess();

}

);

}

); }

);

Promise chaining authenticate(userName, password) .then( function() {

return findRecord(itemId);

})

.then( function(item) {

applyUpdates(item);

return saveRecord(item);

})

.then( function(result) {

indicateSucess();

});

© 2013 taiga.jp 21 / 54

Page 22: JavaScript 実践講座 Framework, Tool, Performance

ES6 Harmony "yield" Promise chaining

authenticate(userName, password) .then( function() {

return findRecord(itemId);

})

.then( function(item) {

applyUpdates(item);

return saveRecord(item);

})

.then( function(result) {

indicateSucess();

});

ES6 "yield" + task.js spawn(function() {

yield authenticate(userName, password);

var item = yield findRecord(itemId);

applyUpdates(item);

var result = yield saveRecord(item);

indicateSucess();

});

© 2013 taiga.jp 22 / 54

Page 23: JavaScript 実践講座 Framework, Tool, Performance

将来は非同期実行のフローを ツールが理解して教えてくれる…はず

より良いデバッギング

© 2013 taiga.jp 23 / 54

Page 24: JavaScript 実践講座 Framework, Tool, Performance

手作業によるスパゲッティ化

限定的な UI 更新

$("project-title").text(filename);

$(".dialog .validation-error").toggle(isError);

$(".modal-overlay ul.songs li:eq(" + i + ")").addClass("selected");

dialog.appendChild(document.createElement("div"));

dialog.firstCihld.innerHTML = "<input type='text' value='"

+ htmlEscape(imte.name) + "'>";

$("#help-sidebar .main-content").html(newContent);

© 2013 taiga.jp 24 / 54

Page 25: JavaScript 実践講座 Framework, Tool, Performance

View

Underscore

Mustache

Handlebars

Templating & MVC F/W

© 2013 taiga.jp 25 / 54

Page 26: JavaScript 実践講座 Framework, Tool, Performance

Model

Backbone

Templating & MVC F/W

© 2013 taiga.jp 26 / 54

Page 27: JavaScript 実践講座 Framework, Tool, Performance

Controller

Knockout

Batman

Ember

Angular

Knockback

Templating & MVC F/W

© 2013 taiga.jp 27 / 54

Page 28: JavaScript 実践講座 Framework, Tool, Performance

JavaScript F/W Popularity

© 2013 taiga.jp

from GitHub Archive

28 / 54

Page 29: JavaScript 実践講座 Framework, Tool, Performance

プレーンなモデルの使用

Ember, Backbone name = model.get("songName");

model.set("rating", 5);

ES5 Getters/Setters

© 2013 taiga.jp 29 / 54

Page 30: JavaScript 実践講座 Framework, Tool, Performance

プレーンなモデルの使用

Knockout name = model.songName();

model.rating(5);

ES5 Getters/Setters

© 2013 taiga.jp 30 / 54

Page 31: JavaScript 実践講座 Framework, Tool, Performance

プレーンなモデルの使用

Serenade name = model.songName;

model.rating = 5;

ES5 Getters/Setters

© 2013 taiga.jp 31 / 54

Page 32: JavaScript 実践講座 Framework, Tool, Performance

Web1.0 アプリは常に C/S 往復

サーバ上のクラッシュ

サーバ上の遅延

モダンアプリはクライアント処理が主流

どのようにクライアント端末上の クラッシュや遅延を知ればよい?

サーバログ

© 2013 taiga.jp 32 / 54

Page 33: JavaScript 実践講座 Framework, Tool, Performance

var errors=[]; window.onerror = function(msg, fileUrl, lineNum) { errors.push({msg: msg, file: fileTrl, line: lineNum}); };

setInterval(function() { sendToServer(errors);

errors = [];

}, 5000);

Error Logging

© 2013 taiga.jp 33 / 54

Page 34: JavaScript 実践講座 Framework, Tool, Performance

Open bugs in …

WebKit

Chrome

Firefox

フルスタックトレース…?

© 2013 taiga.jp 34 / 54

Page 35: JavaScript 実践講座 Framework, Tool, Performance

<html>

<head>

<script>

function onLoad() {

var now = Date.now();

var pageLoadTime = now - pertformance.timing.natigationStart;

sendToServer(pageLoadTime);

}

</script>

</head>

<body onload="onLoad()">

...

Performance APIs

© 2013 taiga.jp 35 / 54

Page 36: JavaScript 実践講座 Framework, Tool, Performance

Tools

© 2013 taiga.jp 36 / 54

Page 37: JavaScript 実践講座 Framework, Tool, Performance

(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]]) [+!+[]+[+[]]]+(![]+[])[+!+[]+!+[]]

シートベルトなし運転

© 2013 taiga.jp 37 / 54

Page 38: JavaScript 実践講座 Framework, Tool, Performance

型チェックなし

変数の型が動的に変更可能 凸(゚皿゚メ)

暗黙の型変換

構造化不足

繰り返される決まり文句の表記

シートベルトなし運転

© 2013 taiga.jp 38 / 54

Page 39: JavaScript 実践講座 Framework, Tool, Performance

コンパイルなし ≒ IDEの文法チェックなし

Linting は安全性を与える

統合解析 / Linting

© 2013 taiga.jp 39 / 54

Page 41: JavaScript 実践講座 Framework, Tool, Performance

ヒントを超えた情報

完全にインタラクティブな編集

コンテキスト スニペット

© 2013 taiga.jp 41 / 54

Page 42: JavaScript 実践講座 Framework, Tool, Performance

型推論

© 2013 taiga.jp 42 / 54

Page 43: JavaScript 実践講座 Framework, Tool, Performance

型推論

© 2013 taiga.jp 43 / 54

Page 44: JavaScript 実践講座 Framework, Tool, Performance

型推論

© 2013 taiga.jp 44 / 54

Page 45: JavaScript 実践講座 Framework, Tool, Performance

クロスコンパイラ

© 2013 taiga.jp 45 / 54

Page 46: JavaScript 実践講座 Framework, Tool, Performance

ソースマップ

© 2013 taiga.jp 46 / 54

Page 47: JavaScript 実践講座 Framework, Tool, Performance

履歴デバッグ

振り返りデバッグ

統合的ビュー実行

Code/Test/Debug Cycle 融合

© 2013 taiga.jp 47 / 54

Page 48: JavaScript 実践講座 Framework, Tool, Performance

Performance

© 2013 taiga.jp 48 / 54

Page 49: JavaScript 実践講座 Framework, Tool, Performance

var start = Date.now(); //... Do do stuff ... var end = Date.now(); console.log((end - start) + "ms"); //CSS style calculation //Layout //Repaint //User sees update->Date.now()==???

評価が難しい

© 2013 taiga.jp 49 / 54

Page 50: JavaScript 実践講座 Framework, Tool, Performance

Timeline panel (http://goo.gl/Vim9r)

パフォーマンスツール

© 2013 taiga.jp 50 / 54

Page 51: JavaScript 実践講座 Framework, Tool, Performance

Timeline demo (http://goo.gl/1Z7Jp)

パフォーマンスツール

© 2013 taiga.jp 51 / 54

Page 52: JavaScript 実践講座 Framework, Tool, Performance

FPS counter (chrome://flags)

パフォーマンスツール

© 2013 taiga.jp 52 / 54

Page 53: JavaScript 実践講座 Framework, Tool, Performance

CSS selector profiling

Repaint rectangles

Render layer borders

→ Session Web Dev2

パフォーマンスツール

© 2013 taiga.jp 53 / 54

Page 54: JavaScript 実践講座 Framework, Tool, Performance

Resource Timing ページ上の各リソース読み込みタイミング

Async Scroll スクロールのパフォーマンスをテストする

Display Performance フレームレート関連 API

Programmatic APIs

© 2013 taiga.jp 54 / 54