chrome extensionsの基本とデザインパターン

71
Chrome Extensions ののの ののののののののの Chrome+HTML5 Developers Live Japan #1

Upload: yoichiro-tanaka

Post on 12-Apr-2017

726 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Chrome Extensionsの基本とデザインパターン

Chrome Extensionsの基本とデザインパターン

Chrome+HTML5 Developers Live Japan #1

Page 2: Chrome Extensionsの基本とデザインパターン

Chrome Extension使ってますか?

Page 3: Chrome Extensionsの基本とデザインパターン
Page 4: Chrome Extensionsの基本とデザインパターン
Page 5: Chrome Extensionsの基本とデザインパターン
Page 6: Chrome Extensionsの基本とデザインパターン
Page 7: Chrome Extensionsの基本とデザインパターン

Chrome Extensionで何ができるの?

Page 8: Chrome Extensionsの基本とデザインパターン

Browser Actions

Page 9: Chrome Extensionsの基本とデザインパターン

Page Actions

Page 10: Chrome Extensionsの基本とデザインパターン

Context Menus

Page 11: Chrome Extensionsの基本とデザインパターン

Desktop Notifications

Page 12: Chrome Extensionsの基本とデザインパターン

Options Pages

Page 13: Chrome Extensionsの基本とデザインパターン

Options Pages

Page 14: Chrome Extensionsの基本とデザインパターン

APIsalarms, bookmarks, browserAction, browsingData, commands, contentSettings, contextMenus, cookies, debugger, declarativeWebRequest, devtools.network, devtools.inspectedWindow, devtools.panels, downloads, events, extension, fileBrowserHandler, fontSettings, history, i18n, idle, input.ime, management, omnibox, pageAction, pageCapture, permissions, privacy, proxy, pushMessaging, runtime, scriptBadge, storage, tabs, topSites, tts, ttsEngine, types, webNavigation, webRequest, webstore, windows

Page 15: Chrome Extensionsの基本とデザインパターン

APIs

Page 16: Chrome Extensionsの基本とデザインパターン

Chrome Extensionは何でできてるの?

Page 17: Chrome Extensionsの基本とデザインパターン

Technologies

Web pages + JavaScript API

Page 18: Chrome Extensionsの基本とデザインパターン

Structureマニフェストファイル(manifest.json)1つ以上の HTMLファイル

(Optional) 1つ以上の JavaScriptファイル(Optional) 必要となる他のファイル - 画像ファイルなど

これらを zipファイルにまとめて Chromeウェブストアにアップロードする

Page 19: Chrome Extensionsの基本とデザインパターン

Minimum Extensionmanifest.json

{ "manifest_version": 2, "name": "Minimum Extension", "version": "0.0.1", "browser_action": { "default_popup": "popup.html" }}

Page 20: Chrome Extensionsの基本とデザインパターン

Minimum Extensionpopup.html

<!DOCTYPE html><html> <head></head> <body> <div>Hello, Chrome extension!</div> </body></html>

Page 21: Chrome Extensionsの基本とデザインパターン

Minimum Extension

Page 22: Chrome Extensionsの基本とデザインパターン

Minimum Extension

Page 23: Chrome Extensionsの基本とデザインパターン

Minimum Extension

Page 24: Chrome Extensionsの基本とデザインパターン

Minimum Extension

Page 25: Chrome Extensionsの基本とデザインパターン

Minimum Extension

Page 26: Chrome Extensionsの基本とデザインパターン

オレ流Chrome Extensionデザインパターン

Page 27: Chrome Extensionsの基本とデザインパターン

Structure

manifest.json analytics.json background.js

options.htmloptions.js

popup.htmlpopup.js

Page 28: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

manifest.json

Page 29: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

Page 30: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persist": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

Browser/Page actionのコンテンツは「 popup.html」というファイル名にする

Page 31: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": ["./jquery-min.js","./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

Background Pageは必ず作成し「 background.js」というファイル名とする

軽い ExtensionとするためにEvent pageとする

Page 32: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

設定ページが必要な場合は「 options.html」というファイル名で作成する

Page 33: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

どんなに小さな Extensionでも国際化しておく最低限 enと jaをサポートする

Page 34: Chrome Extensionsの基本とデザインパターン

