Home > MooTools > [HTML5API] Web Workersで手抜きツール作ってみた

[HTML5API] Web Workersで手抜きツール作ってみた

マイコミジャーナルにあるHTML5 APIのWeb Workersについての解説見て作ってみたものを、
最近サービス開始されたjsdo.itにうpしてみたよ。
jsdo.itはまだ開始まもなく、研究に余念の無い変態ユーザーの密度が計り知れない強さなので必見だと思う :D

とりあえずWeb Workersっていうのが使ってみたかったんだけど、負荷の軽減具合を試すようなサンプルじゃ面白くないので、
ライブラリファイルにあるHTMLソースを組み合わせてベースになるソースを組む手抜きツールを作ってみた。
連想配列として設定済みの値を並べるだけでも量が増えればそれなりに重くなると思うし。

HTMLSourceBuilder

読み込んでるワーカーファイルライブラリファイルを編集すれば出力をカスタマイズできる。

Web Workers?

使うメリットは、マイコミのサンプルにあるように重い処理を全部裏側でやっつけられるので表の動作が軽くなるという事なんだと思う。

Web Workesを使うにはまずオブジェクトを作成しなければならない:

JavaScript:
  1. var worker = new Worker('./source-worker/js/');

ここで別途作成したsource-worker.jsを読み込む。
Workerクラスに渡したurlはXHRと同じくクロスドメイン通信は出来ない。

ワーカーにデータを送信:

JavaScript:
  1. worker.postMessage(this.conf);

手抜きツールでは何がチェックされたのかっていう設定を入れたオブジェクトを渡してます。

this.conf = {
	charset:"string",
	doctype:"string",
	lang:"string",
	meta:Array(),
	link:Array(),
	area:Object()
}

postMessage()でワーカーに送信されたデータはevent.dataで受け取ることができる。
ワーカーから送信されたデータもonmessageイベントで受け取れる。

JavaScript:
  1. onmessage = function(event) {
  2.     var opt = event.data;
  3. };

渡されたオブジェクトをワーカーが受け取ると値がtoString()された文字列になる。

event.data = {
	charset:"string",
	doctype:"string",
	lang:"string",
	meta:Array String,
	link:Array String,
	area:Object String
}

配列とかはevalで元に戻す。

JavaScript:
  1. opt.meta = eval(opt.meta);

ワーカーはimportScripts()で別のソースファイルを読み込むことができる。
手抜きツールではライブラリファイルを読み込んでます。

JavaScript:
  1. importScripts('http://jsdo.it/Tenderfeel/sourcelib/js/');

WorkerからはDOMにアクセス出来ないっていう制約があるんで、
document.getElementByIdとかで要素取得して.valueだの.innerHTMLだので値を参照することはできない。
その代わりデータの受け渡しはonmessage/postmessageの他にWeb Database、Storage、XHR、WebSocketでも出来るんで
これらを介して処理に必要な情報をやり取りすることになります。
個人的な使い勝手で言うとSessionStorageとLocalStorageが便利だと思った。

console.log()使えないからエラーチェックが非常に面倒くさいんだけど、
ChromeかSafariならworker内のエラーも表示してくれます。

HTMLSourceBuilderについて

デモとソースはjsdo.itに置いてあります。

配列に格納されているソースの出力をチェックボタンのON/OFFで切り替えるだけの単純なものです。
たとえばlinkタグについては次のようになってます。

HTMLファイル側:

HTML:
  1.     <th scope="row">Link</th>
  2.     <td id="link">
  3.         <ul>
  4.             <li><label><input type="checkbox" name="linkrss" value="linkrss">RSS Feed</label></li>
  5.             <li><label><input type="checkbox" name="touchicon" value="touchicon">apple-touch-icon</label></li>
  6.             <li><label><input type="checkbox" name="favicon" value="favicon">Favicon</label></li>
  7.         </ul>
  8.     </td>
  9. </tr>

core.jsが使うのはnameだけなのでvalueはidにしてもいい。

ライブラリ側(抜粋):

JavaScript:
  1. 'link':{
  2.         'linkrss':'<link rel="alternate" type="application/rss+xml" href="" title=""{slash}>\n',
  3.         'touchicon':'<link rel="apple-touch-icon" href=""{slash}>\n',
  4.         'favicon':'<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"{slash}>\n',
  5.     },

見ての通りHTMLとライブラリの構造が同じなので、日本語にすると次のようになります。

JavaScript:
  1. ’親要素のID':{
  2.         'input要素のname':'出力されるソース',
  3.         'input要素のname':'出力されるソース',
  4.         'input要素のname':'出力されるソース'
  5. }

{slash}はXHTMLの場合に/へ変換されるタグです。source-worker.jsで置換してます。

JavaScript:
  1. if(opt.link){
  2.     opt.link = eval(opt.link);
  3.     for(j = 0; j <opt.link.length; j++){
  4.         s += source['link'][opt.link[j]].replace(/{slash}/g, shash);
  5.     }
  6. }

置換するタグは他に{lang}と{tag}があります。{lang}はクラスオプションで指定出来るlangの値が入る。
{tag}はHTML5のタグ切り替え用で、switchTag()という関数で処理しています。

#area以下の場合はinputの下にさらに子要素を設定できる。
Footerのcopyrightの項目がそれです。

HTML:
  1. <li><label><input type="checkbox" name="footer" value="footer">Footer</label>
  2.     <ul>
  3.         <li><label><input type="checkbox" name="copyright" value="copyright" class="footer">copyright</label></li>
  4.     </ul>
  5. </li>

この場合は親となるinput要素と同じクラス名を子に付与しときます。

source-worker.js(抜粋):

JavaScript:
  1. if(opt.area.footer!==null){
  2.     s +=  source.area.footer.start.switchTag('footer');
  3.    
  4.     if(opt.area.footer.copyright){
  5.         s+=source.area.footer.copyright.switchTag('span');
  6.     }else{
  7.         s += '\t\t<!--Footer Content-->\n';
  8.     }
  9.    
  10.     s +=  source.area.footer.close.switchTag('footer');
  11. }
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://tenderfeel.xsrv.jp/mootools/876/trackback/
Listed below are links to weblogs that reference
[HTML5API] Web Workersで手抜きツール作ってみた from WebTecNote

Home > MooTools > [HTML5API] Web Workersで手抜きツール作ってみた

最近の投稿
最近の修正
  • そしてこのSQLはわれながらよく書いたと思う 2010-11-15
  • CSVの列っていう方がいいのかな…118項目だった 2010-11-15
  • 楽天のCSVの項目が116個もあった衝撃 2010-11-15
  • オフィスで香水臭振りまくのは迷惑だと知れ 2010-11-15
  • ぐあー フレグランステロやー 2010-11-15
  • More updates...

Powered by Twitter Tools

Tag Cloud
おすすめサーバー・他
メタ情報

Return to page top