<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Application Cache &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/application-cache/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>【エキスパートガチトーク】Web技術の未来を「Extensible Web」から探る！ (前編)─HTML5は問題だらけ？</title>
		<link>/shumpei-shiraishi/16597/</link>
		<pubDate>Thu, 03 Sep 2015 01:00:26 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[Extensible Web]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">/?p=16597</guid>
		<description><![CDATA[読者の皆様は、「Extensible Web」というキーワードについてご存知でしょうか。 Extensible Webは、現在のWebが抱える大きな問題点を解決しようとする考え方であり、ムーブメントです。 その問題点とは...]]></description>
				<content:encoded><![CDATA[<p><style>
.post-detail-contents p {
  text-indent: 0;
  clear: left;
}
b.speaker.komatsu {
  background: url('/wp-content/uploads/2015/08/komatsu.png') no-repeat;
  background-size: 48px;
}
b.speaker.shiraishi {
  background: url('/wp-content/uploads/2015/08/shiraishi.png') no-repeat;
  background-size: 48px;
}
b.speaker.saito {
  background: url('/wp-content/uploads/2015/08/saito.png') no-repeat;
  background-size: 48px;
}
b.speaker.daniel {
  background: url('/wp-content/uploads/2015/08/daniel.png') no-repeat;
  background-size: 48px;
}
b.speaker.asai {
  background: url('/wp-content/uploads/2015/08/asai.png') no-repeat;
  background-size: 48px;
}
b.speaker {
  display: inline-block;
  width: 48px;
  height: 18px;
  float: left;
  padding-right: 8px;
  padding-top: 48px;
  text-align: center;
  font-size: 12px;
  margin-bottom: 4px;
  font-weight: normal;
  clear: left;
}
p {
  overflow: hidden;
}
</style></p>

<p>読者の皆様は、「<strong>Extensible Web</strong>」というキーワードについてご存知でしょうか。</p>

<p>Extensible Webは、現在のWebが抱える大きな問題点を解決しようとする考え方であり、ムーブメントです。
その問題点とは、誤解を恐れず言うなら、「HTML5の流れで生み出された様々なAPIが実際にはあまり使われておらず、役に立っていない」という点に尽きると思います。</p>

<p>Extensible Webはそうした問題を解決するために、「開発者によって拡張可能なWebを目指そう」と呼びかけます。そのために必要なのは、特定のユースケースを想定した粒度の粗いAPIではなく、粒度が細かく、より基本的な機能を提供する低レベルなAPIを提供することで、開発者が様々なライブラリを作りやすくすることです。詳しくは<a href="https://html5experts.jp/iwase/10825/" data-wpel-link="internal">こちらの記事</a>も参考にしてください。</p>

<p><img src="/wp-content/uploads/2015/08/DSC_0199.png" alt="" width="640" height="415" class="aligncenter size-full wp-image-16713" srcset="/wp-content/uploads/2015/08/DSC_0199.png 640w, /wp-content/uploads/2015/08/DSC_0199-300x195.png 300w, /wp-content/uploads/2015/08/DSC_0199-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Extensible Webは、「<a href="https://extensiblewebmanifesto.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Extensible Web Manifesto</a>」というマニフェストが公開されてから広く世に知られるようになりました。<a href="https://github.com/extensibleweb/manifesto/blob/master/README.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Extensible Web Manifestoの文書がGitHub上で公開されたのが2013年6月9日</a>ですので、既に2年以上が経過していることになります。本対談では、Extensible Webが誕生してから2年で何が変わったのか、そしてこれからWebはどうなっていくのかを、有識者の方々にそれぞれの立場から語っていただこうという発想で企画しました。</p>

<p>標準化団体のスタッフがどんな目線でWebを見ているのか、ブラウザベンダが開発者に求めているものは何か、Web標準にも詳しいエキスパートが現在のWebをどう捉えているかなど、普段聞けない話がいっぱいです！前後編でお届けしますので、どうかお楽しみくださいませ。</p>

<p>ちなみに、前編は全体的に、HTML5や関連（あまり知られていないかもしれない）APIを広範に<s>disる</s>批評するという流れになってしまったので、ちょっとマニアックかもしれません…あしからず。</p>

<h2>自己紹介</h2>

<p><b class="speaker shiraishi">白石</b> 皆さん、本日はお集まりいただき、ありがとうございます。非常に豪華なメンバーにお集まりいただき、誠に光栄です。今日は脱線大歓迎というノリで、自由闊達にExtensible Web、そしてWeb全体について語っていただきたいと思います。ではまずは、自己紹介からお願いできますでしょうか。</p>

<p><b class="speaker komatsu">小松</b> 小松と申します。通信会社（NTTコミュニケーションズ）でWebに関する研究開発をしておりまして、最近ではWebRTCやIoT/WoTに関する開発、標準化活動をやっています。</p>

<p><b class="speaker asai">浅井</b> Mozilla Japanの浅井です。最近はエヴァンジェリストとしてWeb技術に関して開発者の皆さんの前でお話したり、モバイル＆エコシステムマネージャーとして、パートナーさんとの協業を促進しています。<a href="http://au-fx.kddi.com/products/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fx0</a>というスマートフォンの開発や、FirefoxOSを搭載した<a href="http://panasonic.jp/viera/firefox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ビエラ</a>の開発をお手伝いしたりなど、パートナーさんと「Webを使ったものづくり」を広げていく仕事をしています。</p>

<p><b class="speaker shiraishi">白石</b> ビエラって、FirefoxOS積んでるんですか。知らなかった…。</p>

<p><b class="speaker saito">斉藤</b> 株式会社<a href="http://www.rich.co.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リッチメディア</a>で、主にメディア事業に携わりながら、対外的にはUXエンジニアとして活動しています。ここにいる皆さんは、標準化に近いところで働いていらっしゃる方が多いと思いますが、僕は一番現場に近いところで実装寄りの仕事をしているんじゃないかな。</p>

<p><b class="speaker daniel">ダニエル</b> W3Cのダニエル・デイビスと申します。半分はTV・ビデオ関係の仕事を、もう半分はマーケティングやコミュニケーション、特に開発者向けに標準をどう伝えていくかといったことを担当しています。特に最近注目しているのはセキュリティです。今セキュリティに関する仕様書がたくさん増えているので、そうした情報を開発者に伝えるにはどうしたらいいかを考えています。</p>

<h2>Extensible Web以前 &#8211; Application Cacheの失敗</h2>

<p><b class="speaker shiraishi">白石</b> では、Extensible Webが出てもう2年が過ぎたわけですが、そもそもExtensible Web以前は何が問題だったのでしょうか？例えば、標準化の失敗例としては <strong>Application Cache</strong> (※) がよく引き合いに出されますね。AppCacheの何がいけなかったのでしょう？</p>

<p><b class="speaker komatsu">小松</b> 使えるシーンが限られていたのが一番の問題じゃないかと思います。数ページ程度の静的なWebサイトならいいんだけど、ページ数が増えたり、ちょっと複雑になるととたんに使えなくなっちゃう。あと、キャッシュのバージョン管理が面倒臭かったですね。</p>

<p><b class="speaker saito">斉藤</b> アプリケーションキャッシュのファイルのバージョンを書き換えるGruntタスク、なんてのもあったりしますが、「勘弁してくれよ」って感じですね(笑)
キャッシュが更新されるタイミングもブラウザによってまちまちですし。</p>

<p><b class="speaker shiraishi">白石</b> 実務だと、キャッシュの最大容量とかもよく問題になりましたね。巨大な動画ファイルとかはキャッシュされなかったり、キャッシュの最大容量を知ろうと思っても知る手段すらない、とか。</p>

<p><b class="speaker daniel">ダニエル</b> 「オフラインの場合はキャッシュを、オンラインの場合はWeb上にある最新のリソースを使う」といったユースケースにも対応できていませんでしたね。</p>

<p><b class="speaker saito">斉藤</b> 仕様としても、結構珍しいかなと思いますね。長くWeb屋をやっていますが、1ファイル（マニフェストファイル）だけ用意すれば、あとはブラウザがうまくやってくれる…という仕様は他に見たことがありません。
<br><br>
JavaScriptのAPIは、だいたいにおいてPolyfill (※)を用意できるように作られていて、レガシーなブラウザの上でも動作をエミュレートできるようにしてあるものが多い。でもアプリケーションキャッシュの場合は、使うか使わないかの「ゼロイチ」を要求される。APIではなく、いきなりプラットフォームを作りにいったという感じがありますね。</p>

<p><b class="speaker shiraishi">白石</b> 僕、Google Gears（※）っていう技術の本を書いたことがあって、そういうのだけよく知ってるんですが、Gearsの仕様を参考に作られたからこんなことになったんだと思ってます…どうでもいい話ですが。。</p>

<p><small>
※ Application Cache…Webサイトをオフラインでも利用できるようにする仕組み。マニフェストファイルというファイルを一枚用意するだけで、キャッシュの管理はすべてブラウザが行ってくれるというのがウリの一つ。</p>

<p>※ Polyfill…新しいAPIをJavaScriptで実装し、非対応ブラウザでもそのAPIを使えるようにするもの。有名なところでは、Web Componentsを古いブラウザでも利用可能にする「Polymer」などがある。</p>

<p>※ Google Gears…Googleが昔開発していた、オフラインWebアプリを実現するブラウザプラグイン技術。Application CacheやWebSQL Database、Web Workersなど、HTML5関連APIの仕様策定に参照され、HTML5がメジャーになると開発が終了された。
</small></p>

<p><img src="/wp-content/uploads/2015/08/DSC_0059.png" alt="" width="640" height="413" class="aligncenter size-full wp-image-16723" srcset="/wp-content/uploads/2015/08/DSC_0059.png 640w, /wp-content/uploads/2015/08/DSC_0059-300x194.png 300w, /wp-content/uploads/2015/08/DSC_0059-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Webはアプリケーションプラットフォームになった</h2>

<p><b class="speaker shiraishi">白石</b> 他に、問題だったAPIとかありますか？</p>

<p><b class="speaker komatsu">小松</b> よく言われるのは <strong>contentEditable</strong> (※)ですね。</p>

<p><b class="speaker asai">浅井</b> ああ…死んでましたね。実装する側が(笑) 。「誰だ、こんな、実際には誰も使わないAPI作ったの」って開発者が文句言ってました(笑)。</p>

<p><b class="speaker shiraishi">白石</b> 確かそれって、IEかなんかで実装されていたのを仕様に起こしたって感じじゃありませんでしたっけ。</p>

<p><b class="speaker asai">浅井</b> そうかもしれませんね。「Webはみんなで作るもの」ってなる前の時代に作られた仕様という気がします。</p>

<p><b class="speaker saito">斉藤</b> ちょっと全般的な話になってしまうのですが、かつて単なる「ドキュメントレンダラー」だったWebブラウザが、HTML5のブームの中で、アプリケーションのランタイムへと変化していったという流れがあると思うんですよね。</p>

<p><b class="speaker shiraishi">白石</b> かつてはHTML5の仕様書の先頭の方にも、「アプリケーションプラットフォームを目指します」と書いてありましたしね。</p>

<p><b class="speaker daniel">ダニエル</b> それは今も変わっていませんね。W3CとしてはWebのことをオープン・ウェブ・プラットフォームと呼び表しつつ、プラットフォームがあまりに広くなりすぎているので、<a href="http://www.w3.org/blog/2014/10/application-foundations-for-the-open-web-platform/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Application Foundation（アプリケーション基盤）として8つのカテゴリに集中する</a>という動きをしています。</p>

<p><b class="speaker asai">浅井</b> ブラウザベンダ側からすると、JavaScriptを生み出した時点で「僕らはアプリケーションプラットフォームです」と言い続けていたんですよ。機能不足で、そうは見えなかったんでしょうが…ただ、それを目指していたというのはNetscapeの時代からありました（若い人向けの注: Netscape NavigatorというブラウザがFirefoxの前身）。
<br><br>
NetscapeがJavaScriptを動的な、拡張可能な言語として設計した時点から、Webはずっと拡張可能なプラットフォームです。なので、Extensible Webというキーワードには、<strong>（Webは拡張可能であるという）ブラウザベンダの思いを、Web開発者に伝わりやすいように言い直したという一面があるんじゃないか</strong>な、と思っています。</p>

<p><small>
※ contentEditable…任意の要素を、ユーザが編集可能な領域にすることのできる属性。<code>&lt;div contentEditable&gt;</code>とするだけで、簡単なWYSIWYGエディタを作成可能
</small></p>

<h2>disってない。disってないですよ</h2>

<p><b class="speaker shiraishi">白石</b> イマイチという評価のAPIとしては、他にもそういえば<strong>Web Storage</strong>（※）もありますね。同期型のAPIなので、ループの中とかで使っちゃうとUIスレッドがビジーになっちゃって、UIがもたついちゃったりフリーズしちゃったり、という。</p>

<p><b class="speaker komatsu">小松</b> 僕は割と好きなんですけどね。</p>

<p><b class="speaker saito">斉藤</b> ハードに使っちゃダメなんですよ。ちょっとした優しさのために使うべき(笑) 。例えばフォームの入力内容を入れておいて、ネットワークが切れた時でも失われないようにするとか、その程度。</p>

<p><b class="speaker daniel">ダニエル</b> 問題のあるAPIというと、<code>&lt;input type="date"&gt;</code>とかもそう。昔私はOperaにいたんですが、そこらへん（inputの様々なtype）をいち早く実装したのが自慢でした。でも開発者からのフィードバックとしては褒められるどころか、「（<code>&lt;input type="date"&gt;</code>使った時に）自動的に表示されるカレンダーのデザイン変えさせろ」でした(笑)。</p>

<p><b class="speaker saito">斉藤</b> Operaかわいそう(笑)。</p>

<p><b class="speaker asai">浅井</b> HTML5の発端（の一つ）だったのにね(笑) 。※</p>

<p><b class="speaker saito">斉藤</b> 僕は結局使ったことないですね(笑) 。デザインが合わないと、結局使いものにならないので。フォーム関係の仕様で言えば、<code>required</code>属性とか、<code>&lt;input type="email"&gt;</code>とか<code>&lt;input type="number"&gt;</code>とかはすごく助かりますよね。</p>

<p><b class="speaker komatsu">小松</b> モバイルで、タイプに合わせた最適なキーボードが出てきてくれるのが嬉しいですよね。</p>

<p><b class="speaker shiraishi">白石</b> ほかには、存在はするけどあんまり使われてない、ってAPIも多そうですよね。例えば<strong>Web Workers</strong>（※）とか。<strong>Shared Worker</strong>（※)なんてのもあったなあ…。</p>

<p><b class="speaker asai">浅井</b> いや、（Mozillaは）使ってますよ！</p>

<p><b class="speaker shiraishi">白石</b> いやまあ、一般のWeb技術者が使っているかというと、あんまり…という気がしますよね。他には…えーと…名前が出てこない。EventSourceとかいうAPI使うやつ。</p>

<p><b class="speaker komatsu">小松</b> <strong>Server Sent Events</strong>（※）だ。</p>

<p><br>
一同: ああーー</p>

<p><b class="speaker komatsu">小松</b> テキストしか扱えないし、サーバプッシュの用途だったら、他にWebSocketがあるから。HTTPサーバで事足りるっていうのはいいんですけどね。</p>

<p><b class="speaker daniel">ダニエル</b> WebSocketを使えないホスティングサービスの上で、「しょうがないから」Server Sent Events使ったということはありましたね(笑)。</p>

<p><b class="speaker shiraishi">白石</b> まあ、こういう風に、「あるけど使われてない」とか「あるけどイケてない」という仕様がいっぱいあって。</p>

<p><b class="speaker daniel">ダニエル</b> 他にももう一つ思い出しました。<strong>Network Service Discovery API</strong>（※）。W3Cスタッフとして言っていいかどうかわからないけど、あれはセキュリティの問題もあって、ちょっと残念な感じでした(笑)。</p>

<p><b class="speaker shiraishi">白石</b> でもこの対談、<strong>HTML5のAPIをdisる流れになってて、こんなの初めてで面白いなあ(笑)</strong>。</p>

<p><b class="speaker asai">浅井</b> disるように誘導してません？(笑)。</p>

<p><b class="speaker shiraishi">白石</b> いや、そんなつもりは…(汗) 。</p>

<p><small>
※ Web Storage…シンプルなローカルストレージAPI。<code>localStorage.setItem('key', 'value')</code>とするだけで、ローカルのストレージに値を保存できる。</p>

<p>※ WHATWGの取り組みの初期に、「<a href="https://whatwg.org/specs/web-forms/current-work/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Forms 2.0</a>」という仕様が提案されていた。</p>

<p>※ Web Workers, Shared Workers…Webブラウザ上でマルチスレッドプログラミングを可能にするAPI。</p>

<p>※ Server Sent Events…サーバプッシュを可能にするAPI。WebSocketとは異なり、HTTPサーバさえあれば動作する。</p>

<p>※ Network Service Discovery API…ネットワーク上のサービスを動的に発見するためのAPI。ホームネットワーク上で、デバイスを発見する用途に利用できるとされていた。
</small></p>

<h2>プレフィックスの反省を活かす</h2>

<p><b class="speaker shiraishi">白石</b> あと、Extensible Webの情報漁ってた時に「<strong>Indexed Database API</strong>（※）は、開発者のフィードバックを受けながら作った素晴らしいAPI」と書いてあったんですが、正直同意できない(笑) 。かなり使いにくいAPIだと思うんだけど…。</p>

<p><b class="speaker asai">浅井</b> えーと、いや、それは、<strong>申し訳ない</strong>。だいぶうちら（Mozilla）が推進しちゃって(笑)。</p>

<p><b class="speaker komatsu">小松</b> 一番最初に実装してなかったけ？</p>

<p><b class="speaker asai">浅井</b> してました(笑)。 （それ以前に提案されていた）<strong>WebSQL Database</strong>（※）なんて、標準化されていないSQLiteの仕様に依存してて全然ダメだ、と。</p>

<p><b class="speaker shiraishi">白石</b> いや、その主張は同意できたんですけど、できあがってみたIndexed Database APIの仕様がこれかーー、と(笑)。</p>

<p><b class="speaker asai">浅井</b> いやでもまあ、Extensibleではあるじゃないですか。プリミティブで、パフォーマンスも上げられるAPIは一応揃っていて。APIの使い勝手については、申し訳ない、ライブラリ使ってくださいと。MDN (Mozilla Developer Network) に掲載されているIndexed Database APIの解説でも、「<a href="https://github.com/mozilla/localForage" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">localForage</a>か<a href="http://www.dexie.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">dexie.js</a>を使ってください。<strong>そっちのほうが『More user friendlyだから』</strong>と」と<a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">書いてあります</a>(笑)。</p>

<p><b class="speaker daniel">ダニエル</b> 素で使うのが厳しいという意味では、<strong>WebGL</strong>（※）とかもそうですよね。ラッパーライブラリがないとコーディングは厳しいけど、プリミティブでパフォーマンスの高いAPIを提供している。</p>

<p><b class="speaker asai">浅井</b> そういう点から言うと、<strong>Extensible Webの考え方があと数年早かったら、Web Audio API（※）じゃなくて、Mozillaが作っていたAudio Data APIだったんじゃないかな</strong>、と思いますね。プリミティブなAPIを提供して、ライブラリはJavaScriptで作ればいいじゃん、と、そういう発想で作られていたAPIだったんです。</p>

<p><b class="speaker komatsu">小松</b> さっき話に上がってたWebSQL Databaseは、実はまだ結構使われてたりする。</p>

<p><b class="speaker asai">浅井</b> ああ、結構ありますね。たまにユーザから「動きません」ってフィードバックもらって、見てみるとWebSQL Databaseのせいだったりする。WebKitがWebSQLを実装したあたりで、急にみんなが新しいWebの機能を使い出して、そのままになってるサイトが多いんですよね。</p>

<p><b class="speaker shiraishi">白石</b> <strong>それは、<code>-webkit-</code>プレフィックスに依存したサイトが未だに大量にある、って問題とも繋がってますよね。</strong></p>

<p><b class="speaker asai">浅井</b> そうなんですよ… <strong>プレフィックス付けてる間に開発者からの意見を取り入れていこう、というシナリオをブラウザベンダは考えていたのですが、開発者たちは便利なものがあれば使ってしまう</strong>。我々（ブラウザベンダ）が考えていたようには、うまくいきませんでした。かと言って、ブラウザベンダ自らがライブラリを作って提案したりしても、使われるのは最初だけで、すぐ使われなくなったりしてしまう。だから、ライブラリを作りやすくして開発者の意見を取り込みやすくしていこうというのがExtensible Webの目標の一つです。プレフィックスの失敗も、反省の一つだと思うんですよね。</p>

<p><small>
※ Indexed Database API…ブラウザ上で利用できるキー・バリュー・ストレージ。Web Storageに比べると複雑だが高機能。</p>

<p>※ Web SQL Database…ブラウザ上で利用できるリレーショナル・データベース。SQLiteというデータベース実装の使用を前提としていたことが標準仕様としては不適格という理由で、今は非推奨に。</p>

<p>※ WebGL…ブラウザ上で利用できる3Dグラフィック用API。</p>

<p>※ Web Audio API…ブラウザ上で利用できる音声操作API。</p>

<p>※ Audio Data API…音声操作のAPIとして、Mozillaが仕様策定と実装を進めていたが、標準化の過程でWeb Audio APIに一本化された。</p>

<p></small></p>

<h2>Extensible Webの起源はjQueryにあり？</h2>

<p><b class="speaker komatsu">小松</b> あと、Extensible Web以前という話で言うと、4年前にサンタクララで行われたTPAC（※）のブレークアウトセッションの中で、「<strong>開発者とW3Cがうまく関わっていくにはどうしたらいいか</strong>」という議論をしたのを覚えています。そこで、開発者が中心になってWebを伸ばしていくという話で、jQueryの例が取り上げられていました。
<br><br>
で、（DOM操作に）セレクタを使用するというのがWeb開発者に受け入れられるというのが判明したので、パフォーマンスの問題を解決するために、ネイティブで<code>querySelector API</code>（※）が実装されたと。ここではフィードバックループがうまく働いたので、こういう例をどんどん増やしていこうという話がありまして、こういう流れがExtensible Webに繋がったのかなあ、と思います。</p>

<p><b class="speaker daniel">ダニエル</b> jQueryの話が出たところで、一ついいですか？Extensible Webとは全然関係ないんだけど。</p>

<p><b class="speaker shiraishi">白石</b> なんですか？</p>

<p><b class="speaker daniel">ダニエル</b> …<strong>小松さん、John Resig（※）に似てない？</strong></p>

<p><b class="speaker saito">斉藤</b> ああー、ググって出てきた写真で見ると、ちょうど黄色のやつに似てる。<a href="https://admin.thefutureofevents.com/assets/speaker/images/516/medium/JResig_(1).jpg?1408528451" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">黄色いJohn Resig</a>。</p>

<p><br>
一同: (爆笑)</p>

<p><img src="/wp-content/uploads/2015/08/DSC_0064.png" alt="" width="640" height="420" class="aligncenter size-full wp-image-16722" srcset="/wp-content/uploads/2015/08/DSC_0064.png 640w, /wp-content/uploads/2015/08/DSC_0064-300x197.png 300w, /wp-content/uploads/2015/08/DSC_0064-207x136.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker daniel">ダニエル</b> すいません、脱線しまして…。</p>

<p><b class="speaker shiraishi">白石</b> いえいえ、最初にお伝えしたように、脱線大歓迎です。この、「黄色いJohn Resig」の話も、記事に含めさせていただきます(笑)。</p>

<p>ではここらで一旦まとめますと、まずjQueryをきっかけとして<code>querySelector API</code>が出てきたといった流れがあり、これは実際に役立つAPIとして世界中で利用されているし、jQuery、もしくは類似ライブラリのパフォーマンス向上にも一役買っている。</p>

<p>一方で、Webプラットフォームには今やたくさんAPIがあるけど、使われていないものや、イケてないものもたくさんあると。こうした問題を解決する一つの糸口として、<code>querySelector API</code>が生み出された経緯をヒントにしつつ、現在のExtensible Webというムーブメントに繋がっている…という流れでしょうか。</p>

<p><strong>（以後、後編に続く）</strong></p>

<p><small>
※ TPAC…W3Cが主催する、Web標準技術に関するカンファレンス。</p>

<p>※ querySelector API…今すぐ開発者ツールのコンソールを開いて、<code>document.querySelector('任意のセレクタ')</code>を実行してみるべし。</p>

<p>※ John Resig…jQueryを作った人。
</small></p>
]]></content:encoded>
			</item>
		<item>
		<title>モバイル対応Webアプリケーションのキャッシュ戦略</title>
		<link>/kyo_ago/2466/</link>
		<pubDate>Tue, 24 Sep 2013 00:00:40 +0000</pubDate>
		<dc:creator><![CDATA[吾郷 協]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webアプリケーション]]></category>
		<category><![CDATA[オフラインファースト]]></category>
		<category><![CDATA[高速化]]></category>

		<guid isPermaLink="false">/?p=2466</guid>
		<description><![CDATA[近年、モバイルブラウザ上でアプリケーションを作るにあたり、JavaScriptでも不安定な回線上で動作する設計が求められるようになってきました。 ここでは、「オフラインファースト」をはじめとする、モバイルなどの回線が不安...]]></description>
				<content:encoded><![CDATA[<p><a href="https://html5experts.jp/wp-content/uploads/2013/09/dtl_thm_017.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/dtl_thm_017.png" alt="dtl_thm_017" width="207" height="156" class="alignright size-full wp-image-2593" /></a>
近年、モバイルブラウザ上でアプリケーションを作るにあたり、JavaScriptでも不安定な回線上で動作する設計が求められるようになってきました。</p>

<p>ここでは、「オフラインファースト」をはじめとする、モバイルなどの回線が不安定な状況を想定したWebアプリケーション設計に関して、キャッシュ方法やよく使われるAPIなどを紹介したいと思います。</p>

<p><span id="more-2466"></span></p>

<p>「オフラインファースト」とは2012年ごろから提唱されていた、「回線がオフラインになることを前提にアプリケーションの設計を行う思想」のことで、オフライン前提に設計することにより回線状況によらないサービス提供や、効率的な通信をベースにした高速な動作を目指すものです。</p>

<p>それではここからはキャッシュ方法とそれぞれ向いているコンテンツの紹介を行います。</p>

<h1>読み込みデータのキャッシュ</h1>

<p>ApplicationCacheやlocalStorage、オンメモリキャッシュなどを使って、「サーバから取得したデータをローカルに保持する」ものです。</p>

<p>これは一般に「クライアントサイドキャッシュ」と呼ばれるもので、ネットワークがオンラインの時に読み込んだデータをオフライン時に使用します。</p>

<p>サーバと連動しないコンテンツに向いており、実際のコンテンツ以外でもテンプレートファイルなどの「動的なコンテンツの静的な部分」にも使用されます。</p>

<h1>読み込みデータのマージ</h1>

<p>これは「読み込みデータのキャッシュ」と大きくは変わりませんが、「読み込みデータのキャッシュ」がオンラインになった際に毎回キャッシュを読みなおすのに比べて、「読み込みデータのマージ」はオンラインになった際にサーバ上で更新があった内容のみダウンロードを行います。</p>

<p>更新があった内容のみダウンロードを行うため、帯域の使用量が少なくなる利点がありますが、サーバとクライアントでデータの更新タイミングを管理する必要があるため、「読み込みキャッシュ」に比べて実装が複雑になります。</p>

<p>「多数の画像ファイルの内、更新があったもののみを再取得する」など、やりとりするデータ量が多いコンテンツに使用されます。</p>

<h1>書き込みデータのキャッシュ</h1>

<p>書き込み時に回線状況を確認して、オフラインの場合オンラインになるまでデータの送信を遅延させる方法です。</p>

<p>また、オフラインだった時だけではなく、サーバへの通信に失敗した場合、常にデータを再送する形で実装されることもあります。</p>

<p>実装方法としては独自に定義した通信用のコードを使用するほかに、XMLHttpRequestを乗っ取る方法や、使用しているライブラリ（jQuery）などのajaxメソッドをラッピングする方法などがあります。</p>

<p>「投稿」や「保存」などのサーバへの更新処理に使われますが、ゲーム等のタイミングが重要な通信や、「購入」等のサーバ側との連動が、重要な通信では使用されません。</p>

<h1>書き込みデータのマージ</h1>

<p>これは「読み込みデータのマージ」に書き込みが行われることを想定されたものですが、「書き込みの時系列を保持するか」、「同じデータを同時に編集していた場合にどう整合性を保つか」等によって実装難易度は大きく変わります。<br />
（時系列を保持せず、同時編集時は常に最後の修正が反映されれば良い場合、書き込みデータのキャッシュ実装と大きな差はありません）</p>

<p>これに関してはサーバ側の実装も大きく関わってくるためクライアント側だけで設計するのは難しいですが、もしクライアント側だけで実装したい場合には<a href="https://developers.google.com/drive/realtime/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Drive Realtime API</a>などの外部サービスの使用も検討してみてください。</p>

<h1>オフライン動作</h1>

<p>これは単純なデータのキャッシュではなく「ブラウザがオフラインの状態でも動作させる」方法になります。</p>

<p>現状、ブラウザ上でオフライン時にコンテンツを提供するには、基本的にApplicationCacheを使用します。</p>

<p>サーバ側の処理が重要な場合オフライン動作の必要性は高くありませんが、クライアントサイドで完結する要素が多いモバイル向けのツールやアプリケーションなどでは必要性が高くなります。</p>

<p>ここからは実際にキャッシュを実装する際によく使用される機能について紹介します。</p>

<h2>Web Storage（localStorage、sessionStorage）</h2>

<p>IE8以降の主要なブラウザで使用できる同期型の保存領域です。</p>

<p>多くのブラウザは5MB程度のデータを保持することが可能です。</p>

<p>実装も容易なためよく使われますが、同期型で実装されているためパフォーマンス的な問題も指摘されています。</p>

<p><a href="https://dev.mozilla.jp/2012/03/there-is-no-simple-solution-for-local-storage/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ローカルストレージに簡単な解決策はない | Mozilla Developer Street (modest)</a>では具体的な問題点や代替案が書かれています。</p>

<h2>Cookie</h2>

<p>古くから実装されており、サポートブラウザも広いことから、長い間クライアントキャッシュの保存領域としても使用されてきました。</p>

<p>ただ、Cookieに保存した内容はサーバへも送信されてしまうことから、Cookieをキャッシュとして使用する場合、以後の通信すべてで不要なデータをサーバに送ることになるため、大きなデータをキャッシュすることには向いていません。</p>

<h2>location.hash</h2>

<p>URLの # 以降に文字列を設定し、クライアントキャッシュとして使用する方法です。</p>

<p>サーバサイドへも送信されず、古いブラウザでも動作可能ですが、「ブラウザの履歴に残る」、「URLを共有した際にキャッシュも共有される」、「ブックマーク等にキャッシュも保存される」、「#を使った画面遷移時にキャッシュが破棄される」といった問題があるため、キャッシュとして使用する場合は注意が必要です。</p>

<h2>ブラウザキャッシュ</h2>

<p>JavaScriptから直接操作するAPIは提供されていませんが、ブラウザキャッシュもクライアントサイドでは重要なキャッシュになります。</p>

<p>具体的には「非表示のimg要素を作成し、img.srcへ画像のURLを設定して先読みさせる」、「見えないiframeで次に読み込むページを先読みする」といった方法で使用されます。</p>

<h2>Web SQL Database</h2>

<p>ブラウザ内に内蔵されたSQLiteに対して、JavaScriptからAPI経由でSQLを発行することでデータの保存、取得を行うのが<a href="http://www.w3.org/TR/webdatabase/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web SQL Database API</a>です。</p>

<p>もともとWebKit系のブラウザで実装されており、W3Cでも標準仕様として提案されていましたが、SQLiteへの依存などの問題によりW3C上では廃案になりました。<br />
（<a href="http://javascript.g.hatena.ne.jp/edvakf/20091102/1257139731" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ブラウザ上のデータベースに関して &#8211; JavaScriptで遊ぶよ &#8211; g:javascript</a>では廃案になった経緯等がまとめられています）</p>

<p>ただ、<a href="http://caniuse.com/sql-storage" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">モバイル環境では使える環境が多い</a>ため、モバイル環境に限ったウェブアプリケーションなどでは使用されることもあります。</p>

<h2>Indexed Database（Indexed DB）</h2>

<p>標準仕様としての策定が中止されたWeb SQL Databaseに代わり登場したクライアントサイドDBです。</p>

<p>Web SQL DatabaseがあくまでもSQLiteの仕様に準拠しているのに比べて、Indexed DatabaseはJavaScriptからの使用に特化しておりシンプルなObjectやFile objectなどをそのまま格納できます。</p>

<p>Chrome、Firefox、IE10でサポートされるなど、<a href="http://caniuse.com/indexeddb" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デスクトップブラウザではサポートが広まっています</a>が、Mobile Safari、Android標準ブラウザでのサポートが行われていないためモバイル環境での使用は広まっていません。</p>

<h2>Filesystem API</h2>

<p>ブラウザ上にディレクトリなどのFilesystemを操作するAPIを提供するのが、Filesystem APIです。</p>

<p>DOMFileSystem  objectやDirectoryEntry objectなどを使って、File objectを階層構造で管理することができます。</p>

<p>このAPIはinput[type=&#8221;file&#8221;]やD&amp;Dで渡されたファイルを処理する際に使用する「File API」とは違うAPIであることに注意してください。<br />
（Filesystem APIでも単一のファイルを操作する際はFile APIで提供される機能を使用しますが、File APIはあくまでもFilesystem APIから独立した仕様です）</p>

<p>主にChromeで実装されていますが、<a href="http://caniuse.com/filesystem" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome以外のブラウザでは実装が進んでいない</a>ため、一般的なウェブ環境ではあまり使用されていません。</p>

<p><a href="https://dev.mozilla.jp/2012/07/why-no-filesystem-api-in-firefox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox に FileSystem API が無いのはなぜか？ | Mozilla Developer Street (modest)</a>ではMozillaのFileSystem APIに対するスタンスが書かれています。</p>

<h2>ApplicationCache</h2>

<p>ApplicationCacheはcache manifestと呼ばれるキャッシュ対象のURLを記述したテキストファイルをhtmlから参照することで、記述されているURLの内容をローカルキャッシュとして使用する仕様です。</p>

<p>ApplicationCacheには以下の様な機能が含まれます。</p>

<ul>
<li>ブラウザがオフラインでも、事前にキャッシュした内容を表示する</li>
<li>ネットワーク通信なしに、cache manifestに書かれたURLのファイルにアクセスする</li>
<li>ブラウザがオフライン時のみ、代替内容を表示する</li>
<li>JavaScriptからキャッシュの取得、更新イベントを受け取る</li>
</ul>

<p>現在、ブラウザがオフライン時でもコンテンツを提供する場合ApplicationCacheが主に使用されますが、ApplicationCacheは「設計に失敗したAPI」と呼ばれるほど使い勝手が悪く、さまざまな問題を抱えています。</p>

<h1>ApplicationCacheの問題点</h1>

<p>ApplicationCacheに関しての紹介で「さまざまな問題を抱えています」と書きましたが、ここではそのうちの主なものについていくつか紹介したいと思います。</p>

<h2>読み込み元htmlがキャッシュされる</h2>

<p>ApplicationCacheを使用する場合、仕様上ApplicationCacheを使用しているhtmlもキャッシュされてしまうため、動的なコンテンツを出力してもすぐに反映されません。</p>

<p>そのため、ApplicationCacheを使用する場合は基本的に1枚の静的なhtmlを用意し、動的な部分はすべてJavaScriptを使用して構築することになります。</p>

<p>これはWebサイト構築の当初から想定している場合は問題ありませんが、サーバサイドで動的にコンテンツを生成している既存のWebサイトに対して、あとからApplicationCacheを導入する場合には大きな障害になります。</p>

<h2>キャッシュのクリアが困難</h2>

<p>ブラウザによってはApplicationCacheをクリアするUIを提供していないものもあり、開発中も含めて一度キャッシュされたApplicationCacheをクリアするのが困難な場合があります。</p>

<p>特にiOSの場合、アプリが独自に使用しているUIWebViewのApplicationCacheをクリアするには、アプリを削除して入れなおす以外の方法がありません。<br />
（アプリが独自のUIを提供している場合を除く）</p>

<h2>JavaScriptからキャッシュを操作することができない</h2>

<p>JavaScriptからApplicationCacheに関しては「キャッシュ状態の確認」、「サーバ上のデータ確認」、「キャッシュの破棄」を行うことができます。</p>

<p>ただし、キャッシュ操作は全キャッシュに対しての操作のみで、個別のファイルに対しての操作は提供されていません。</p>

<p>そのため、「高速化のために出来るだけキャッシュするファイルを多くしたいが、キャッシュするファイルが多いとキャッシュの更新に時間がかかる」という状況になります。</p>

<p>キャッシュの更新は自動的に行われるため基本的にブラウザ側で操作を行う必要はありませんが、逆に「一部のキャッシュのみ更新したい」、「更新順に優先度を付けたい」、「指定したキャッシュが更新されたらJavaScriptからアクセスしたい」と言った内容は実現できません。</p>

<h1>それでも使われるApplicationCache</h1>

<p>問題点の多いApplicationCacheですが、現状ブラウザがオフライン時にコンテンツを提供するためにはもっとも現実的な方法であるため、問題点があることを前提で使用されている状況です。</p>

<p>もしApplicationCacheを導入する場合、以下の点に注意してください。</p>

<h2>最初に導入するか決断する</h2>

<p>ApplicationCacheは仕様的にシングルページアプリケーション（1枚のhtmlをベースにJavaScriptでコンテンツを構築する形式）を想定しており、サーバサイドで毎回htmlを組み立てて出力する形式は想定されていません。</p>

<p>サーバサイドで毎回htmlを組み立てて出力するコンテンツの場合でもiframeを経由するなどして活用することは可能です。しかし、iframe内のApplicationCacheに対する状態管理とiframeと、本体間のキャッシュデータをやりとりするコードが必要になるため、実装は複雑になります。</p>

<h2>最悪の事態を想定する</h2>

<p>ApplicationCacheは使い方によっては完全にサーバから独立して動く事が可能ですが、場合によってはサーバからの変更を一切受け付けなくなってしまう状態に陥る場合があります。</p>

<p>もしサイト上でApplicationCacheを使用する場合、常にネットワーク上からダウンロードするJavaScriptを読み込ませておき、最悪の場合でもJavaScriptからリダイレクトの指示を出せるようにしておくことをおすすめします。</p>

<hr />

<p>ここまでキャッシュの設計やAPIに関して紹介してきましたが、ユーザから見た場合キャッシュとは「最良の通信やパフォーマンスが提供されない場合の代替手段」であり、本来存在しないことが求められる技術でもあります。</p>

<p>そのため、もしキャッシュを使用する場合、「ユーザの意図に反した動作にならないか」、「最良の状態でないことをユーザが理解できるか」といったことを意識して使用してください。</p>
]]></content:encoded>
			</item>
		<item>
		<title>wri.peで学ぶ、イマドキのWebアプリの作りかた（前編）</title>
		<link>/masuidrive/594/</link>
		<comments>/masuidrive/594/#respond</comments>
		<pubDate>Tue, 09 Jul 2013 11:34:44 +0000</pubDate>
		<dc:creator><![CDATA[増井 雄一郎]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[wri.pe]]></category>
		<category><![CDATA[イマドキのWebアプリの作りかた]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=594</guid>
		<description><![CDATA[連載： イマドキのWebアプリの作りかた (1)エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ連載、今回は wri.peです。 難しい機能の実装や、先進的なAPIの利用を通じて、執筆者が得たノウ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/app-lobo/" class="series-150" title="イマドキのWebアプリの作りかた" data-wpel-link="internal">イマドキのWebアプリの作りかた</a> (1)</div><p>エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ連載、今回は <a href="https://wri.pe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.pe</a>です。
難しい機能の実装や、先進的なAPIの利用を通じて、執筆者が得たノウハウを余すところなく紹介していきます。</p>

<p><span id="more-594"></span></p>

<h2>HTML5を活用したメモ帳アプリ [wri.pe]</h2>

<p>最近、仕事で作っている<a href="http://miil.me/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ミイル</a>が忙しかったり、趣味で作っている<a href="http://mobiruby.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MobiRuby</a>がなかなか進まなかったりして、個人でWebサービス的なモノを作っていない事が自分としてちょっと気になっていました。</p>

<p>そこで息抜きとして、ゴールデンウイークに集中してWebサービスを一つ作ろう！と思い立ち、<a href="https://wri.pe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.pe</a>というWebサービスの開発に着手しました。</p>

<p>wri.peは自分が使いたいと思えるメモ帳を作ったので、下記の様な特徴を持っています。</p>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/Markdown" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Markdown</a>フォーマットをサポート</li>
<li>Gmailの様なアーカイブ機能</li>
<li>全文検索</li>
<li>カレンダーへのマッピング</li>
<li>iPhone / iPadをサポート</li>
<li>キーボードで操作ができる</li>
</ul>

<p>ゴールデンウイーク期間中に一通り作った後、一カ月ほど自分で使いながらブラッシュアップし、6月3日に正式にリリースしました。</p>

<p>初めて個人でプレスリリースを打ってみたところ、個人でリリースしたWebサービスとしては多くの国内外の<a href="http://worklista.com/users/masuidrive/tag/wripe" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">メディアやブログ</a>に取り上げていただきました。</p>

<div id="attachment_604" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856658928_e82a471d40_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-604" alt="wri.pe" src="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png" width="300" height="187" srcset="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png 300w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-1024x640.png 1024w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-207x129.png 207w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">wri.pe</p></div>

<div id="attachment_605" style="width: 167px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-605" alt="wri.pe（モバイル）" src="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png" width="157" height="300" srcset="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png 157w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-537x1024.png 537w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-108x207.png 108w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png 336w" sizes="(max-width: 157px) 100vw, 157px" /></a><p class="wp-caption-text">wri.pe（モバイル）</p></div>

<h2>wri.peが目指すモノ</h2>

<p>wri.peは息抜きで作ったモノですが、せっかく作るのだからといくつかの目標を立てました。詳しくは<a href="http://blog.masuidrive.jp/index.php/2013/06/03/wripe-app/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ブログ</a>をご覧頂きたいのですが、その中の一つに、新しい技術で製品レベルのサイトを作った場合に起こる問題点などを把握したいという目標がありました。</p>

<p>HTML5の機能やBackboneJSなど耳にすることはあっても、実際に製品レベルのサイトで使って大丈夫なのか自分の肌感覚として把握できていないと仕事などで使うことができません。</p>

<p>HTML5というと、CSS3を用いたアニメーションや3D表現、ビデオやオーディオの標準化など、ブラウザ上の表現力向上が多く取り上げられます。
またHTML5の仕様には入りませんでしたが、WebSocketを用いたリアルタイム通信やGeolocation APIを使った位置情報の取得なども、広義のHTML5として話題になっています。</p>

<p>そこでwri.peでは、HTML5の中でも速度の向上にターゲットを絞って、新しい機能を使ってみることにしました。</p>

<h2>サイトの高速化のためにHTML5を使用する</h2>

<p>ほとんどのブラウザでは、通信をキャッシュする機能を有していて、同じページや画像の表示を高速化しています。
このキャッシュの制御はWebサーバで設定を行い、HTTPヘッダに特別な値を設定する事で有効期限などを設定することができます。
HTML5では、そうした既存のキャッシュ機構に加えて、<a href="http://www.whatwg.org/specs/web-apps/current-work/#applicationcache" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Application Cache</a>というキャッシュ機構を持っています。</p>

<h2>Application Cacheで通信を減らそう</h2>

<p>このApplication Cacheは本来、Webアプリをオフラインでも動かすために、通信状況に関係なくHTMLや画像を読み込むことのできるキャッシュとして設計されました。
しかし通常のWebサイトでもこのApplication Cacheを使うことで、画像などを読み込むためのネットワークアクセスを抑制し、ページの読み込み速度を上げることができます。</p>

<p>Application Cacheは、マニフェストファイルと呼ばれるファイルにキャッシュしたいファイル名を書くだけでキャッシュが行われます。そのため、HTMLやJavaScriptファイルに変更の必要がなく、手軽に導入できるというメリットがあります。</p>

<p>変更頻度の低いロゴなどの画像やCSSなどをこのマニフェストファイルに記述し、HTMLの中でマニフェストファイルのパスを指定するだけです。</p>

<p>なお、wri.peでは<a href="https://github.com/wycats/rack-offline" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">rack-offline</a>というライブラリを使い、マニフェストファイルを生成しています。</p>

<p>例) http://wri.pe/application.appcache</p>

<pre><code>CACHE MANIFEST
# 91ccff4f438451ad735c534b974c29e2ff1b08a9da4e71f928b5fc2f4ba6bd02
/assets/app-437607bb972a49c7922a504cfe02226a.css
/assets/app-7c794995cb685c8412ee2f1facea67e3.js
/fonts/fontawesome-webfont-311.ttf
/fonts/fontawesome-webfont-311.woff
/images/wripe114s.png
/images/dropbox_icon128.png
/images/wripe400s.png
/images/wripe-top880.png
/images/masuidrive64.jpg

NETWORK:
*
</code></pre>

<p>HTML部</p>

<pre><code>:html:
&lt;!DOCTYPE html&gt;
&lt;html lang="en" manifest="application.manifest" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"&gt;
&lt;head&gt;
....
</code></pre>

<p>Application Cacheでは、コメントも含めマニフェストファイルが１文字でも変更されるとキャッシュが破棄され、ネットワークから最新のデータが読み込まれます。
このキャッシュの制御はJavaScriptから行う事が可能なのですが、iOS 6ではバグがあるようでJavaScriptからキャッシュの更新などが正しく行えないようです。</p>

<p>またリソースの変更後にマニフェストファイルを更新しても、その変更が反映されるのは次回の読み込み時になります。そのため、更新頻度の高いファイルをキャッシュする用途にはあまり向きません。</p>

<p>wri.peでは、RailsのAssets Pipelineという機能を使い、JavaScriptとCSSをそれぞれ一つのファイルにまとめることで、ファイルの読み込み回数を減らし、表示を高速化しています。</p>

<p>実際に読み込み時間を比較してみます。赤い縦の線が、大体画面に表示される時間だと思ってください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/07/noncache.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="aligncenter size-large wp-image-606" alt="noncache" src="/wp-content/uploads/2013/07/noncache-1024x250.png" width="1024" height="250" srcset="/wp-content/uploads/2013/07/noncache-1024x250.png 1024w, /wp-content/uploads/2013/07/noncache-300x73.png 300w, /wp-content/uploads/2013/07/noncache-207x50.png 207w, /wp-content/uploads/2013/07/noncache.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/07/cached.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="aligncenter size-large wp-image-607" alt="cached" src="/wp-content/uploads/2013/07/cached-1024x256.png" width="1024" height="256" srcset="/wp-content/uploads/2013/07/cached-1024x256.png 1024w, /wp-content/uploads/2013/07/cached-300x75.png 300w, /wp-content/uploads/2013/07/cached-207x51.png 207w, /wp-content/uploads/2013/07/cached.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<p>キャッシュのない状態では1,150ms、キャッシュありでは200msほどになります。</p>

<p>テストでは、回線が高速なため、思ったよりも差が出なくなっていますが、スマホなどでキャッシュなしの場合には、これより数倍遅くなる事が多いと思われます。キャッシュありの場合では回線速度に依存せず、安定して高速な読み込みが可能です。</p>

<p>また、Application Cacheにキャッシュされているファイルは、ネットに繋がっていない状態でも読み出すことができます。
試しにPCをネットから切り離すか、iPhone/Androidをフライトモードにして、https://wri.pe/app にアクセスしてみてください。全てのファイルがキャッシュから読み込まれるため、ネットに繋がっていない状態でも同じように表示されるでしょう。</p>

<p>ただしメモ帳のデータはApplication Cacheには入っていないので、本来であればオフライン時に読み込むことはできません。しかしそれらの情報はまた別の方法でキャッシュしているため、オフライン状態でもメモ一覧が表示されるのです。</p>

<h2>次回予告</h2>

<p>今回はApplication Cacheを使い、各種ファイルの読み込みを高速化する手法を取り上げました。</p>

<p>wri.peでは、メモ帳データのようにAjax通信で取り出すためキャッシュしにくいデータも、localStorageを使いキャッシュしています。</p>

<p>次回はlocalStorageを用いたデータのキャッシュや、PC向けブラウザ、iPhone/Android、iPadなどのタブレットを一つのHTMLで対応する手法について解説します。</p>

<p>「<a href="https://html5experts.jp/masuidrive/807/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5でサイトを高速化─wri.peで学ぶ、イマドキのWebアプリの作りかた（後編）</a>」に続きます。</p>
]]></content:encoded>
			<wfw:commentRss>/masuidrive/594/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[イマドキのWebアプリの作りかた]]></series:name>
	</item>
	</channel>
</rss>