{ ... "version": "バージョン番号 (XX.XX.XX形式 )", "browser_action": { "default_icon": "./icon_**.png (**はサイズ )", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }

利用状況を把握するためにGoogle Analyticsを仕込んでおく

Google Analyticsサーバと通信するために CSPに記載しておく

Page 35: Chrome Extensionsの基本とデザインパターン

Google Analyticsポリシー:

「 Google Analyticsを使っていることを開示し、トラッキングデータの収集のためにCookieが使われていることも明記する」

Chromeウェブストアのページや Extension内にてちゃんとユーザに説明しましょう。

Page 36: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

background.js

Page 37: Chrome Extensionsの基本とデザインパターン

popup.htmlpopup.js

options.htmloptions.js

background.js Backend server

UI処理に専念

UI処理に専念

Ajaxでの通信

設定値出し入れ

イベント処理

Page 38: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

Page 39: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

各種イベントハンドラを登録する処理を「 assignEventHandlers()」関数にまとめる

Page 40: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

assignEventHandlers: function() { // タブの変更監視 chrome.tab.onActivated.addListener( function(activeInfo) { ... } ); // Chromeの起動監視 chrome.runtime.onStartup.addListener( function() { // Google Analyticsに記録など _gaq.push(["_trackEvent", "..", ".."]); } ); ...},

Page 41: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

Ajax処理は「 load***()」という関数名にする

Ajax処理を background.jsに集めておく( Debugしやすくなるため)

Page 42: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

load***: function(callbacks) { $.ajax({ url: this.getServerUrl + "ajax/get_***" }) .done(function(data) { callbacks.onSuccess(data); });},getServerUrl: function() { return "http://backend.server.name/";},

Page 43: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();設定ページで設定されるような動

的な設定値の格納と取得処理もbackground.jsにまとめておく

Page 44: Chrome Extensionsの基本とデザインパターン

var Background = function() { this.assignEventHandlers();};Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ...};var bg = new Background();

get***Config: function() { var value = localStorage["***"]; if (value) { return value; } else { return "初期値 "; }},set***Config: function() { localStorage["***"] = value;},

Page 45: Chrome Extensionsの基本とデザインパターン

popup.htmlpopup.js

options.htmloptions.js

background.js Backend server

chrome.runtime.getBackgroundPage()でアクセス可能

Chrome DevTools

Page 46: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

options.html

Page 47: Chrome Extensionsの基本とデザインパターン

Options Pages

Page 48: Chrome Extensionsの基本とデザインパターン

<!DOCTYPE html><html> <head> <script type="text/javascript" src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ...

Page 49: Chrome Extensionsの基本とデザインパターン

<!DOCTYPE html><html> <head> <script type="text/javascript" src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ...

Google Analyticsで設定ページへのアクセスを計測できるようにする

Page 50: Chrome Extensionsの基本とデザインパターン

var _gaq = _gaq || [];_gaq.push(['_setAccount', 'UA-xxxxxx-xx']);_gaq.push(['_trackPageview']);(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = 'https://ssl.google-analytics.com/ga.js'; var s = document.getElementByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();

Page 51: Chrome Extensionsの基本とデザインパターン

<!DOCTYPE html><html> <head> <script type="text/javascript" src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ...

表示文字列は htmlに一切記載しない

id属性はしっかり書いておく

Page 52: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

options.js

Page 53: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

Page 54: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

onloadイベント発生に応じて初期化処理が動くようにしておく

Page 55: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

各種初期化処理を呼び出す他の jsと関数名を揃えておく

Page 56: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

assignMessages: function() { var hash = { "opt***" : "opt***", ... }; for (var key in hash) { $("#" + key).text( chrome.i18n.getMessage(hash[key])); }},

HTMLの各プレースホルダ (id属性を振った要素 )に対して、メッセージリソースから得た国際化文字列をセットする

Page 57: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

restoreConfigurations: function() { chrome.runtime.getBackgroundPage( function(bg) { $("#***").val(bg.get***Config()); ... } );}; Background pageの設定値取得

関数を使って、せっせと UIに値をセットしていく

Page 58: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

assignEventHandlers: function() { $("#***").on("click", $.proxy( function(evt) { this.onClick***(evt); }, this ));},onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { var value = $("#***").val(); bg.set***Config(value); } );}, Background pageの設定値格納

関数を使って設定値を保存する

Page 59: Chrome Extensionsの基本とデザインパターン

(function() { var Options = function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); });})();

assignEventHandlers: function() { $("#***").on("click", $.proxy( function(evt) { this.onClick***(evt); }, this ));},onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { var value = $("#***").val(); bg.set***Config(value); } );},

イベントハンドラの名前は「 on+イベント種別 +UI項目名」とする

Page 60: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

popup.html

Page 61: Chrome Extensionsの基本とデザインパターン
Page 62: Chrome Extensionsの基本とデザインパターン

<!DOCTYPE html><html> <head> <script type="text/javascript" src="./jquery-min.js"> <script type="text/javascript" src="./popup.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> <span id="***"></span> ...

options.jsとほぼ一緒

Page 63: Chrome Extensionsの基本とデザインパターン

My design pattern for Chrome Extension

popup.js

Page 64: Chrome Extensionsの基本とデザインパターン

(function() { var Popup = function() { this.assignMessages(); this.assignEventHandlers(); }; Popup.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, ... }; window.addEventListener( "load", function(evt) { new Popup(); });})();

options.jsとほぼ一緒

Page 65: Chrome Extensionsの基本とデザインパターン

(function() { var Popup = function() { this.assignMessages(); this.assignEventHandlers(); }; Popup.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, ... }; window.addEventListener( "load", function(evt) { new Popup(); });})();

assignEventHandlers: function() { $("#***").on("click", $.proxy(function(evt) { this.onClick***(evt); }, this));},onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { // 設定値を取得 var config =bg.get***Config(); // Ajax通信 bg.load***({ onSuccess: function(data) { ... } }); } );},

Background pageが提供する関数を利用

Page 66: Chrome Extensionsの基本とデザインパターン

My design patternロジックを整理&集中させる - Background pageをうまく使うこと

統一感を作り出す - assign***() , onClick***() , set/get***Config()

国際化を徹底させる - id属性 , assignMessages()

Page 67: Chrome Extensionsの基本とデザインパターン

利用者が増えるのを楽しむには?

Page 68: Chrome Extensionsの基本とデザインパターン
Page 69: Chrome Extensionsの基本とデザインパターン
Page 70: Chrome Extensionsの基本とデザインパターン
Page 71: Chrome Extensionsの基本とデザインパターン

http://developer.chrome.com/extensions/