<?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>吉川 徹 &#8211; HTML5Experts.jp</title>
	<atom:link href="/yoshikawa_t/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の過去から現在・未来まで！エバンジェリストたちが語る、最先端Web技術の世界</title>
		<link>/yoshikawa_t/25150/</link>
		<pubDate>Fri, 16 Mar 2018 01:00:13 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PWA]]></category>
		<category><![CDATA[Web Authentication]]></category>
		<category><![CDATA[Web Payments]]></category>
		<category><![CDATA[Web Share API]]></category>
		<category><![CDATA[WebAssembly]]></category>
		<category><![CDATA[WebVR]]></category>
		<category><![CDATA[WebXR]]></category>

		<guid isPermaLink="false">/?p=25150</guid>
		<description><![CDATA[連載： Webの未来を語ろう 2018 (1)HTML5 Experts.jp 副編集長兼エキスパートの吉川です。昨年好評だった「Webの未来を語ろう」企画を2018年もやります！ 今回はパネルディスカッション形式で、H...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/future-of-web-2018/" class="series-496" title="Webの未来を語ろう 2018" data-wpel-link="internal">Webの未来を語ろう 2018</a> (1)</div><p>HTML5 Experts.jp 副編集長兼エキスパートの吉川です。昨年好評だった「Webの未来を語ろう」企画を2018年もやります！</p>

<p>今回はパネルディスカッション形式で、HTML5 Experts.jp 編集長の<a href="https://html5experts.jp/shumpei-shiraishi/" data-wpel-link="internal">白石</a>が、ブラウザベンダーのGoogleのデベロッパーアドボケイトの<a href="https://html5experts.jp/agektmr/" data-wpel-link="internal">えーじさん</a>、 Microsoftのエバンジェリスト<a href="https://html5experts.jp/osamum_ms/" data-wpel-link="internal">物江さん</a>をお迎えして、興味深いお話を多数お聞きしました。</p>

<p>会場も交えたトークは、今後のWeb業界の動向を追いかける上で、重要な内容となっているので、ぜひ読んでみてください！</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5426.jpg" alt="" width="640" height="447" class="alignnone size-full wp-image-25186" srcset="/wp-content/uploads/2018/02/IMG_5426.jpg 640w, /wp-content/uploads/2018/02/IMG_5426-300x210.jpg 300w, /wp-content/uploads/2018/02/IMG_5426-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>2017年のWebで印象に残ったことは？</h2>

<p><b>白石</b>: まずは簡単な自己紹介と、2017年のWebで印象に残ったことを教えてください。</p>

<p><b>えーじ</b>: えーじです。Googleでデベロッパーアドボケイトをしています。もともとは、Google Chromeのアドボケイトという位置付けでしたが、最近はもっと広くなって、Web全体のアドボケイトを担当しています。
特にChromeだけの話に限らず、Web全般について話をしていますね。これには、我々のチームの理想として、<strong>Webすべてに貢献していこう</strong>という想いがあります。</p>

<p>2017年で印象に残ったことは、<strong>SafariがService WorkerとPayment Requestに対応すると表明したことがすごく意義深い</strong>と思っています。</p>

<p><b>物江</b>: 物江と申します。Microsoftでエバンジェリストをしています。以前はWebに軸足を置いていたんですが、現在はWebだけに限らずISV(Individual Software Vendor)、独立してサービスや製品を提供しているパートナーさん向けに様々な技術の啓発を行なっています。Webについては、個人的なものも含めていろいろ活動しています。</p>

<p>2017年に印象に残ったことは、<strong>WebAssemblyやPWA（Progressive Web Apps）などについて、ブラウザベンダーがきちんと足並みを揃えて、仕様を策定するようになった</strong>ということですね。非常にいい流れになってきていると思います。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5445.jpg" alt="" width="640" height="447" class="alignnone size-full wp-image-25188" srcset="/wp-content/uploads/2018/02/IMG_5445.jpg 640w, /wp-content/uploads/2018/02/IMG_5445-300x210.jpg 300w, /wp-content/uploads/2018/02/IMG_5445-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>左から、日本マイクロソフト株式会社 物江修さん、Google デベロッパーアドボケイト えーじさん</strong></span></p>

<p><b>白石</b>: 皆さん、ありがとうございます。ついでに私の2017年で印象に残ったこともお話ししておくと、個人的には<a href="https://dev.to/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">dev.to</a>や日本経済新聞社の<a href="https://www.nikkei.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">日経電子版</a>が爆速だったという、そういう事例が出てきたのは印象的だったなと思います。裏側でHTML5やWebの最先端技術とか、そういったものを使って1段階上のレベルの速さを実現している。</p>

<p>Webプラットフォームベンダーやコミュニティの皆さんの啓蒙活動などもあって、PWAをはじめとしたWeb技術だとかパフォーマンスだとかが、ビジネス上も重要であるというところも浸透してきている。その結果として、Webプラットフォームの機能がフル活用されつつ、パフォーマンスというところに影響がでた良い例かなと。</p>

<p>今回は、Webの過去・現在・そして未来を語るという構成で進めてみたいと思います。</p>

<h2>イントロダクション:HTML5は世界を変えたのか？</h2>

<p><b>白石</b>: 2017年以前のWebを振り返ると、ブラウザ戦争などの分断化があって、そこからHTML5のムーブメントが起こり、Webの様々な仕様が生まれてブラウザに実装されました。</p>

<p>ただ、<strong>それら「HTML5」のムーブメントは世界を変えたんでしょうか？</strong>
これまであまり、そういう振り返りをしたことがなかったので、一度やってみたいなと思っていたんです。お二人はどうお考えですか？</p>

<p><b>物江</b>: そうですね、一般ユーザーの目からすると、確かにあまり変わっていないかもしれません。例えば、YouTubeのプレイヤーは、FlashからHTML5になりましたけど、変わったって気がつく人はあまりいませんよね。普通の人は、きっとまったく意識せずに使っている。HTML5でできたことは、とっくにFlashでもできていたわけで。</p>

<p>でも、開発者にとっては大きな変化がありましたよね。結局、開発者はみなHTML5を使っています。これはなぜかというと、HTML5がシンプルだからこそだと思うんですよ。</p>

<p>エキスパートの<a href="https://html5experts.jp/takehora/" data-wpel-link="internal">竹洞さん</a>がいいことを言っていたんですけど、Webが素晴らしく進化したのはKISSの原則(*1)のおかげといっていました。つまり、誰でも簡単に使えるからこそ普及した。わざわざFlashを使わなくても、Web標準技術だけを使えばいろんなことができるようになった。それによって作り手側の裾野が広がって、以前よりもリッチなコンテンツがたくさん出るようになってきたのかなと思います。</p>

<p>*1 … &#8220;Keep it simple, stupid&#8221; （シンプルにしておけ！この間抜け）、もしくは、&#8221;Keep it short and simple&#8221; （簡潔に単純にしておけ）という経験的な原則の略語。<a href="https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wikipedia</a></p>

<p><img src="/wp-content/uploads/2018/02/IMG_5433.jpg" alt="" width="640" height="422" class="alignnone size-full wp-image-25189" srcset="/wp-content/uploads/2018/02/IMG_5433.jpg 640w, /wp-content/uploads/2018/02/IMG_5433-300x198.jpg 300w, /wp-content/uploads/2018/02/IMG_5433-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>えーじ</b>: ぼくも、世界は変わったと思います。やっぱりHTML5でWebを変えようっていうムーブメントがあったこと、それ自体が良かったと思うんですよね。良い意味でのブラウザ間の競争が起きて、どんどん新しい提案がなされて、共通して使えるものがどんどん生まれていった。</p>

<p>ちゃんと数えたことないですが、HTML5の機能でみんな当たり前に使うようになったものっていっぱいあると思うんですよ。例えば、CSS3で角丸を使うっていうのももう当たり前にみんなやっているし、それが動かないブラウザはほぼ、ない。そういうものが当たり前に使えるようになったっていうのは、一昔前からすると全然状況は異なっている。そういう意味では、相当変わったと思います。</p>

<p><b>白石</b>: そういえば、元Mozilla Japanの浅井智也さんに以前教えてもらったんですが、Web関連技術を全部まとめた図があるんです。これ、曼荼羅図みたいな感じなので、「Web曼荼羅」なんて呼ばれているそうです(笑)。</p>

<p>HTML5とその関連技術（<a href="https://dynamis.github.io/webapi.link/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webapi.link</a>）
<img src="/wp-content/uploads/2018/01/webtechnologies.jpg" alt="" width="640" height="360" class="aligncenter size-full wp-image-25159" srcset="/wp-content/uploads/2018/01/webtechnologies.jpg 640w, /wp-content/uploads/2018/01/webtechnologies-300x169.jpg 300w, /wp-content/uploads/2018/01/webtechnologies-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>こうして考えると、HTML5のムーブメントはたくさんのものを生み出しましたねえ。一般のユーザーからはあまり変わってないように見えても、「それは時間をかけて変わっているから」という面もありそうですね。</p>

<p><b>えーじ</b>: はい、そして、これだけのものがたくさん生み出された結果、Webはアプリケーションプラットフォームになった。それが、HTML5以前との大きな違いだと思いますね。</p>

<h2>Webは難しすぎる─Webプラットフォームの現状と課題</h2>

<p><b>白石</b>: では、iOSやAndroidといった他のプラットフォームとWebプラットフォームとを比較すると、Webはどういう立ち位置にあるとお考えですか？</p>

<p><b>物江</b>: Webプラットフォームは時間をかけてここまで成熟してきました。機能的な面では、他のプラットフォームにもひけをとらないというところまで来たんじゃないかと思います。</p>

<p>そして今、Progressive Web Apps (PWA)が浸透しつつあることが、今後のWebにとってはすごく意義のあることだと思っています。
<strong>PWAって、ある意味ひとつの理想の到達点だと思う</strong>んですよね。Javaなどが理想に掲げていた「Write Once, Run Anywhere」を、PWAは真の意味で実現するわけです。
これ、次のWindowsの大型アップデートでPWAがデスクトップアプリっぽく動いだり、Windowsストアからインストールできるように<a href="https://blogs.windows.com/msedgedev/2018/02/06/welcoming-progressive-web-apps-edge-windows-10/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なる</a>から言っているわけじゃないですよ(笑)。</p>

<p><b>白石</b>: そこでいつも言われているのが、Webアプリって動作が遅いんじゃないかってことですよね。</p>

<p><img src="/wp-content/uploads/2018/02/DSC09045.jpg" alt="" width="640" height="408" class="alignnone size-full wp-image-25192" srcset="/wp-content/uploads/2018/02/DSC09045.jpg 640w, /wp-content/uploads/2018/02/DSC09045-300x191.jpg 300w, /wp-content/uploads/2018/02/DSC09045-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>物江</b>: ただ、そうした問題についても、Webプラットフォームは長いこと取り組んでいて、もはやあまり問題にならないレベルじゃないかと思います。
ブラウザの実装という面でも、仕様の面でも、絶え間ない改善が続けられてきました。</p>

<p>仕様の面でそうした部分について期待できるのは、やはりWebAssemblyですね（筆者注: ブラウザが高速に実行可能な、ポータブルなバイナリ形式）。
昨年、モダンブラウザが同時にWebAssemblyのサポートを表明するということがありましたが、これでWebの速度はまた一段階アップすることが期待できます。</p>

<p>あとはやはりハードウェアの進歩が解決するものも多いでしょう。ちなみに、今のWeb技術の素晴らしいところは、ハードの性能に縛られた設計をしていないこと、どこでも同じWeb技術が動作することだとも思います。</p>

<p>例えば昔、貧弱だった携帯電話の機能に合わせた仕様で、HDMLやCHTMLというモバイル専門のタグがありましたが、今はもうほとんど残っていません。結局、性能に関わる問題は時間が解決してしまう部分も大きいんです。いま大切なことは、「いかに人間が作りやすいか、使いやすいか」が重要になってくるかなと思います。</p>

<p><b>えーじ</b>: ぼくも、パフォーマンス面は既にあまり課題とは考えていません。それよりぼくが課題だと感じているのは、開発者にとってのWeb技術はかなり複雑になってしまっていることです。</p>

<p>例えば「Extensible Web」というのを聞いたことがある方がいらっしゃると思います。これはWebの技術設計に対する、ここ数年における指針のようなもので、具体的には「標準としては、ユースケースを規定しない低レベル（低レイヤー）なAPIを提供する」というものです。</p>

<p>そうすることで、そうしたAPIを使用したハイレベルなライブラリだとかベストプラクティスが、開発者の手によって作られることを期待する。こうすることで、「ハイレベルだけど使われないAPI」が標準で規定されてしまうという問題を解決しようとしています。</p>

<p><img src="/wp-content/uploads/2018/02/DSC09086.jpg" alt="" width="640" height="423" class="alignnone size-full wp-image-25190" srcset="/wp-content/uploads/2018/02/DSC09086.jpg 640w, /wp-content/uploads/2018/02/DSC09086-300x198.jpg 300w, /wp-content/uploads/2018/02/DSC09086-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ただ今は過渡期なので、低レベルなAPIがどんどん増え、ライブラリも量産されていて、はっきり言って混沌としています。例えばService Workerもすごく低レベルなAPIで、実際に使うとなるとなかなか難しい。</p>

<p>そこにGoogleが<a href="https://workboxjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Workbox</a>というライブラリを出していたりするんですが、それを使うと簡単にServiceWorkerを使える一方で、ServiceWorkerもライブラリもどちらも学ばなくてはならない。</p>

<p>これがWeb Componentsなんかだと、仕様そのものがどんどん変わっていて、なかなか安定しない。<a href="https://www.polymer-project.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer</a>というライブラリを使おうにも、Polymerも仕様に合わせてどんどん変わっている。どの時点の仕様が正しいのか、検索したときにどれが最新なのかわかりづらい。そういうところが複雑で、開発者はみな苦労してるんじゃないかなと思います。</p>

<p>個人的には、以前Webpackにやられたことがありまして(笑) 。将来的にはES Modulesが広まれば、そういうビルドプロセスを経なくてもうまく動くようになるんだと思うんですが、今は過渡期として、やっぱりGulpなりWebpackなりRollupなりを使う必要がある。</p>

<p>ビルドツールも次々に生まれるし、フレームワークもそう。フレームワークとビルドツール、様々なライブラリも組み合わせなくちゃならないし、ベストプラクティスが簡単にはわからない。その辺がかなり複雑になっているなと感じています。</p>

<h2>各ブラウザベンダーのこれからの動向は？</h2>

<p><b>白石</b>: 
皆さんご自身の会社の立場からお聞きしたいなと思うんですけど、ブラウザベンダー各社がどういう想いで、どういう方向を向いて実装しているのかをお聞かせください。</p>

<p><b>えーじ</b>: 
会社（Google）としての方向性はもちろんですが、チーム内でWebに関する課題を共有して、その解決策を探ることは普段から行っています。</p>

<p>例えば、先ほど挙がっていたパフォーマンスを例に挙げましょう。</p>

<p>実はJavaScriptのパフォーマンスって、もうあまり問題にならなくなっているんです。むしろ悪いのはレンダリングの部分で、そこを速くするための努力はずっと続けています。</p>

<p>あと、ネットワークの遅延もすごく大きい要因なので、ServiceWorkerみたいな仕様を提供することで、スピードの課題に開発者自身が取り組みやすくする。</p>

<p>さらに、パフォーマンスに関するベストプラクティスを開発者の皆さんと共有するのも重要です。</p>

<p>このように、課題一つとってもたくさんのアプローチがある。こういう活動を、チーム一丸となって同時に取り組んでいるという状態ですね。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5473.jpg" alt="" width="640" height="417" class="alignnone size-full wp-image-25194" srcset="/wp-content/uploads/2018/02/IMG_5473.jpg 640w, /wp-content/uploads/2018/02/IMG_5473-300x195.jpg 300w, /wp-content/uploads/2018/02/IMG_5473-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>白石</b>: 
なるほど。ちなみにGoogleの中で、「今のWebはこういう課題があるね」みたいな、そういう話し合いっていうのはよくされるんですか？どんな議論がされてるのか興味があります。</p>

<p><b>えーじ</b>: 
はい、常にやってますね。世界中から集ってきた情報を、雑談ベースでやり取りするような感じです。</p>

<p>例えばこれからGoogleがインドでももっと使われるようにするためには、インドの市場を考えなきゃいけない。しかしインドは全然違う世界だと。</p>

<p>例えばネットワークにしても、今われわれが4Gは当たり前に使ってますけど、向こうの世界は2Gなんです。3Gですらない。なのに、何MBっていうファイルをダウンロードしないと見れないサイトっていうのはざらにあるわけですよ。そういったネットワーク環境の悪いところに対して、開発者の皆さんがサービスを提供しようと思った時にどうするのか。そういう課題がインドに進出しようと思っているチームから上がってきたりします。</p>

<p>他には例えば最近は、アクセシビリティにもかなり力を入れていたりもしますね。アクセシビリティに強く関心のある人たちがチームに入ったことで、Webのアクセシビリティをもっと良くするための話し合いや仕様の提案なども活発に行なっています。</p>

<p><b>物江</b>: 
Microsoft Edgeは、相互運用性とセキュリティ、アクセシビリティとパフォーマンスの4つが何においても優先されています。</p>

<p>例えば相互運用性でいうと、 <code>-webkit-text-stroke</code> というベンダープリフィックスがあります。これ、以前はWebKit系のブラウザでしか動かなかったんですが、現在はEdgeでも開発中なんです。多くのサイトで使われているような機能については、全部同じように動くようにするというのを優先的にやっています。</p>

<p>アクセシビリティに関しては、画面に表示されるすべてのテキストについて、スクリーンリーダーのような外部のプログラムを呼び出せるような仕組みが、WindowsにはOSレベルで入っています。それを使って、アクセシビリティを強化するような仕組みがEdgeに入っていたりしますね。</p>

<p>パフォーマンスについては、Chakra（EdgeのJavaScriptエンジン）のパフォーマンスアップを継続的に行っています。特に、こないだのアップデートでようやくブラウザ内部のリファクタリングが終わったようで、Edgeが出た頃からのパフォーマンスでいうと、3～4倍速くなってます。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5440.jpg" alt="" width="640" height="428" class="alignnone size-full wp-image-25195" srcset="/wp-content/uploads/2018/02/IMG_5440.jpg 640w, /wp-content/uploads/2018/02/IMG_5440-300x201.jpg 300w, /wp-content/uploads/2018/02/IMG_5440-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>白石</b>: 
リファクタリングっていうのは、Internet Explorerから引きずっているコードがかなりあるのを書き直すって話ですよね。それが行われているって話はだいぶ前に聞いていましたが、ついに終わったんですね。</p>

<p><b>物江</b>: 
はい、ほぼ全部終わったんじゃないかと。もともとEdgeのレンダリングエンジンってTrident（IEのレンダリングエンジン）から派生したものなので、20年以上前のものということで、根っこの部分で仕様が古い部分があったんですよ。その修正がようやく終わったという感じです。これから先は、Edgeの開発はどんどん加速していくんじゃないかと期待しています。</p>

<p>あとは、やはり2000年代と比較すると、ユーザーの意見をより開発に取り入れようという姿勢が顕著になったかと思います。Windowsをお使いの方はわかると思うんですが、<a href="https://www.microsoft.com/ja-jp/store/p/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%90%E3%83%83%E3%82%AF-hub/9nblggh4r32n" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">フィードバックHub</a>というのがありまして、そこでバグの報告だとか、追加してほしい機能をリクエストできるんですよ。そのリクエストのベット数が多いと優先度があがっていって、対応されるというようになっています。</p>

<p><small></p>

<p>各種ブラウザのステータスが確認できるサイト</p>

<ul>
<li><a href="https://developer.microsoft.com/en-us/microsoft-edge/platform/status/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Microsoft Edge</a></li>
<li><a href="https://www.chromestatus.com/features" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome</a></li>
<li><a href="https://webkit.org/status/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webkit</a></li>
</ul>

<p></small></p>

<h2>注目のWeb最新技術を一挙に解説！Web Payments、WebVR、AMP、PWA、WebAssembly&#8230;</h2>

<p><b>白石</b>: 
ではここからは、注目のWeb最新技術についていろいろお聞きしたいと思います。Web Payments、WebVR、AMP、PWA、WebAssemblyなどなど、仕様ごとに概要と現状をお話しください。</p>

<h3>Web Payments</h3>

<p><b>えーじ</b>: 
今までWebでお金を払うといったら、フォームを使ってクレジットカード番号を入れたりとか、どこかのサイトに飛んで、そこのサイトにあらかじめ保存してある支払い情報を使うといったことがほとんどだったと思います。Web Paymentsを使うと、ブラウザがネイティブで表示してくれるUIを使って支払いができるようになるというのが大きな特徴ですね。ちょっと見てもらうと、<a href="https://polykart.store/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PolyCart</a>というWeb Paymentsのデモサイトで確認することができます。</p>

<p><strong>Web Paymentsのデモサイト（PolyCart）</strong>
<img src="/wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a.png" alt="" width="640" height="521" class="aligncenter size-full wp-image-25171" srcset="/wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a.png 640w, /wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a-300x244.png 300w, /wp-content/uploads/2018/01/a6667251245e38bfbcf2b1aaac09926a-207x169.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ブラウザネイティブのUIを通じてクレジットカードの情報や、配送先、連絡先などの入力を促すことができます。そうして入力された情報はブラウザが記憶してくれるので、次からはクリックするだけで支払い情報を入力することができます。</p>

<p>もっとすごいのは、将来的には支払い方法を追加できるようになるんです。例えば、Apple PayやGoogle Payで支払うのも可能ですし、仮想通貨なども使えるようになるでしょう。</p>

<h3>WebVR</h3>

<p><b>物江</b>: 
以前から、「Web上でVRコンテンツを表示する」っていうのは、Three.jsなどを使って実現が可能でした。ではWebVRは何が違うかというとVRデバイスからのフィードバックを受けることができるんです。これによって、VRデバイスと深く連動したWebサイトを作ることができます。</p>

<p>それにWindows10だと、ネイティブでVRの環境をサポートしていて、WebVRに対応したWebサイトにいくと、自動的にVRゴーグル上で全画面表示してくれるようになっています。VRのビデオもそのまま見ることができるので、真の意味でシームレスにVRのコンテンツが提供できるようになっています。</p>

<p>個人的に楽しみなのは、VRをきっかけとして新しいUIが生まれてくることですね。既存のVRゴーグルを使ったことがある人はわかると思うんですけど、キーボードもマウスも何も使えないんです。そうすると新しいUIを考える必要があって、そこに新しい可能性を感じています。</p>

<p><b>えーじ</b>: 
ちなみに最近は<a href="https://github.com/mozilla/webxr-api" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebXR</a>っていうらしいですね。VR、AR、MRをコンセプトに入れた仕様を作ろうとしているという動きもありますね。</p>

<h3>AMP</h3>

<p><b>白石</b>: 
次はAMPですが、これについては既にたくさんの方がご存知でしょうから、簡潔に。主にモバイル環境で、Webページを素早く表示できるようにするための、HTMLのサブセットですね。</p>

<p><b>えーじ</b>: 
AMPの仕様自体もさることながら、AMPが基本的にWeb Componentsでできているのは興味深いです。Web Componentsの仕組みを使って独自のエレメントを定義していて、なおかつパフォーマンスも追求しているので、結果としてパフォーマンスのベストプラクティスの塊をWeb Components化したものになっている。大変面白いと思います。</p>

<h3>Progressive Web Apps</h3>

<p><b>白石</b>:
次は、恐らく今年最大の注目キーワードProgressive Web Appsですね。これは（ずっと啓蒙してきた）えーじさんに語っていただくしかないでしょう。</p>

<p><b>えーじ</b>: 
はい。とはいえPWAという言葉自体は、皆さんに意識してもらいやすくするためのマーケティング用語のようなもので、技術的な観点からはそれ自体意味がないと思っています。実際の中身はService WorkerだったりとかPush Notificationだったりとかそういう具体的な機能やAPIから構成されています。</p>

<p>日本でも、昨年後半くらいからPWAが注目されはじめました。さっきのdev.toとか日経電子版とかも、PWAの構成要素を利用することで高速化が実現できたと。PWAの中のひとつひとつの技術要素をうまく使うとここまで速くできるんだよ、といういい例ができたなと思っています。</p>

<p><img src="/wp-content/uploads/2018/02/DSC09088.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-25196" srcset="/wp-content/uploads/2018/02/DSC09088.jpg 640w, /wp-content/uploads/2018/02/DSC09088-300x193.jpg 300w, /wp-content/uploads/2018/02/DSC09088-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b>白石</b>: 
ちなみに、個人的にはPWAっていまいち意味がわからないな、と思ってて。なにが「プログレッシブ」なんでしょうか？プログレッシブって、「だんだん（進化する）」って意味ですよね。</p>

<p><b>えーじ</b>: 
PWAにおける「プログレッシブ」には2つ意味があります。</p>

<p>1つは昔から言われているプログレッシブ・エンハンスメントです。古いブラウザでも見ることができる基本的なWebサイトをまずは作って、そこに、新しいブラウザで使える機能を足していくという考え方。そうすれば、クライアントの環境を最大限活かすことができます。</p>

<p><b>白石</b>: 
では、Service Workerが使えるブラウザだったらオフラインという機能が使えるけど、そういう機能が使えないブラウザにも同等のものを提供する。既存のサイトにあとからその機能を提供することも割と簡単にできますよっていうそういう思いを込めたものということですね。</p>

<p><b>えーじ</b>: そうです。もう1つが、今あるサイトに機能を付け加えていくことで、徐々にPWAに近づけていけるという意味です。PWAのためにサイトを一から作り直すとか、大幅な改修を行う必要はない。既存のサイトを徐々に拡張していけばいいんです。</p>

<p><b>白石</b>: 
なるほど、そういう意味合いだったんですね。ちなみにPWAの中では、Service Workerが代表的なAPIですよね。他には<a href="https://developers.google.com/web/fundamentals/web-app-manifest/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web App Manifest</a>とか、<a href="https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Push Notification</a>とかでしょうか。</p>

<p><b>えーじ</b>: 
そうですね。ちなみに、PWAのウリの一つに、OSのホーム画面にアイコンを追加できるというのがあるんですが、以前はただのWebアプリへのショートカットでした。でも今は違います。PWAをホーム画面に置く際、アプリのパッケージを動的に生成してインストールするので、OS上の扱いはネイティブアプリとほとんど変わりないんです。なので、プッシュ通知のオン／オフをアプリごとに設定できたり、ネイティブアプリでしかできなかったことがPWAでも同様に行えます。</p>

<h3>WebAssembly</h3>

<p><b>白石</b>: 
次はWebAssembly、物江さんご説明お願いします。</p>

<p><b>物江</b>: 
WebAssemblyは、Webブラウザ上で非常に高速に動作させることができる、デバイスに依存しないバイナリ形式です。現在は用途がある程度限られていて、DOMを操作することなどはできませんが、CPU依存の計算処理などは極めて高速に動作させることができます。
<a href="https://developer.mozilla.org/ja/docs/Mozilla/Projects/Emscripten" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Emscripten</a>などのツールを使うと、C/C++で作られたものをWebAssemblyに変換できるので、C/C++で書かれたゲームなどをWebAssemblyに移植することも比較的容易です。また現在はまだ開発中ではありますが、MonoがC#からWebAssemblyをコンパイルする<a href="https://github.com/lrz/mono-wasm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mono-wasm</a>であったり、マイクロソフトも実験プロジェクトとしてWebAssemblyを介してWebブラウザー上でC#とRazorを走らせるWeb UI framework  <a href="https://blogs.msdn.microsoft.com/webdev/2018/02/06/blazor-experimental-project/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Blazor</a>を開発していたりします。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5499.jpg" alt="" width="640" height="387" class="alignnone size-full wp-image-25198" srcset="/wp-content/uploads/2018/02/IMG_5499.jpg 640w, /wp-content/uploads/2018/02/IMG_5499-300x181.jpg 300w, /wp-content/uploads/2018/02/IMG_5499-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>（ここで会場からエキスパートである<a href="https://html5experts.jp/technohippy/" data-wpel-link="internal">あんどうやすしさん</a>から質問）</p>

<p><b>あんどうやすし</b>: 
現在のWebAssemblyって結局計算することしかできないじゃないですか、DOMもいじれないし、JavaScriptのAPI呼び出しも直接は行えない。今後もそれは変わらないんでしょうか。特にデータの渡し方に結構制限があって、使い勝手がいいものにするには難しいなと感じています。SharedArrayBufferという仕組みで一次元配列の共有はありますが、それも使いづらいし…。</p>

<p><b>物江</b>: 
それは、今の段階ではまだなんとも言えないですね。</p>

<p><b>えーじ</b>: 
ちなみにSharedArrayBufferはこないだのメルトダウンとスペクター(*2)の影響で機能が停止になります。</p>

<p><b>白石</b>: 
ありゃ、まさかそんなところにまで影響及ぶとは…(笑)。</p>

<p>*2 … CPUでの投機的実行という高速化プロセスを悪用した脆弱性</p>

<h3>Web Share API</h3>

<p><b>白石</b>: 
他には、注目のAPIとかはありますか？</p>

<p><b>えーじ</b>: 
最近追加されようとしている新しい機能に<a href="https://developers.google.com/web/updates/2016/09/navigator-share" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Share API</a>というのがあります。</p>

<p>Androidのインテントをご存知の方だったらすぐ分かる機能ですが、例えばあるサイトを「FacebookやTwitterでシェアしたい」という場合に、Web Share APIを使うと簡単に外部アプリを呼び出すことができます。</p>

<p>逆に、自身のWebアプリを「シェアする先のアプリ」として使ってもらうようにすることもできます。それが<a href="https://github.com/WICG/web-share-target" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Share Target API</a>というものです。</p>

<p>Web Share APIは既に使えるんですが、Web Share Target APIは、現在限られたサービスにしか開放されていません。このように、Chrome では一部のドメインに先行してWebプラットフォームの機能を試してもらうオリジントライアルというものをやっているのですが、現在TwitterのモバイルサイトがWeb Share Target APIを使えるようになっています。<a href="https://mobile.twitter.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mobile.twitter.com</a>で実際に試すことができますので、TwitterのPWAをまだ試したことがない方は、AndroidのChrome betaチャネルか、devチャネルを使ってインストールしてみてください。何かシェアしようとしたときに、TwitterのPWAが候補として出てきます。</p>

<h3>Web Authentication</h3>

<p><b>白石</b>: 
Web Authenticationというのもあると聞きました。</p>

<p><b>えーじ</b>: 
Web Authenticationは、実はEdgeでもう使えるんです。仕様がちょっと古いので、APIが全く異なりますが、<a href="https://github.com/MicrosoftEdge/webauthn-polyfill/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polyfill</a>もあります。Web Authenticationをひとことでいうと、セキュリティキーなどを用いた多要素認証を標準技術で扱えるようにするものです。顔認証や指紋認証と組み合わせれば、安全性の高いログインの敷居はぐっと下がると思います。</p>

<p><b>物江</b>: 
<a href="https://fidoalliance.org/?lang=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FIDO Alliance</a>という標準化団体があるんですけど、そこで生体認証などのもっと広い話をしています。既にWindowsだとWindows Helloという生体認証の仕組みがFIDOの標準で作られていますね。</p>

<p><b>えーじ</b>: 
FIDOのWeb版がWeb Authenticationになるわけです。Web Authenticationの実装はこれからどんどん出てくるでしょう。Mozillaさんもこないだ実装を開始しましたし、Chromeもそろそろ入ってくるのかなと思います。</p>

<p><b>白石</b>: 
そうすると、もしかしたら今年はWebサイトで指紋認証とか顔認証とかが一般的になってくるという可能性があるってことですかね。</p>

<p><b>えーじ</b>: 
そうですね。どの認証方式を使えるようにするかっていうのは、順番に1つずつ入れていくという話らしいので、まずはセキュリティーキーから利用できるようになって、そのうちNFC、指紋認証ができるようになっていくようです。徐々にそういったものが実装されていけば、本当にパスワードを覚えなくてもいい世界っていうのが実現できるかもしれないので、すごく楽しみにしています。</p>

<p>ちなみに、<a href="https://developers.google.com/web/fundamentals/security/credential-management/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Credential Management API</a>というIDとパスワード、いわゆる共通鍵認証をする仕様があるんですが、それとAPIのネームスペースが同じになるので、共通のAPIを使うことになります。まったく別々だった仕様が一緒になるというのも個人的には面白いと感じています。</p>

<p><img src="/wp-content/uploads/2018/02/IMG_5443.jpg" alt="" width="640" height="413" class="alignnone size-full wp-image-25199" srcset="/wp-content/uploads/2018/02/IMG_5443.jpg 640w, /wp-content/uploads/2018/02/IMG_5443-300x194.jpg 300w, /wp-content/uploads/2018/02/IMG_5443-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>エキスパートたちが見据えるWebの未来について</h2>

<p><b>白石</b>: 
最後にWebの今後について感じていることをお聞かせください。</p>

<p><b>えーじ</b>: 
ぼくらブラウザベンダーは、「こうなるといいな」というものをいろいろ作ってるんですけど、それはブラウザベンダーが勝手にやってるわけじゃなくて、開発者の皆さんの声とか、こういうWebがいいという声をもとにやっているので、フィードバックをできるだけいただいたほうが、より皆さんの理想としているWebができると思っています。</p>

<p>フィードバック方法にも今はいろいろあって、GitHub上で管理されている仕様にIssueを立てるっていうのも一つの方法ですし、一番簡単な方法です。それすらめんどくさいということであれば、ぼくに直接言っていただくとかでも構いません(笑)。そんな感じで、開発者の皆さんと一緒にWebを盛り上げていけたらいいなと思います。</p>

<p><b>物江</b>: 
個人的な思いとしては、今非常にWebって良い方向に進んでいると思っています。（お互いを傷つけ合うような）ブラウザ戦争は終わりました。今は良い意味でお互いに競争し合ったり、歩調を合わせてWebを良いものにしていこうという動きが主流になりつつ会って、とても好ましく感じています。今後もそれが続いていって、Webのテクノロジーの活用範囲が広がればいいなと思っています。</p>

<p><b>白石</b>: 
皆さん、本日は様々なお話をお聞かせいただき、ありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[Webの未来を語ろう 2018]]></series:name>
	</item>
		<item>
		<title>ブラウザベンダーとエキスパートが語るWebテクノロジーの未来【後編】──Webの未来を語ろう 2017</title>
		<link>/yoshikawa_t/22014/</link>
		<pubDate>Thu, 09 Feb 2017 01:00:54 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Progressive Web Apps]]></category>

		<guid isPermaLink="false">/?p=22014</guid>
		<description><![CDATA[連載： Webの未来を語ろう 2017 (4) 特別企画「Webの未来を語る」のエキスパート、ブラウザベンダー対談の後編です。前編はこちらから。今年1年のWeb業界を占うということで、エキスパート、ブラウザベンダーの方々...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/future-of-web-2017/" class="series-426" title="Webの未来を語ろう 2017" data-wpel-link="internal">Webの未来を語ろう 2017</a> (4)</div><p><style>
b.speaker {
  font-weight: bold;
}
b.speaker::after {
  content: ": ";
}
</style>
特別企画「Webの未来を語る」のエキスパート、ブラウザベンダー対談の後編です。前編は<a href="https://html5experts.jp/yoshikawa_t/21986/" data-wpel-link="internal">こちら</a>から。今年1年のWeb業界を占うということで、エキスパート、ブラウザベンダーの方々に「Webの未来」について、がっつりお話を聞いてきました。</p>

<h1>どこから、どこまでが Progressive Web Apps？</h1>

<p><b class="speaker">白石</b>
PWAは、すごい重要なキーワードだと思いますが、どこまでがPWAなんですかね？ 厳密に定義付けする必要があるとも思わないんですが、モバイルのホーム画面にアイコンを追加するとか、プッシュができますというところまではPWAなんだろうと思うんですが、BluetoothだとかUSBだとかはPWAと言えるのかどうか。</p>

<p><b class="speaker">えーじ</b>
一応基準として挙げられるものは2つあって、1つは<a href="https://developers.google.com/web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Fundamentals</a>というサイトに<a href="https://developers.google.com/web/progressive-web-apps/checklist" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">チェックリスト</a>をのせています。あまり明確に定義するのはやめようという話は当初ありましたが、ただそれだとちょっと曖昧すぎるということで、いくつかポイントを挙げてチェックリストになっています。チェックリストの中身は、今後増える可能性はあります。</p>

<p>もう1つは、「Lighthouse」というものを<a href="https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chromeの拡張機能</a>と<a href="https://www.npmjs.com/package/lighthouse" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">node module</a>で出しています。拡張機能のほうを使うと、見ているページのスコアを出しくれるというものです。今後これがDevToolsにも入る予定で、AuditでWebサイトの分析をユーザーエクスペリエンス視点でやるという感じになります。その評価基準のひとつとして、PWAの対応状況をスコアリングしてくれるようになります。</p>

<p><b class="speaker">矢倉</b>
そういえば、<a href="https://developer.chrome.com/devsummit/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome Dev Summit</a>のセッションの中のひとつで、<a href="https://www.youtube.com/watch?v=U52dD0tegsA&amp;t=5m9s" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chromeチームの定義として「Webのエクスペリエンスを根本的に向上させるもの」</a>という風に紹介されていました。ここで言うエクスペリエンスは何かというと、速くて、信頼できて、ユーザーとのエンゲージメントもある。それでいて、モバイル向けサイトとPWAと別に作るんじゃなくて、<strong>ひとつのドメインでWebのエクスペリエンスを向上させるのがPWA</strong>だよ、と説明していました。<strong>使う技術スタックだけではPWAじゃないというとこに踏み込んだ</strong>なっていう印象がありますね。</p>

<p><b class="speaker">えーじ</b>
<strong>スピード周りもすごく重要で、そういう意味ではHTTP/2だとかHTTPSへの対応もPWAの要素のうちのひとつ</strong>と数えるといえば数えられます。モジュールローディングなどで、どうやってモジュールをいかに早くロードするか、などもそうですね。そこはノウハウとかもこれからどんどん溜まっていって、そのあたりが今一番面白いところだと思うんですけど、これから1年ぐらいでおそらくいろいろ整備されてくるかなと思います。</p>

<p><b class="speaker">白石</b>
WHATWGのローダーみたいな？</p>

<p><img src="/wp-content/uploads/2017/01/038994f99bc81d0cb4aaf0d3a5d57424.jpg" alt="" width="640" height="419" class="aligncenter size-full wp-image-22054" srcset="/wp-content/uploads/2017/01/038994f99bc81d0cb4aaf0d3a5d57424.jpg 640w, /wp-content/uploads/2017/01/038994f99bc81d0cb4aaf0d3a5d57424-300x196.jpg 300w, /wp-content/uploads/2017/01/038994f99bc81d0cb4aaf0d3a5d57424-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">矢倉</b>
それよりかはどちらかというと、フレームワークとかのほうになるのかなって思います。Webpack 2のtree-shakingとか。仕様は実装を待たないといけないので、いま手をつけ始めやすいところという意図なのかなと。</p>

<p><b class="speaker">白石</b>
少し前に公開した<a href="https://html5experts.jp/shumpei-shiraishi/21837/" data-wpel-link="internal">Angularのインタビュー</a>で、結論のところでAngularも半年ごとにメジャーバージョンアップしていって、もしかしたら後方互換性のことは気にせずにやっていくかもしれないと。なので、Webの進化にどんどん追随していくという感じで、Webの進化とAngularの進化が両輪で進んで行くみたいな感じになるのかな、っていう形で終わったんですけど、そんな感じで捉えていけばいいんでしょうか？</p>

<p><b class="speaker">えーじ</b>
それとはあんまり関係ないかな（笑）。一般的なエコシステムというか<strong>プラットフォーム（基盤）が動いていく仕組みとして、Webの場合どんどん変えていく、進んでいる</strong>っていうことなのかなと思います。Angularもそれに追随するためにそういう動きをとっていると捉えれば、<strong>当然開発者側もそういう体制をとっていく必要がある</strong>なと僕はすごく感じます。</p>

<p>なので、受託開発で年に1回大きく予算を取って開発するというよりは、ちゃんと継続的に開発していくような体制をとっていったほうがいいんじゃないかなと思いますね。</p>

<h1>Progressive Web Appsは、完全にモバイルアプリとしても動くようになる</h1>

<p><b class="speaker">えーじ</b>
ひとつ面白いのは、こないだのChrome Dev Summitで発表したんですが、<strong>PWAをホーム画面に追加するだけじゃなくてバイナリにもなります</strong>。apkファイル（Androidのアプリケーションパッケージ）ですね。</p>

<p><img src="/wp-content/uploads/2017/01/87f58726130db708d076eca38744285f.jpg" alt="" width="640" height="430" class="aligncenter size-full wp-image-22049" srcset="/wp-content/uploads/2017/01/87f58726130db708d076eca38744285f.jpg 640w, /wp-content/uploads/2017/01/87f58726130db708d076eca38744285f-300x202.jpg 300w, /wp-content/uploads/2017/01/87f58726130db708d076eca38744285f-207x139.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
それって何か利点があるんですか？</p>

<p><b class="speaker">矢倉</b>
ランチャーの中に入ります。</p>

<p><b class="speaker">えーじ</b>
リソースの管理とかもアプリと同様にできるので、ユーザーからしてみると完全にアプリだと思って使うことができます。</p>

<p><b class="speaker">矢倉</b>
設定の中のアプリ一覧の中にリストされたりとかしますね。</p>

<p><b class="speaker">白石</b>
なるほど。Androidだと、このアプリはSDカードにデータを保存するとかそういう設定ができますよね。そういうこともできるようになるのかな？</p>

<p><b class="speaker">えーじ</b>
ちょっとそこまでは把握していないですけど、できるんじゃないですかね。</p>

<p><b class="speaker">白石</b>
完璧なアプリ扱いですね。それは面白いな。</p>

<h1>Firefox、EdgeのProgressive Web Apps対応状況は？</h1>

<p>あとMozillaさんにも聞きたいんですけど、Android版のFirefoxとかでPWAはやっているんですか？</p>

<p><b class="speaker">浅井</b>
やっていますよ。PWAをサポートしますっていうのは用語の出来た <a href="https://blog.mozilla.org/futurereleases/2015/11/17/extending-the-webs-capabilities-in-firefox-and-beyond/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2015 年から表明していて</a>、アプリをホーム画面に追加するなど一通りできるようになってきていますが、フルスクリーンで起動するオプションへの対応などが抜け落ちていたり、細部でまだChromeさんに追いついていないところがあるのが正直な状況ですね。</p>

<p>何で遅れてるいるかについては、Firefox OSをやめてMozilla内で開発体制を切り替えていた影響もあります。Firefox OSをやめた理由は、純粋にWeb技術で全てを実現可能にしましょうって自分たちでリードして標準も作っていったんですが、誰も同じ標準を実装してくれない（笑）。<strong>それが単独実装の独自仕様状態になってしまなら、それはよくないエコシステム</strong>、もうひとつのWebベースのネイティブみたいになってしまうと良くないのでやめました。</p>

<p><strong>スマートフォンだけじゃなくてもっと多くのものがインターネットに繋がる時代なので、その時代に対応していくため力点を変えましょう</strong>と、スマートフォン向けのFirefox OSに注力していたモバイル周りの開発体制を切り替えている中で、PWA対応も一部遅れてしまいました。</p>

<p>よく見てる人はわかるかも知れませんが、Android版Firefoxは機能面の追加が少し緩やかな時期があります。ちょっと遅れているところはありますが、PWA対応も普通に入ってくると思ってください。Service Worker対応やホーム画面にアイコンを追加するメニューなどが(一部は開発版だけに)入っている通りです。</p>

<p><img src="/wp-content/uploads/2017/01/30de9eab044fbed0c1f6596c4a954da9.jpg" alt="" width="640" height="416" class="aligncenter size-full wp-image-22052" srcset="/wp-content/uploads/2017/01/30de9eab044fbed0c1f6596c4a954da9.jpg 640w, /wp-content/uploads/2017/01/30de9eab044fbed0c1f6596c4a954da9-300x195.jpg 300w, /wp-content/uploads/2017/01/30de9eab044fbed0c1f6596c4a954da9-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
Firefoxでホーム画面にアイコンを追加して、それを押すとFirefoxで起動するんですか？</p>

<p><b class="speaker">浅井</b>
今は、Firefoxの新しいタブとして起動するっていう形です。Chromeだとオプション次第でフルスクリーンで起動できます。もう一つChromeとの違うのはFirefoxの場合は、今はアプリマニフェストがあるとメニューに「ホーム画面に追加」が出てきます。Chromeの場合には、何度も使っていたり、一週間の別の日に2回以上同じサイトを訪問すると勝手にバナーが出てきて、インストールしませんかと聞いてきますが、それをFirefoxでやるかどうかは未定です。</p>

<p><b class="speaker">白石</b>
プッシュ通知はどうですか？</p>

<p><b class="speaker">浅井</b>
プッシュ通知は随分昔に実装してますね。</p>

<p><b class="speaker">矢倉</b>
Edgeは、どうなんでしょう？</p>

<p><b class="speaker">物江</b>
現在、実装中です。<strong>もしかしたら次のバージョンで入るかも？</strong></p>

<p><b class="speaker">浅井</b>
僕らとしては、みんなで同じようにPWAに対応していくというのはある意味コンセンサスを取りながら実装する取り組みのひとつだと思っています。APIレベルのものってプログレッシブに、使う使わないって判断を段階的にできるから、それぞれのペースで実装したらいいと。</p>

<p>それに対してWeb Assemblyは、JavaScript言語仕様が違うと構文エラーで全く動かなくなるのと同様、バイナリ形式は最初から全員で確実に統一することが必須になるため、自分たちがリードしている取り組みでも先行アナウンスなどはせず、何から何まで各社と同時に行う体制にしているんですね。この辺りは特に頑張って一緒にやることを重視している取り組みです。</p>

<h1>次世代ブラウザエンジンを作るMozillaのQuantumプロジェクト</h1>

<p><b class="speaker">浅井</b>
Firefox OSのときにAPIを作りまくっても、リードしても誰もついてこなくて悲しい思いをするってのはある意味反省点としています。特にハードウェア系のAPI、例えば加速度センサーとか近接センサーなどはAndroid版の初期から実装してましたが、そういう単独でのAPI先行実装は一段落しています。</p>

<p>どちらかというと今は<strong>パフォーマンスをすごく重要視</strong>していて、Web Assemblyもその一つですが、同時に<strong>そもそもAPIレベルじゃなくってブラウザエンジン自体のアーキテクチャ自体を大きく変える余地があるだろう</strong>と、GPUを使ったり、CPUのマルチコアを活かすといったところに注力して、ブラウザエンジンを次世代のアーキテクチャに置き換えていく動きをしているところです。</p>

<p><img src="/wp-content/uploads/2017/01/143e9ff84d5f7a7d0a67441524fb0ca4.jpg" alt="" width="640" height="420" class="aligncenter size-full wp-image-22050" srcset="/wp-content/uploads/2017/01/143e9ff84d5f7a7d0a67441524fb0ca4.jpg 640w, /wp-content/uploads/2017/01/143e9ff84d5f7a7d0a67441524fb0ca4-300x197.jpg 300w, /wp-content/uploads/2017/01/143e9ff84d5f7a7d0a67441524fb0ca4-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">矢倉</b>
Quantumですよね。</p>

<p><b class="speaker">浅井</b>
そうですね。<a href="https://dev.mozilla.jp/2016/11/a-quantum-leap-for-the-web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Quantumプロジェクト</a>と呼んでいますが、Mozillaでは珍しく一時的に社内Confidentialとされていて、話をまとめて決めてから大々的に発表したプロジェクトです。といっても数ヶ月後にはすぐ発表されたので、長い間秘密にしていたわけではないですが。</p>

<p><b class="speaker">えーじ</b>
これは、<a href="https://servo.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Servo</a>と関係あるんですか？</p>

<p><b class="speaker">浅井</b>
関係あります。Servoは何年も前からの取り組みなのですが、高速な並列処理を書きやすいのは勿論セグメンテーション違反などはコンパイル時にエラーとして検出でき、確実で高速な並列処理をガンガン実装できる新言語<a href="https://www.rust-lang.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rust</a>を作るレベルからブラウザエンジン自体のアーキテクチャまで、全てをイマドキに刷新した、新しいブラウザエンジンを実験的に開発してきたプロジェクトです。並列化大好きなインテルとかサムスンなども参加してくれました。</p>

<p>ただ、Servoというのはあくまで実験的なブラウザエンジンであり、本当にすべてのAPIとかすべてのブラウザ機能を実装することを目標にしているわけじゃないんですね。Servoで新しいアーキテクチャを確認して、検証されたアーキテクチャでうまくいくものを実際のユーザ向け製品であるFirefoxのコンポーネント単位で置き換えていくっていうのがQuantumプロジェクトです。<strong>Servoの成果をFirefoxに取り入れるっていうのがQuantum</strong>という関係です。</p>

<p>このQuantumプロジェクトでは例えば、レイアウトやCSSのスタイリング処理を高速化します。CSSのスタイリングってまずDOMツリーを使ってそれにCSSのルールを適用していくのですが、DOMツリーって要するにツリーだから、このサブツリーとこのサブツリーを並列処理できるっていうのは当たり前のデータ構造じゃないですか。</p>

<p>構造的に並列化が容易だっていうのは分かっているので、並列化しやすい言語とアーキテクチャを採用して作り直しました。よくブラウザが遅い原因にリフローとか挙げられますけど、そのリフロー時に発生する<strong>レイアウト処理時間の半分がスタイリングで、そのスタイリング処理が2倍、4倍とかいうオーダーで高速化します</strong>。</p>

<p>例えばこちらのビデオなどを見れば違いが分かります。</p>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ry_RktGLKq4" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>


<p>エフェクトが非常に滑らかになるデモ</p>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/u0hYIRQRiws" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>


<p>たくさんのオブジェクトを高fpsで描画するデモ</p>

<p>こういうのって、やっぱりこれまで十何年もつかっていたブラウザエンジンそのままじゃ難しくって、次の世代のブラウザエンジンを作ろうって取り組みがこのプロジェクトです。Mozillaは、今ここに一番注力しています。</p>

<p><strong>2017年の前半のうちに、今お見せしたスタイルのスタイリングが数倍早くなる実装がFirefoxに入るのを目標にしていたり、WebRenderと呼んでるものなどもなんとか形にしたい</strong>なと思っています。他にもネットワークの並列化とか、キャッシュをうまくするとか、そのあたりもQuantamプロジェクトで取り組んでいるところは、まだまだお楽しみにというところです。Mozillaはいま、APIとかよりエンジンの世代交代にエンジニアのリソースをがっつり割いてる感じです。</p>

<h1>Mozillaのビジョンは、ブラウザに限らずインターネットのオープン性や、それに触れるための機会をどこまでも広げること</h1>

<p><b class="speaker">白石</b>
Mozillaさんは、IoTとか、そちらのほうに注力しているというのは存じてますが、そういったあたり、Webブラウザがどこまで広がるのか、広げられるのかとか、そういったビジョンみたいなものをお聞きしたいですね。</p>

<p><b class="speaker">浅井</b>
単純にモバイルのスマートフォンだけに注力するってのをやめて、IoT時代のブラウザとかブラウザエンジンみたいなことを考えて開発をしています。だから、個別のデバイスの話よりも、そういうインターネットがどこにでも広がって、Web技術がどこでも使われる時代に適したものを作る。</p>

<p>だから、Quantumのようにマルチコア時代のモダンなCPUをフル活用するプロジェクトに注力するし、日本ではGeckoを組み込み用のハードウェアに移植してブラウザエンジンをより広く使えるようにする<a href="https://github.com/mozilla-japan/gecko-embedded/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">プロジェクトGecko Embedded</a>に取り組んでいます。組み込み機器では普通、スマートフォンとは違うCPU (SoC)を使うんですけど、そちらではChromeもFirefoxもWebKitも、みんなまともにビルドすら通らないし、パフォーマンスも全然でない。</p>

<p>そういう課題をちゃんと解消し、組み込み機器でも使えるブラウザ1個ぐらい作りましょうって取り組みです。全体的に、具体的なプラットフォームや製品よりも、本当にベースラインとしての誰もが使い易いコアの部分を改良をしているという感じです。</p>

<p><b class="speaker">白石</b>
じゃあそういったどこまでも広げていこうっていうのがMozillaのビジョンになるわけですね。</p>

<p><b class="speaker">浅井</b>
そうですね。もともとインターネットのオープン性とか、それに触れるための機会とかを広げるのが目的で、そのための手段がブラウザなので。じゃあ、そのブラウザっていうのはインターネットが広がるに従って、全部、ブラウザという形をとるのか、ただのJavaScriptエンジンととるのかわからないですが、それを広げるというのが僕らのミッションです。</p>

<p><b class="speaker">白石</b>
最後に、Mozillaさんが考えているPWAも、Googleが考えているPWAも変わらなと思っていいんですかね？</p>

<p><b class="speaker">浅井</b>
僕らの独自のPWAの定義は作っていません。そういう意味では変わらないと思います。</p>

<h1>EdgeはWindowsの一部、当然これからもどんどん改良していく</h1>

<p><b class="speaker">白石</b>
物江さんにもいろいろお聞きしたいんですが、Microsoftが考えるPWAとかもGoogleやMozillaと変わらないんですかね？</p>

<p><b class="speaker">物江</b>
PWA自体の考えは変わらないですね。ただ、こちらにはまだ動いているものが何もなく、それがどういったものになるかということについては、社外で話して良いかどうか許可も取れていないので私の口からはなんとも言えません。だだ、さきほど矢倉さんがおっしゃってた Edge チームの Jacob Rossi の記事によれば、<strong>アプリのようにすべてのアクセス権をもっていて、ブラウザなしで実行されるようなものを目指している</strong>ようですね。あくまでもこの記事によれば、ですが。</p>

<p><b class="speaker">白石</b>
なるほど。PWAをのっけていくプラットフォームというのは、きっとWindowsになると思いますが、そのWindows × PWAっていうのがちょっと面白いところですね。</p>

<p><b class="speaker">物江</b>
今、<strong>収益の柱はクラウドになっているので、クライアントがなんであるとか、実はあまりに気にしていない</strong>んですよね。Azure使ってくれれば。本当にみんなPWAでアプリ作ってAzureを使ってください（笑）。</p>

<p><b class="speaker">白石</b>
でもビジネス上の話って結構重要かなと思っていて、Edgeのシェアをどこまで本気で伸ばすつもりがあるのか。ブラウザって直接収益には結びつかないじゃないですか。その上で、Microsoftがどこまで本気で今後もブラウザを改良していくのかっていうところは興味があります。</p>

<p><img src="/wp-content/uploads/2017/01/566aa19bc38ee8beb3c1ea65f21edb8e.jpg" alt="" width="640" height="416" class="aligncenter size-full wp-image-22053" srcset="/wp-content/uploads/2017/01/566aa19bc38ee8beb3c1ea65f21edb8e.jpg 640w, /wp-content/uploads/2017/01/566aa19bc38ee8beb3c1ea65f21edb8e-300x195.jpg 300w, /wp-content/uploads/2017/01/566aa19bc38ee8beb3c1ea65f21edb8e-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">物江</b>
もちろんどんどんやります。何故かというと、うちのブラウザはWindowsの一部なので、Windowsに付随するところがいろいろあるんですね。例えば、<strong>例えば、<a href="https://blogs.msdn.microsoft.com/msedgedev_japan/2016/12/22/introducing-windows-defender-application-guard-for-microsoft-edge/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Windows Defender Application Guard</a>という機能では、Edgeの設定で信頼済みのサイトじゃないところでリンクをクリックするとHyper-Vシステムで完全にOSから仮想化されたプロセスが立ち上がって、そこでブラウザが動くのでマルウェアが動いたとしても外に出れない</strong>っていうものがあります。</p>

<p>そういった、Windowsとユーザーの安全、アクセシビリティを守るっていうところに注力していく形で進んでいます。<strong>ブラウザはWindowsの一部であり、Windowsユーザーの利便性をあげるために今後も取り組んでいきます</strong>。</p>

<p>現場でもすごく頑張っていて、<strong>DOMのパフォーマンスを上げることに非常に躍起になっています</strong>。こないだのアニバーサリーアップデートでも相当早くなりましたが、次回のアップデートでもさらに早くなります。EdgeからIEも起動できますが、<strong>IEはブラウザではなくて、従来のIEでしか動かないものを動かすためのランタイム</strong>として見ていただければ。</p>

<p>日本だと大人しく見えるかもしれないですけど、アメリカのほうではEdgeでWebのセッションとかすごくやってますね。Edgeサミットとかもやっていて、オンラインイベントとかも頑張っています。他にもEdgeのデベロッパー向けのサイトには、そこで求人することはまずないんですが、ブラウザ作りませんかっていう求人募集もやっていて、それぐらい力を入れて人を集めています。MozillaさんからもX-tag（Web Componentsのポリフィル）を作ってた方に来ていただいて、今はそれもMicrosoftがやってます。</p>

<p><img src="/wp-content/uploads/2017/01/2d6c8e6710f485c21d2f6be8cc015903.jpg" alt="" width="640" height="417" class="aligncenter size-full wp-image-22051" srcset="/wp-content/uploads/2017/01/2d6c8e6710f485c21d2f6be8cc015903.jpg 640w, /wp-content/uploads/2017/01/2d6c8e6710f485c21d2f6be8cc015903-300x195.jpg 300w, /wp-content/uploads/2017/01/2d6c8e6710f485c21d2f6be8cc015903-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
じゃあ全然やる気ありますよって感じなんですね。ちなみにCordovaにも注力してるって聞いたんですけどほんとですか？</p>

<p><b class="speaker">物江</b>
はい、注力してますね。Visual Studioが絡んでいるのもあるし、やはり周り回ってAzureのお客さんになるじゃないですか。ぶっちゃけた話、Windows Phoneがバカ売れしてたらCordovaはやらなくてもいいんですが、お察しのとおり Windows Phone は数が出ていないんですよね（笑）。Webの技術者の方々がアプリを作ってくれて、Azureを使ってくれれば最高です。</p>

<p><b class="speaker">白石</b>
なるほど、じゃあMicrosoftは、XamarinやCordovaっていう<strong>クロスプラットフォームのテクノロジーに注力していく</strong>形ですね。</p>

<h1>そして、Appleは…？</h1>

<p><b class="speaker">白石</b>
話は変わりますが、ここにいないAppleは、どうなんでしょうか。ここにいるひとは、Webに対してものすごくアグレッシブに、こう変えていこう、良くしていこうとしていると思うんですけど、Appleがどう思っているのかは気になります。何かAppleについて知っていること、感じていることがあれば教えてください。</p>

<p><b class="speaker">えーじ</b>
面白いと思ったのは、WebKitからBlinkがフォークしたときにShadow DOMが入っていたんですけど、それをWebKitから消したんですよね。にもかかわらず、<strong>去年いきなりWeb Componentsの議論にAppleさんが入ってきて、過去に我々が作っていたWeb Components周りの仕様をv0として、Appleが加わって新しく刷新した仕様をv1という形でSafariにもめでたく、Shadow DOMが入りました</strong>。今後もCustom Elementなんかも入ってくることを考えるとすごくポジティブに捉えてもいいんじゃないかなと。</p>

<p><b class="speaker">白石</b>
いきなり今年頑張り始めて、ECMAScriptとかも一気に対応したんですよね。</p>

<p><img src="/wp-content/uploads/2017/01/2-DSC08585.jpg" alt="" width="640" height="412" class="aligncenter size-full wp-image-22057" srcset="/wp-content/uploads/2017/01/2-DSC08585.jpg 640w, /wp-content/uploads/2017/01/2-DSC08585-300x193.jpg 300w, /wp-content/uploads/2017/01/2-DSC08585-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">浅井</b>
そうそう、なんかテクノロジープレビューだして、すごいアップデートニュース飛ばしまくってるなと思ったら、<strong>突然ECMAScriptの対応100%</strong>ですってすべてのブラウザをぶち抜いていったっていう。</p>

<p>ちなみに、現在ECMAScript 2015の対応はSafariが100%で、ECMAScript 2017くらいまでの仕様が安定している部分もSafari Technology Previewがリードしてるんですが、仕様議論中の先行実装ではFirefoxがトップでChromeが次、あとはその他大勢という感じで一気に下がるという感じで進められてきました。JavaScriptに限らず先進部分はだいたいその２者で実装していて、ある程度仕様が固まってくるとMSさんが追いついてくる、そんな流れですよね。Appleさんは、標準化されたものをどこかの段階でやるって決めたらいきなり投入してくる、サプライズが好きな会社。そんなイメージを持っています。</p>

<p><b class="speaker">矢倉</b>
かなり少数精鋭っていう印象を受けるし、やっぱり1年に1回しかアップデートされないブラウザエンジンというのももう少ないですし、やっぱり過去数年でWeb開発者のフラストレーションが溜まっていて、Safariが新しいIEだと揶揄されていた。そういう風に<strong>Web開発者からの印象が悪かったんですね、それを改善しようって本気になって、例えばテクノロジープレビューを出したりとかWebKitのブログをリニューアルして積極的に情報公開したり</strong>とかというのをやっています。</p>

<p>カンファレンスなんかのパネルディスカッションとかにも、あんまり出ないと思うんですけど、<strong>彼らは愚直に彼らの思うWebブラウザっていうものに対してしっかり取り組んでいるなっていう印象があります</strong>。とくにJavaScript APIも実装するだけじゃなくて、早くなくちゃ意味がないと言ってますし、かなり尖ったことをやっていると。</p>

<p>ただ、新しい機能、例えばService Workerとかに対しては、あまり反応がないってところで、やっぱりSafariがネックになるっていう感じのところはありますけど、別に彼らはAppleストアがあるからってあぐらをかいて、Webに関して注力していないとかそういうわけではないかなと思います。</p>

<p><img src="/wp-content/uploads/2017/01/60e1206c2867d66f70663c814af9e0c7.jpg" alt="" width="640" height="428" class="aligncenter size-full wp-image-22048" srcset="/wp-content/uploads/2017/01/60e1206c2867d66f70663c814af9e0c7.jpg 640w, /wp-content/uploads/2017/01/60e1206c2867d66f70663c814af9e0c7-300x201.jpg 300w, /wp-content/uploads/2017/01/60e1206c2867d66f70663c814af9e0c7-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
ここ数年そう見えなくもなかったけど、実はそうでもないと。</p>

<p><b class="speaker">矢倉</b>
MacでSafari使うんですが、やっぱり普通に他のより速いんですよね。だからしばらくデフォルトブラウザにしてみたりとかしているんです。開発者ツールの違いや、新しい機能が載るまでに時間がかかる点で、開発者にとってはあんまり嬉しくない部分があるかもしれないですが、でもユーザーにとって使いやすいもの、早いものって考えると、それが彼らにとって一番の価値だろうと思います。もうちょっと開発者のほうにもアピールができるともっと健康的なのかなと思いますけどね。</p>

<h1>おわりに</h1>

<p><b class="speaker">白石</b>
最後に、皆さんからいろいろお話を聞いて、「Webの今後のビジョンとは何か」という問いに対しては、概ねPWAであるという印象を受けましたが、それで良いでしょうか？</p>

<p><b class="speaker">物江</b>
いろいろな動向を見ていると、そうとしか思えないですよね。</p>

<p><b class="speaker">えーじ</b>
少なくてもGoogleはそう考えています。というよりPWAっていう言葉が全部飲み込んでいるんですよ。なので、<strong>細かいところ見るとたぶん各社注力するところは違うと思うんですが、大きな視点で見ると全部PWAと言えるんじゃないかなと思います</strong>。そういう意味では、バズワード的な感じでよろしくないのかもしれないですけど、モバイルのWebを良くしていきましょう、クロスプラットフォームの部分を良くしていきましょうという想いなのかなと。</p>

<p><b class="speaker">矢倉</b>
えーじさんが最初にバズワードっていうふうに揶揄されてるって言ってましたけど、けどわかりやすいってところでPWAがある。でもPWAの細かいところをつついていくと、ただ<strong>Webの良さっていうのをもっと全面に押し出していこうというのを具現化したにすぎない</strong>のかなと思っていて、まあ新たなマーケティング要素という側面もありますが、ちゃんとWebをWebとしてプロモートするっていうところに再び舵をきったのかなと思います。</p>

<p><b class="speaker">白石</b>
なるほど。皆さん、貴重にご意見をどうもありがとうございました！
これにて対談を終わりにしたいと思います。</p>

<p><img src="/wp-content/uploads/2017/01/734fab59ce3b8b01cbf49333c1a26a1f.jpg" alt="" width="640" height="400" class="aligncenter size-full wp-image-22046" srcset="/wp-content/uploads/2017/01/734fab59ce3b8b01cbf49333c1a26a1f.jpg 640w, /wp-content/uploads/2017/01/734fab59ce3b8b01cbf49333c1a26a1f-300x188.jpg 300w, /wp-content/uploads/2017/01/734fab59ce3b8b01cbf49333c1a26a1f-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[Webの未来を語ろう 2017]]></series:name>
	</item>
		<item>
		<title>ブラウザベンダーとエキスパートが語るWebテクノロジーの未来【前編】──Webの未来を語ろう 2017</title>
		<link>/yoshikawa_t/21986/</link>
		<pubDate>Wed, 08 Feb 2017 01:00:15 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Progressive Web Apps]]></category>
		<category><![CDATA[Web標準]]></category>

		<guid isPermaLink="false">/?p=21986</guid>
		<description><![CDATA[連載： Webの未来を語ろう 2017 (3) HTML5 Experts.jp 副編集長兼エキスパートの吉川です。今年1年のWeb業界を占うということで、エキスパート、ブラウザベンダーの方々に「Webの未来」について、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/future-of-web-2017/" class="series-426" title="Webの未来を語ろう 2017" data-wpel-link="internal">Webの未来を語ろう 2017</a> (3)</div><p><style>
b.speaker {
  font-weight: bold;
}
b.speaker::after {
  content: ": ";
}
</style>
HTML5 Experts.jp 副編集長兼エキスパートの吉川です。<strong>今年1年のWeb業界を占うということで、エキスパート、ブラウザベンダーの方々に「Webの未来」について</strong>、がっつりお話しを聞いてきました。</p>

<p>HTML5 Experts.jp 編集長の<a href="https://html5experts.jp/shumpei-shiraishi/" data-wpel-link="internal">白石</a>が、Googleのデベロッパーアドボケイトの<a href="https://html5experts.jp/agektmr/" data-wpel-link="internal">えーじさん</a>、
Web標準ウォッチャーとして有名な<a href="https://html5experts.jp/myakura/" data-wpel-link="internal">矢倉さん</a>、MicrosoftのWebエバンジェリスト<a href="https://html5experts.jp/osamum_ms/" data-wpel-link="internal">物江さん</a>、Mozillaの技術戦略マネージャ<a href="https://html5experts.jp/dynamitter/" data-wpel-link="internal">浅井さん</a>をお迎えして、興味深いお話が盛りだくさんです。今後のWeb業界の動向を追いかける上で、重要な内容となっているので、ぜひ読んでみてください！</p>

<p><img src="/wp-content/uploads/2017/01/925bb3aa11d7e25da388f51bfee74e49.jpg" alt="" width="640" height="406" class="aligncenter size-full wp-image-22033" srcset="/wp-content/uploads/2017/01/925bb3aa11d7e25da388f51bfee74e49.jpg 640w, /wp-content/uploads/2017/01/925bb3aa11d7e25da388f51bfee74e49-300x190.jpg 300w, /wp-content/uploads/2017/01/925bb3aa11d7e25da388f51bfee74e49-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h1>今、Web標準ってどうなってるの？ WHATWGとW3Cとか</h1>

<p><b class="speaker">白石</b>
皆さん、よろしくお願いします。最初に、僕が個人的に思っていることとして、最近Webのビジョンが見えないな、と。これまでのWebの歴史を見ると、例えば1990年代だったらWebが急拡大して、いろいろなサイトが出てきてきてわくわくしました。2000年代前半になると、Servletとか書きまくったり、XHTMLとかXMLも出てきて面白かった。2000年代後半だとWeb2.0のブームがあって、そして2010年代前半には、HTML5のムーブメントがあった。</p>

<p>それに対して、今どこに向かっているかということを考えると、そんなに楽しいビジョンが見えるかというと、あまりそうは感じていなくて。例えば、モバイルアプリが使う時間がのびて、Webブラウザ使う時間が短くなったかなとか。各社のWebに関する戦略の変更もあるかなと思うんですが、Chrome Appsがサポート終了だとか、IEの開発が終了してEdgeに移行したりとか、Firefox OSも今年終了ということもあって、これまでイケイケでWebを拡大していこうっていうところから曲がり角に来てるのかなと僕は感じています。</p>

<p>今後のWebがどういう流れになっていくのか、というところも見え難くなっていると。今日はWebの未来について何かビジョンを描くとか、少しでもそういうことができると嬉しいなと思います。</p>

<p>さっそくですが最初にWeb標準について、ちょっとお聞きしたいと思います。現在、WHATWGとW3CといったWeb標準はどうなっているのか、そこらへんの現状とかを教えてほしいと思います。では、矢倉さんお願いできますか？</p>

<p><img src="/wp-content/uploads/2017/01/613c0771d062008416b812affccdd1c8.jpg" alt="" width="640" height="410" class="aligncenter size-full wp-image-22034" srcset="/wp-content/uploads/2017/01/613c0771d062008416b812affccdd1c8.jpg 640w, /wp-content/uploads/2017/01/613c0771d062008416b812affccdd1c8-300x192.jpg 300w, /wp-content/uploads/2017/01/613c0771d062008416b812affccdd1c8-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">矢倉</b>
正直、最近あんまり追いかけていないところもありますが、聞きたいのはWHATWG、W3Cだとか、HTMLの仕様がどうなっているのかというところだと思います。どこから話しましょうか。</p>

<p><b class="speaker">白石</b>
そうですね、仕様が分かれているというのはみんな知っていて、ただ詳しく仕様を追いかけていない僕ぐらいのレベルからすると、W3Cというのはスナップショットを取る団体に見えていると。W3CとWHATWGの仕様がちょっとぐらいズレがある、ぐらいは把握しているんですけど、まずそういう世の中の認識は正しいのか、みたいなところとか。現実の標準化の現場ではどうなのかというところが聞きたいですね。</p>

<p><b class="speaker">矢倉</b>
わかりました。まずW3CのHTML仕様というのは、10年前にスタートしましたが、その時点で既にあった2007年当時のWHATWGのWeb Applications 1.0という仕様をベースに進めたというのがW3Cの仕様です。WHATWGの仕様は、基本的にエディター（当時はIan Hickson）がフィードバックをMLから集めて、それを頭の中で考えてこねこねして書いたものが仕様に反映される。それをみんながレビューするという形です。それに対して、W3Cの策定プロセスは、<strong>とりあえず何か議題があったら、それについてみんなで話し合ってコンセンサスをまとめて、それから仕様に反映させる</strong>ということをやってたので、やり方に相違があったと思います。</p>

<p>WHATWGのほうは、<strong>ソフトウェア開発的なモデルとして仕様も同じように作っていくべき</strong>という意識でずっとやっていて、だからバージョンというのもとくに切っていません。マーケティング的な要素で「HTML5」と一瞬名前を変えたときもありますが、べつにバージョンを切ったというわけではありません。コミットされるたびに更新されるので、W3Cの仕様にある日付がついた仕様のドラフトも（一瞬つけたものが出たりしたんですが）、特にやらずに進めています。最新版が常にベストみたいな感じですかね。</p>

<p>一方で、W3Cにはまず勧告プロセスがあり、勧告しなきゃいけない以上、どこかでフィーチャーフリーズしないといけない。なので結局スナップショットになってしまう。勧告が必要なのかというと、<strong>勧告されないと特許ポリシーが発効されないので、IPR（知的財産権）的に危うい状況になる</strong>んですね。そういうのがあって、仕様を固めないといけない。</p>

<p><img src="/wp-content/uploads/2017/01/0be44faae6809251e95f51732abe905c.jpg" alt="" width="640" height="423" class="aligncenter size-full wp-image-22036" srcset="/wp-content/uploads/2017/01/0be44faae6809251e95f51732abe905c.jpg 640w, /wp-content/uploads/2017/01/0be44faae6809251e95f51732abe905c-300x198.jpg 300w, /wp-content/uploads/2017/01/0be44faae6809251e95f51732abe905c-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>W3Cのほうがだんだんと乖離してきた原因のひとつが、Web Applications 1.0でHTML 4.01から変わった箇所、特にマークアップやアクセシビリティの変更に対して、HTML WG内外からいろんな議論があって、それに対処しないといけなかった。W3C側は、HTML WGだけじゃなくて関連する他のグループとも仕様について調整しないといけないんですが、特にアクセシビリティ関連の機能で話がまとまらなかった。まあ生産的でない議論がずっと続いているというのがあって、それに対処していった結果少しずつ離れてしまっている部分がでた。で、Hixieなどはそれをよしとしないので、Web Applications 1.0に反映されない。そういうのが続いて、<strong>完全にコミュニケーションがこじれた</strong>ので、今のよくわからない2つの仕様があるんですね。</p>

<h1>風向きが少し変わったGitHubへの移行</h1>

<p><b class="speaker">矢倉</b>
少しだけ風向きが変わったのが1〜2年前で、WHATWG HTMLがそれまでHixie(ヒクシー: Ian Hicksonの通称)がwhatwg.org上のリポジトリで個人でやってたものがGitHubに移行したんですね。そしたら、<strong>みんなPull Requestを投げたりとか、issueを作って議論するようになってきたりして、少しずつコミュニティみたいに、みんなで作る仕様みたいになってきた</strong>。そうしたら、W3C側からも仕様を一致させようという動きが少しあって、多少一致したところもあります。ただ、マークアップ絡みのところだとやっぱり、Hixieや彼の周りの人が入れた仕様が受け入れられずまたこじれたまま、どうにもいかないところもあります。いまHixieは完全に離れちゃったんですけどねえ。</p>

<p>例えば、アウトラインアルゴリズムでWHATWGのほうでは、セクションの見出しとしてh1をレベルに応じて使うんじゃなくて、全部h1でいいよっていうのがあったんですけど、W3Cの中ではそれが省かれちゃったんですね。というのもスクリーンリーダーがちゃんと対応していないからという理由です。実装状況とかも反映するのがWHATWGのやり方なんで、W3C側で省かれた変更を取り込もうというのもGitHubのほうでissueができたんですが、それが受け入れられずに放置されているとかいうのもあります。ひいてはコミュニケーション不足、解消するにしてもちょっとこじれすぎててどうしたらいいのかわからないっていう気がします。</p>

<p><b class="speaker">白石</b>
なるほど。Hixieはもう離れちゃったんですね。</p>

<p><b class="speaker">矢倉</b>
離れてますね。今は<a href="https://flutter.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flutter</a>っていう、ちゃんと見てないんですが、アプリ版のUnity…つまりXamarinみたいなものですかね、それに関わってるようです。あと個人では、IoTみたいな感じのことやってるみたいです。</p>

<p><b class="speaker">白石</b>
あ、Googleもやめたんですか？</p>

<p><b class="speaker">矢倉</b>
Googleはやめてないですね。FlutterはGoogleでつくられてるので。あと、Flutterに関わってる人を見ると、以前Chromeをやってた人とDartをやってたひとが集結していたりもしてて、なんか不思議です。</p>

<p>W3Cがフォークになってしまってる状況はぼくもなんとかしてくれとは思うんですけど、結局、特許ポリシーまわりなのかなあと。<strong>特許ポリシーがないと、実装に特許的な問題がでたときに、どこからも守ってもらえなくなる</strong>じゃないですか。そうすると<strong>Webプラットフォーム自体の進化が止まってしまう</strong>ので、大人の付き合いは必ずしないといけないんじゃないかなあと。まあ、それをどこまで一般のWeb開発者が認識しなければいけないというのはありますし、別の話ではあるんですが。</p>

<p>ブラウザベンダーの人は、WHATWGの仕様を見ているんすよね。逐次アップデートされていくので、APIなんかの仕様はWHATWGのほうが安定度合いが高いと見ている。特許の部分てそこら辺に関わることが多いでしょうから、そこがちゃんと特許ポリシーで守られるべきだし、そうなるとW3C側の仕様でAPIの乖離が起こるのはよくない。そこはなんとかする仕組みがあればなあと思います。</p>

<p><img src="/wp-content/uploads/2017/01/7a0a3ddd1f8a78e72ed9a8464381cb77.jpg" alt="" width="640" height="425" class="aligncenter size-full wp-image-22037" srcset="/wp-content/uploads/2017/01/7a0a3ddd1f8a78e72ed9a8464381cb77.jpg 640w, /wp-content/uploads/2017/01/7a0a3ddd1f8a78e72ed9a8464381cb77-300x199.jpg 300w, /wp-content/uploads/2017/01/7a0a3ddd1f8a78e72ed9a8464381cb77-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>で、API部分の乖離というのは、ただWHATWG HTMLのほうが更新されてるだけで、話がこじれたからというものってかなり少ないんじゃないかなと思うんですよね。ちゃんと調べたわけではないですが、大体マークアップのところに多いような気がします。マークアップのところでは、仕様を読む限りはW3Cのほうが筋がいいと感じるところも少なからずあって、例えばルビのマークアップとかでしょうか。WHATWGのやつだとあんまり嬉しくないようなものが確か残ったままだったような気がしています。</p>

<p>ただ、マークアップは、あっちの仕様でこう書いてあるけどこっちの仕様ではこう書いてあるからどっちを選ぶというのよりも、それも踏まえてどう使うかを自分で判断するってところが大事じゃないのかいと思うんですよね。結局、CSSとかJavaScript APIとかだって開発するときに「これはこのブラウザで対応してないからどうする」とか、ブラウザの対応状況を見て決めているわけじゃないですか。それと同じことをマークアップでやればいいんじゃないかなと思います。都合が悪い仕様ならそれは突っ込むべきなんですが、グループの政治的なところを、仕様を選ぶ理由にすべきじゃない。そんなのただただナンセンスなだけですよね。</p>

<h1>普段Webを開発している人のフィードバックを得る仕組みが必要</h1>

<p><b class="speaker">白石</b>
マークアップで問題になっているところって、rubyとかh1とか、hgroupとか。timeとかもいろいろ問題ありましたね。</p>

<p><b class="speaker">矢倉</b>
そうですね。あ、で、マークアップの仕様について言うと、まだ仕様がこなれてないんじゃないかと思うことがしばしばなんですよね。Hixieは基本的にかなり合理主義なところがあって、例えばブラウザのリバースエンジニアリングをして、その当時ブラウザが実装していたものを仕様に落とし込むってことをやっています。HTMLパーサなどが最たる例でしょうか。</p>

<p>でも、マークアップに関していうとかなり理想主義で、だいぶ厳格な考えを持つ人という印象があります。それがアウトラインアルゴリズムだったりとかに現れてるんですよね。HTML 4.01にはStrictという、タグセットを絞った厳格な定義がありますが、HTML5のはそれよりもさらに厳格なマークアップを要求しているように思います。もちろん、HTML5の策定当時にもそこらにあるHTMLのマークアップをまとめて、それをもとに要素を追加してたんですが、ちょっと理想が強すぎて、世の中のマークアップに対応できずに進んできたのかなあと。</p>

<p>で、HixieのHTMLがどれぐらい「Strict以上」かというと、ひとつの例としては、もう仕様からは10年前ぐらいに消えたんですけど<a href="https://github.com/whatwg/html/commit/cb6b5fbce258293cb5d15e3a5dcd62c9bbef648f#diff-36cd38f49b9afa08222c0dc9ebfe35ebL5023" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">predefined classses</a>っていって、class名の値を特定の値だけに限定してそれ以外のclassを使ったらnon-conformingにするっていう仕様があったぐらいなんですよね。さすがに消えましたけど、それくらいドラスティックな変更を仕様に盛り込んだりしてたんです。rel属性の値とか、メタタグの名前も似たように限定してて、それは今でも残ってたりはしますね。</p>

<p>もちろんこれも、あとから解釈を広げた結果ふんわりしすぎちゃったってことにならないようにという意図があったとは思うんですが、フィードバックがなかったから使いづらい仕様のままになってしまってるケースってあるような気がするんですよね。</p>

<p>ブラウザの実装に係わるアルゴリズムやAPIの部分に関しては、数多くフィードバックが寄せられたので今のいい仕様があるわけですけど、<strong>マークアップのところはそういう仕様のフィードバックサイクルがまわらなかった</strong>のかなと。これは、普段WebサイトやWebアプリを開発している人のフィードバックが少なかったていうのもひとつあると思うんですよね。フィードバックを送って、それを適切に処理して反映させるっていうことができないと、作られるWebサイトやアプリのマークアップまわりがちょっと窮屈になって、結果としてユーザーの不利益になるかもしれない。もう起こってるかもしれないので、それを避けるように動かないといけないのかなあと。</p>

<p><img src="/wp-content/uploads/2017/01/b6a4d8e30f423ce41f77e50a13164af1.jpg" alt="" width="631" height="398" class="aligncenter size-full wp-image-22039" srcset="/wp-content/uploads/2017/01/b6a4d8e30f423ce41f77e50a13164af1.jpg 631w, /wp-content/uploads/2017/01/b6a4d8e30f423ce41f77e50a13164af1-300x189.jpg 300w, /wp-content/uploads/2017/01/b6a4d8e30f423ce41f77e50a13164af1-207x131.jpg 207w" sizes="(max-width: 631px) 100vw, 631px" /></p>

<h1>Microsoftはどちらの仕様を参照するか、というよりもデファクトを重視</h1>

<p><b class="speaker">白石</b>
それでは、さきほどの話を踏まえて、じゃあそれに対してブラウザベンダーの方々がどう標準を考えているのかみたいなところも聞きないとなと思います。そもそもブラウザベンダーの方々がみんなWHATWGのほうを参照しているっていうのは本当なんですか？</p>

<p><b class="speaker">物江</b>
うち（Microsoft）の最近の流れだと、<strong>相互運用性を非常に重視している</strong>ので、WHATWGにあるかどうかわからないことでも他のブラウザがやるのであれば対応しようっていうのがあります。結局のところ<strong>WHATWGかW3Cかっていうよりは、デファクトがどうか</strong>っていうところですね。</p>

<p><b class="speaker">白石</b>
なるほど。デファクトという話だと、パターンとしては2つあって、みんなで一緒に始めるか、それとも誰かに始めてもらってそのあとを続くかになりますね。</p>

<p><b class="speaker">矢倉</b>
デファクトが重要というのは確かにそうですね。能動的であるか、受動的であるか、残念ながらやるみたいな。MozillaとかOperaとかはそういうポジションになってるんじゃないですか（一同笑）。</p>

<p><b class="speaker">物江</b>
例えば、WebRTCだと、最初WebRTCを包括するORTCという仕様を提案して進めていたんですが、結局相互運用性の問題で従来のWebRTC 1.0を後から実装する形になりました。突っ張っちゃったけど、しょうがないねっていう（笑）。</p>

<p><b class="speaker">白石</b>
例えばWebAssemblyなんかはみんなで一緒にやりましょうって始まって、すごくいい感じになってますね。</p>

<p><b class="speaker">矢倉</b>
デファクトっていうと、XMLHttpRequestとかも元々IEが持っていたものをMozillaが組み込んで、Geckoがたしか最初だと思うんですけど、確かその後WebKitが追従したんじゃないかなと思います、そういう<strong>プロプラエタリなものでも、取り込んでいく</strong>。</p>

<p><b class="speaker">浅井</b>
サービス側での利用が広がっちゃうとそれはもうしょうがないですね。そういう意味ではMozillaも例えば、<strong><a href="https://www.mozilla.jp/blog/entry/10559/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebKitのプリフィックスがついた機能をFirefoxでもサポートする</a></strong>ということもやっています。</p>

<p><img src="/wp-content/uploads/2017/01/5ccd09d56b11a9bb4247268d20e432f1.jpg" alt="" width="640" height="417" class="aligncenter size-full wp-image-22041" srcset="/wp-content/uploads/2017/01/5ccd09d56b11a9bb4247268d20e432f1.jpg 640w, /wp-content/uploads/2017/01/5ccd09d56b11a9bb4247268d20e432f1-300x195.jpg 300w, /wp-content/uploads/2017/01/5ccd09d56b11a9bb4247268d20e432f1-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">矢倉</b>
そうですね、仕方なしにやるのか、便利だからやろうっていうのはわからないですが、そういうことをやってるというのはあんまり昔と変わっていないのかなと。WebKitプリフィックスの話だと、その上にっていう名前がついちゃってプロプラエタリ感が満載だから心理的な抵抗があるってだけで、やってることに関してはたしかに同じですね。</p>

<p><b class="speaker">浅井</b>
プロプラエタリ感が満載っていうよりも、せっかく標準化されたのに古い構文が残っていて、それを捨てられずにいるってのは、やっぱりもう一つの抵抗の理由だと思う。でも残念ながらサイトが対応してくれない状況が続くんだったら、まぁしょうがないよねっていう。</p>

<p><b class="speaker">物江</b>
ベンダープリフィックスって、Mozillaが一回はずしたんですけど、またサポートしたんですよね。</p>

<p><b class="speaker">浅井</b>
そうですね。-moz-プレフィックスは外している一方で-webkit-プレフィックスのサポートを追加した状況です。</p>

<h1>Mozillaが日本のトップモバイルサイト100を調査して、修正依頼？</h1>

<p><b class="speaker">浅井</b>
実は、MozillaがWebKitプリフィックスをサポートする判断をした背景には日本市場の影響も結構あります。Mozillaには<a href="https://webcompat.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Compatibilityチーム</a>という、Firefoxに限らずWebサイトが誰にでも使えるようにするために取り組む部隊がいて、どのプレフィックスがどの程度ユーザの多いサイトで使われているかをこのチームで広く調査した上で、FirefoxでのWebKitプレフィックスの一部サポートを決断しました。</p>

<p>最初、中国とかアジアのサイトを見 ると酷かった。標準準拠コードを書いていないから、全然動かない。北米とかは最新標準仕様のコードを書くサイトが多いんですけど、中国のサイトはあまりにもひどいかった。</p>

<p>日本についても、<strong>日本のトップモバイルサイト100以上を片っ端から調査しました。動かないサイトがあったら原因が何かって徹底追求</strong>して、動かない原因と直すべきコードも全て調べた上で、各社にメールや電話をしまくり、Webのフォームやコンタクト先がなければ知り合いを通じて教えてもらうなどしてWeb担当者にFirefoxはもちろんIEなどでも意図通り動くコードへの修正をお願いしました。</p>

<p>その結果例えば、日経新聞とか、サントリーさんとか、ガールズチャンネルさんとかは直してくれたんですね。反応が面白かったのは、ガールズチャンネルさんなど、直し方わからなかったんです、ありがとうございますって即座に直してました（笑）。</p>

<p><b class="speaker">矢倉</b>
こうやったら直るっていうのまで伝えたんですね。</p>

<p><b class="speaker">浅井</b>
そうです。コードも全部、こうするだけで終わりですってところまで教えるんですね。例えば、ミクシィさんともこんな感じで直していただけますかって打ち合わせをしたのですが、彼らの場合 <a href="http://alpha.mixi.co.jp/entries/2015/12/20" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">5万行以上のCSSファイルがあったりするので、なかなかすぐには難しいとお断りされました</a>。いや、こういうツールを使うとプレフィックスがあるコードを自動変換できるやつもあるんですよってご紹介などもしたのですが、マネージャーレベルでは対応いただけなかったのです。</p>

<p>でもしばらくして、その打ち合わせに参加してくれていた現場のエンジニアの方が、次に携わるサービスでは提案してくれたツールを導入して対応しますとこっそり教えてくれました。その後それがmixi全体に広がりましたが、現場から変えてくれた彼には感謝しています。
最初から全体は直せなくても少しずつ直したりツールを用意したり教育をしたり、息の長い取り組みをしています。ただ、あまりにも日本やアジアのサイトはダメなところが多く、修正も時間がかかることが多くてユーザが不利益を被ってしまうため、非標準の標準化をしようっていったのが<a href="https://compat.spec.whatwg.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">あの仕様 (Compatibility Standard)</a>になります。</p>

<p>意外に思うかも知れませんが、<strong>日本のトップのIT企業が対応してくれないことが結構ありました。</strong> 社名は伏せさせてください(笑) 。当初は中国の特定サイトだけとか、日本の特定サイトだけブラックリストに入れて対応する案もあったのですが(実装もしていました)、トップ企業でも対応してくれない事例が多くあり、全サイトを対象とすることになりました。</p>

<p>ちなみに、他にも日本での調査を機に互換性対応で実装を変えた問題として、UA (UserAgent 名)があります。Mozillaとしては、ユーザのプライバシー確保とトラッキング対策のため、ユーザの絞り込みに繋がる情報は最小限とする方針であるため、主要ブラウザでも最もシンプルなUAとしており、AndroidのOSバージョンも含めていませんでした。</p>

<p>でも、日本のモバイルトップサイトを確認するとAndroidバージョンを入れると壊れるサイトと、入れないと壊れるサイトの両方があり、<strong>Androidバージョンを入れたときのほうが直るサイトの割合が遙かに高かったです</strong>。それである意味仕方なく、OSバージョンを入れることになりました。この話なんかもWeb標準仕様と同じように、実態に合わせつつ、あるいは他のブラウザの挙動に合わせつつ実装をしていっている事例の一つでしょう。</p>

<p><img src="/wp-content/uploads/2017/01/91cc91fe0a287c94e4e91d6e074e542b.jpg" alt="" width="640" height="427" class="aligncenter size-full wp-image-22042" srcset="/wp-content/uploads/2017/01/91cc91fe0a287c94e4e91d6e074e542b.jpg 640w, /wp-content/uploads/2017/01/91cc91fe0a287c94e4e91d6e074e542b-300x200.jpg 300w, /wp-content/uploads/2017/01/91cc91fe0a287c94e4e91d6e074e542b-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
ちなみに、その非標準の標準化っていうのは本当に標準化するんですか、つまりW3Cのプロセスにのせたりとかするつもりがあるということですか？</p>

<p><b class="speaker">浅井</b>
WHATWGでは[Compatibility Standard]（https://compat.spec.whatwg.org/）という仕様として書いていますが、W3Cでやるかっていうとそれはわからないですね。あんまそういう動きはないと思います。</p>

<p><b class="speaker">矢倉</b>
あ、でも一部の機能はCompat Standardみたいなパッチではなくて、標準仕様にとりこまれてます。たとえば、<code>Element.matches()</code>という、ある要素が特定のCSSセレクタにマッチしてるか判別する仕様があるんですけど、それが昔の仕様だと<code>matchesSelector()</code>という名前で、それがWebKitでは<code>webkitMatchesSelector()</code>として実装されていたんですね。で、互換性のために仕様で定義しようって話になったときに、それはもうCompatibility Standardじゃなくて、<a href="https://dom.spec.whatwg.org/#dom-element-webkitmatchesselector" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">DOMの仕様の中で定義した</a>んですよね。そういうのもあります。</p>

<p><b class="speaker">浅井</b>
<a href="https://developer.mozilla.org/ja/docs/Web/API/Node/innerText" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">innerText</a>とかもそうですね。<strong>標準のtextContentしかサポートしないって僕らは言い張ってたんですけど、僕らだけサポートしないっていってても日本などのサイトは直らないから仕方がないということでinnerTextでも動くようになりました</strong>。<a href="https://html.spec.whatwg.org/multipage/dom.html#the-innertext-idl-attribute" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">標準にも反映されています</a>。</p>

<h1>新しい取り組みである「Origin Trial」とは？</h1>

<p><b class="speaker">えーじ</b>
ベンダープリフィックスの問題って結構長くあって、それを解決する方法として、Chromeでは基本的にExperimentalな機能をStableに入れないっていうのを始めたんですよね。もうその機能は、Betaまでのバージョンまでしか動きませんっていう状態で、まずは実装をはじめて、最終的にそれをStableにのせるために必ずコンセンサスをとらないといけない。</p>

<p>なのでMLにIntent to Shipっていうメールを出すんですが、それで合意が得られて、実装が2つ以上存在している場合にのみStableにのせるという段階を踏むようになりました。なので、新しい機能については基本的にはある程度、成熟した仕様であり、かつ実装も問題ないという合意が得られたうえでshipしますというような状態になっています。</p>

<p>最近始めたOrigin Trialというのがあって、それは<strong>新しい機能をStableにのせるけど、あらかじめ使いたいと手を挙げたサイトでのみが使える</strong>というもの。それをやるためには、フォームで申請をして、そのトークンをサイトに載せることによってブラウザがホワイトリストでその機能を動かす、そうすると我々としてもどのサイトがそれを実装してるかわかるし、もし仮にそれにひどい変更が入りますってときにもコンタクトをとることができると。</p>

<p><b class="speaker">矢倉</b>
あと、Origin Trialは、一定期間過ぎたら終了するっていうのもありますね。</p>

<p><img src="/wp-content/uploads/2017/01/1f1666875aa1d18f84b6da8b9f69656c.jpg" alt="" width="640" height="417" class="aligncenter size-full wp-image-22044" srcset="/wp-content/uploads/2017/01/1f1666875aa1d18f84b6da8b9f69656c.jpg 640w, /wp-content/uploads/2017/01/1f1666875aa1d18f84b6da8b9f69656c-300x195.jpg 300w, /wp-content/uploads/2017/01/1f1666875aa1d18f84b6da8b9f69656c-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">浅井</b>
Origin Trialは、面白いなと思って見ています。その機能が大規模に使われると、サイトのドメインの数が少なくても例えばfacebook.comで使われてしまうと後戻りできなくなるので、ユーザーの数が一定以上を超えたら無効になるっていう仕組みがある。そういうのをちゃんと考えているのが面白いなと思う。</p>

<p>今後、全面的にOrigin Trialになっていくのかどうかとか、例えばBLE（Bluetooth Low Energy）は、Origin Trialに入れながらやって、この時期には標準にするよって宣言しながら実装されてます。それが宣言された時期までに他のブラウザが実装しているかどうかというのは、本当にshipする基準にするのか、それとももう宣言してしまったから実装がなくてもshipするのか、どっちなのかなという点を気にしながら見ています。</p>

<p><b class="speaker">矢倉</b>
Origin Trialは、もともとマイクロソフトの人が提案してたんですよね。<a href="https://www.w3.org/wiki/TPAC2014/SessionIdeas#Beyond_Vendor_Prefixes" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">EdgeチームのJacob RossiがW3CのTPACで提案</a>してて、そこにChromeチームのAlex Russellものっかっていて、もしかしたら二人のアイディアなのかもしれないですけど、最終的にChromeだけでやってはいますけどね。</p>

<p>Origin Trialは、APIのローンチカスタマーを作る意味でも結構良いのかもしれないですね。手厚くフィードバックも得られるし、カジュアルに試して見たよっていうよりもこういう業界的なニーズがあるから使いたいということでOrigin Trialに申請するといったら、ChromeのDevRelのひとも反応しやくすくなるのかなっていう気がします。</p>

<p><b class="speaker">白石</b>
たしかに。ニーズがあるかわからない機能が入ってくるとかもありますしね。</p>

<p><b class="speaker">矢倉</b>
そして不幸になるっていうのはHTML5でいくつか経験してますからね。</p>

<p><b class="speaker">浅井</b>
Extensible Webのときからそうだというイメージありますが、やっぱり<strong>ブラウザベンダーと標準化団体だけで作っていたらもうダメだ</strong>っていうのがよくわかっていて、いかにデベロッパーの声を集めて標準化に反映するかが大事です。Origin Trialはそれを実現する手段を具体化した手段の一つだと思うので、非常に面白いと思って見ています。</p>

<h1>GoogleはWebが目指すべきところに必要な機能があればどんどん進めていく</h1>

<p><b class="speaker">白石</b>
ちょっとえーじさんに聞いてみたいなと思ったのは、さっきEdgeはデファクトを追いかけますって話だったので、だとすると、まず最初に実装するベンダーとかが必要になってくるじゃないですか、デファクトを作る人たちが必要なので。それって、ここでいうとGoogleとか、Mozillaとか動きが早そうだなと。そうすると、どの仕様を実装するかを決めるのってどういう基準でやってるのかなというところを聞きたいなと。</p>

<p><b class="speaker">えーじ</b>
社内的にはやっぱり、<strong>Webが目指すべきものっていうのをざっくり持っていて、その中でじゃあそのピースを埋めるために必要なのはどの機能なのかっていう判断をして、なければ作る</strong>しっていう感じで進めちゃいますね。他がやるのを待ってるっていうスタンスではないです。</p>

<p><img src="/wp-content/uploads/2017/01/c1854feee5c205321b919f7fd72f394e.jpg" alt="" width="640" height="423" class="aligncenter size-full wp-image-22043" srcset="/wp-content/uploads/2017/01/c1854feee5c205321b919f7fd72f394e.jpg 640w, /wp-content/uploads/2017/01/c1854feee5c205321b919f7fd72f394e-300x198.jpg 300w, /wp-content/uploads/2017/01/c1854feee5c205321b919f7fd72f394e-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石</b>
なるほど。具体的いうと、例えばService Workerとかなんですかね？</p>

<p><b class="speaker">えーじ</b>
そうですね。ひとことで言っちゃえばProgressive Web Appsっていう話になるかと思います。以前より一言ですむんでだいぶ言いやすくなりましたね（笑）。今までは、一生懸命Service WorkerとAdd to Homescreenと〜、とか説明しなきゃいけなかったのが一言で済むので個人的にはありがたいですけど。所詮マーケティング用語みたい感じの部分もあって、結構揶揄されたりしますが、一言で表せるという意味ではモバイルに対するWebの回答と考えるとわかりやすくて良いのかなと思います。</p>

<p>ここ最近は、Webが割と盛り返してきた感じを受けてるんですけど、去年までの2〜3年ぐらいの間ってやっぱり日本の各社もWebチーム解散してAndroidにリソース注ぎ込むとか、ざらにあったりとかしてWebがだいぶ負けてきているっていうのはすごく思っていたんですけど、Service WorkerとかPWAの流れがでてきて、だいぶ盛り返してきた感じがあります。</p>

<h1>Progressive Web AppsはモバイルWebをいかによくするかのムーブメント</h1>

<p><b class="speaker">えーじ</b>
PWAに対する反応もすごくいいんですよね。なので、そういう意味では<strong>モバイルでのWebをいかによくしていくかっていうムーブメント</strong>として僕はPWAを捉えている。技術的には細かい話はいっぱいありますけど、そのピースをどう組み合わせていくかっていうのは各ブラウザベンダーの判断もあるでしょうし、思惑もあるでしょうが、最近は足並みが揃ってるという感じがしています。</p>

<p><b class="speaker">物江</b>
EdgeでもPWA周りの仕様は、開発中のステータスになっているので、近いうちにEdgeでも使えるようになる可能性がありますね。</p>

<p><b class="speaker">矢倉</b>
EdgeチームのJacob Rossiが<a href="https://medium.com/web-on-the-edge/progressive-web-apps-on-windows-8d8eb68d524e" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mediumに投稿</a>していて、WindowsでPWAを考えるとブラウザの中だけにとどめておくってことはしないで、WindowsストアだとかBingの検索結果に乗せるだとか、PWAをインストールしたら、それがスタートメニューやランチャーに乗るとかも検討しているらしいですね。</p>

<p><b class="speaker">物江</b>
Chrome Appsみたいになるらしいです（笑）。</p>

<p><b class="speaker">えーじ</b>
話をややこしくした（笑）。</p>

<p><b class="speaker">白石</b>
Chrome Appsは、サポート終了するのに（笑）。</p>

<p><b class="speaker">えーじ</b>
ある意味それは正しくて、Chrome Appsを終了する理由って、Webの標準を盛り上げていかないといけないのにChrome Appsというプロプラエタリなものに注力し続けるよりは、<strong>Webの標準からネイティブ的なアプリが作れるようになるべき</strong>であるという感じです。</p>

<p><b class="speaker">白石</b>
じゃあ、Chrome Appsに実装されていたBluetooth APIやUSB API、Socket APIとかは。</p>

<p><b class="speaker">矢倉</b>
USB APIはOrigin Trialになってますね。</p>

<p><b class="speaker">えーじ</b>
Socket APIは、入っていないですね。それをやるかどうかも決まっていないと思います。要望があれば受け付けますというフォームもあるので、その辺はデベロッパーのユースケース次第という感じですかね。</p>

<p><b class="speaker">白石</b>
なるほど。少なくてもそれらを標準化にのせていこうという意図は、持っているということですかね？</p>

<p><b class="speaker">えーじ</b>
モチベーションがある人がいればやるって感じですね。社内でそれを是非やりたいという人がいれば仕様も書くだろうし、実装もすると思います。いい例でいえば、PaymentRequest APIとかCredential Management APIとか、最近はここら辺を担当しているんですが、やっぱり担当のチームがきちんとあります。Paymentsに関してはMozillaさんやMicrosoftさんと並行して実装も進めていると思います。</p>

<p><b class="speaker">物江</b>
Paymentsは、Edgeでも開発中なので、近いうちに。</p>

<p>（<a href="https://html5experts.jp/yoshikawa_t/22014/" data-wpel-link="internal">後編</a>へ続く）</p>
]]></content:encoded>
		
		<series:name><![CDATA[Webの未来を語ろう 2017]]></series:name>
	</item>
		<item>
		<title>JJUGのエキスパートが語るエンタープライズ・アーキテクチャの過去、現在、未来──SOAP・RESTからIoT・ウェアラブルまで</title>
		<link>/yoshikawa_t/14403/</link>
		<pubDate>Fri, 15 May 2015 00:00:38 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[アーキテクチャ]]></category>
		<category><![CDATA[エンタープライズ]]></category>
		<category><![CDATA[クラウド]]></category>

		<guid isPermaLink="false">/?p=14403</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (4)特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、エンタープライズ・...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (4)</div><p>特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、エンタープライズ・アーキテクチャについて取り上げます。</p>

<p>HTML5・モバイル・IoT・ウェアラブルなどビジネス環境が激変する中、エンタープライズ・アーキテクチャはどういう課題を抱えていて、どうあるべきなのか。今回は、<a href="http://www.java-users.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JJUG (日本Javaユーザーグループ）</a>でご活躍中のお二人に話を伺うことにしました。</p>

<p><img src="/wp-content/uploads/2015/04/hx-21.jpg" alt="" width="600" height="354" class="aligncenter size-full wp-image-14671" srcset="/wp-content/uploads/2015/04/hx-21.jpg 600w, /wp-content/uploads/2015/04/hx-21-300x177.jpg 300w, /wp-content/uploads/2015/04/hx-21-207x122.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>アーキテクチャを主軸に第一線で活躍している<a href="https://www.gxp.co.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">グロースエクスパートナーズ株式会社</a> 執行役員の鈴木雄介さんと、「流しのアーキテクト」を自称する<a href="http://www.architectus.co.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">株式会社アーキテクタス</a> 代表取締役の細川努さんを交えて、エンタープライズ開発出身の白石俊平編集長がさまざまなトピックスをぶつけていきます。</p>

<h2>XML Webサービスは今どうなったのか</h2>

<p><br>
<strong>白石：</strong>とりあえず、昔話から軽く聞いてみたいですね。まずは、エンタープライズ内のシステム間連携でよく話題に上がる、<a href="http://ja.wikipedia.org/wiki/SOAP_%28プロトコル%29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SOAP</a>とRESTについての現状について、どうお考えでしょうか？
<br><br>
<strong>鈴木：</strong>SOAPは下火だと思われがちですが、私の知る限り、今でもよく利用されています。RESTとJSONの組み合わせも当然よく使われているんですが、（SOAPは）<a href="http://ja.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WSDL</a>で型定義ができるので、それなりにかたいシステム間連携だったりすると、WSDLがあるほうがコードの自動生成もできるし、非常に楽なのでよく使われています。</p>

<p><img src="/wp-content/uploads/2015/04/hx-131.jpg" alt="" width="600" height="370" class="aligncenter size-full wp-image-14680" srcset="/wp-content/uploads/2015/04/hx-131.jpg 600w, /wp-content/uploads/2015/04/hx-131-300x185.jpg 300w, /wp-content/uploads/2015/04/hx-131-207x128.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />　　 ▲グロースエクスパートナーズ株式会社 執行役員 鈴木雄介さん</span>
<br><br>
<strong>細川：</strong>とはいえ、SOAPの上位レイヤで規定されている<a href="http://en.wikipedia.org/wiki/WS-Reliability" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WS-Reliability</a>だとか<a href="http://ja.wikipedia.org/wiki/WS-Security" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WS-Security</a>などの様々なプロトコルは、あまり使われていない印象です。
<br><br>
<strong>白石：</strong>では、システム間連携などではプレーンなSOAPがよく使われているということですね。
<br><br>
<strong>鈴木：</strong>まあSOAPもRESTも用意する、というパターンが多いんじゃないでしょうか。オブジェクトモデルは同じで、それをSOAPでもJSONでも表現できるように設計しておくというパターンは、比較的多いような気がします。
<br><br>
<strong>細川：</strong>あと僕が気になるのは、スケーラビリティなんですよね。SOAPだとちょっと気になるのはやっぱりシリアライズ・デシリアライズの処理が重いし、トラフィックも増大するじゃないですか。そういった意味だとやっぱりREST + JSONのほうにもメリットがありますね。本来だったら使い分けみたいなところが重要なんですけど、いまだにSOAP一択という開発現場も多い。</p>

<p><img src="/wp-content/uploads/2015/04/hx-151.jpg" alt="" width="600" height="357" class="aligncenter size-full wp-image-14692" srcset="/wp-content/uploads/2015/04/hx-151.jpg 600w, /wp-content/uploads/2015/04/hx-151-300x179.jpg 300w, /wp-content/uploads/2015/04/hx-151-207x123.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />　　　▲株式会社アーキテクタス 代表取締役 細川努さん</span>
<br><br>
<strong>白石：</strong>どっちかに寄せちゃったほうが考えることが少なくて、楽ってこともあるかもしれないですね。
<br><br>
<strong>鈴木：</strong>一長一短…というとつまらない話になってしまいますが（笑）、実際のところそういう結論になっちゃいますね。HTML5が盛り上がっている現在、JavaScriptと相性が良いJSONにはすごく価値がある。一方で例えば、日付型をどう扱うんだとか、型定義やコードの自動生成がしづらいというJSONには苦手な分野もあるのですが、SOAPはそういう部分に強い。「SOAPはXMLだからダメ・ダサい」ということは、実際のシステム開発には全く当てはまらないと思いますよ。
<br><br></p>

<h2>エンタープライズアーキテクチャパターンは今も有効か</h2>

<p><br>
<strong>白石：</strong>アーキテクチャという点では、<a href="http://www.amazon.co.jp/dp/4798105538" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">マーティン・ファウラーのエンタープライズ アプリケーションアーキテクチャパターン</a>が昔は王道だったかとと思うんですが、それは今も有効なんでしょうか？
<br><br>
<strong>鈴木：</strong>あれは普遍的なものなので、時代が変わったからといって使えなくなってしまうようなものではありません。ただ、昔と比べると今はWeb API主導型のアプリケーションが主流になりつつありますね。クライアントのマルチデバイス化は当然エンタープライズでも相当重要なので、「サーバー側はAPIを提供するだけ」というスタイルに移行しつつあるのは、Webでもエンタープライズでもまったく変わらないと思います。
<br><br>
<strong>白石：</strong>具体的には、<a href="http://ja.wikipedia.org/wiki/JAX-RS" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">JAX-RS</a>を利用するとか？
<br></p>

<p><img src="/wp-content/uploads/2015/04/hx-18.jpg" alt="" width="600" height="390" class="aligncenter size-full wp-image-14678" srcset="/wp-content/uploads/2015/04/hx-18.jpg 600w, /wp-content/uploads/2015/04/hx-18-300x195.jpg 300w, /wp-content/uploads/2015/04/hx-18-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>JAX-RSもありますし、JSON用のバインディングAPIもJava EE 7で標準化されたので、何の違和感もなく使えますね。
<br><br>
<strong>細川：</strong>エンタープライズ アプリケーションアーキテクチャパターンは非常に洗練されていたのですが、実際のエンタープライズ・アプリケーションはもっと泥臭いです（笑）。
例えば<a href="http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A6%E3%83%A9%E3%83%BC" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">マーティン・ファウラー</a>の提唱するモデルだと、プレゼンテーションレイヤからデータレイヤまでが3、4層ぐらいなんですが、実際はビジネスロジックだけで3層以上に分けたりとか、ビジネスロジックとプレゼンテーションの間にいろいろ挟んだりとか、端から端まで数えると下手したら10層ぐらいあるものも実際のプロジェクトでは山ほどありました。
<br><br>
<strong>白石：</strong>僕もそういうプロジェクトをやったことがあります。なんか別のメソッドを呼び出してるだけのメソッドが大量にあったり（笑）。
<br><br>
<strong>細川：</strong>そうそう。なので、どちらかというとほんとに綺麗なレイヤリングはできてなかったというのが現実ですね。最近、６〜７年以前につくられた数十万ステップくらいのシステムをいくつか実際に解析してみたんですけど、結構面白い結果が出たんですよ。サーバーサイドJava（JavaEE）としては最新ではなく、まだJ2EEと呼ばれていた頃のシステムです。どのシステムも、一番複雑度が高いのはビューとデータアクセス（永続化）、アーキテクチャ共通系のモジュールです。ビジネスロジックの部分は量は膨大なんですけど、複雑度自体は比較的シンプルなんです。 
<br><br>
何が言いたいかというと、古い世代のサーバーサイドJavaは、ビューとアーキテクチャ制御に作り込みが必要で、そこのところが本当に大変だった。例えば、ビューのところのバリデーションなんかは、かなり作り込みが必要で、簡単な画面作るのも相当手間がかかってたんですよね。結局は、<strong>かつてのJava EE（J2EE）って、エンタープライズ系プログラマーが本来集中すべき業務上のロジックにあんまり集中できていなくて、もっと簡単にできるはずのところに手間がかかっていた</strong>のが現実だったんじゃなかったかなと。
<br><br>
<strong>白石：</strong>ほんとにそうですよね。オブジェクトの変換とか、別のメソッド呼び出すだけとか、<a href="http://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ファサード</a>作ってそこに一生懸命集めるだけとかやっていて、なにやってるんだろうこれは…とか思っていました。
<br><br>
<strong>細川：</strong>以前はそうでしたね。そのレガシーなところが今はみんなの足を引っ張ってる（笑）。現在は、それがどれだけ良くなってるか、というところですよね。
<br></p>

<p><img src="/wp-content/uploads/2015/04/hx-16.jpg" alt="" width="600" height="343" class="aligncenter size-full wp-image-14675" srcset="/wp-content/uploads/2015/04/hx-16.jpg 600w, /wp-content/uploads/2015/04/hx-16-300x172.jpg 300w, /wp-content/uploads/2015/04/hx-16-207x118.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>白石：</strong>今の流れをまとめると、ビューの複雑なところっていうのが、だんだんクライアント側に寄ってきていて、ようはHTML5でリッチクライアント化されてきて、サーバー側はAPIを提供しているだけになっていると。
<br><br>
<strong>鈴木：</strong>大きくはそうです。ただ、エンタープライズシステムの場合、とにかくシステム間連携が多くて、1つの企業の中でいろんなシステムがあって、ほとんどのシステムが関連付いているのが当然になっています。そうするとクライアント側からするといろんなシステムにいちいちログインして使うのは面倒くさいので、どうやってシンプルに使うのかというのが今の大きなテーマになっていると思います。サーバー間で連携したり、クライアント側でアグリゲーションしたりというのが今の課題としてあって、エンタープライズの場合は、そこがシンプルにならないので、それがひとつの前提になっています。
<br><br>
<strong>白石：</strong>なるほど。そのシステム間連携がさきほどおっしゃっていたようにXMLベースだったり、RESTだったりという感じですね。
<br><br>
<strong>鈴木：</strong>はい。企業って、いろんなユーザーといろんなシステムがあるので、いわゆる一般コンシューマー向けのECサイトのようなシステムもあれば、例えば人事システムみたいなものもありますよね。人事システムだと、人事部だけが使うのでユーザーが10人しかいなかったり、でも社員数10万人を支える人事システムっていうと相当でかいっていうものだとか。じゃあその2つが同じアーキテクチャで、同じ作り方でいいんですかっていうと全然そうじゃないですよね。
<br><br>
企業の中のさまざまなシステムの中で、HTML5に合うものもすごく増えてますし、HTMLの可能性が広がったことでやれることもすごく増えましたが、一方でそれが銀の弾丸ではないです。ここはRESTでつくったらいいよねとか、ここはWSDLがちゃんとあってSOAPでやったほうがいいよねっていうのがある。そこは全体の中での選択してやっていけばよいことです。エンタープライズの人って古めかしい人印象があるかもしれないですけど、新しいことも古いこともやらきゃいけないので、そういう意味ではちゃんとまともにやっている人は、それを両方うまくバランスよくやっていますね。</p>

<h2>エンタープライズとモバイル</h2>

<p><br>
<strong>白石：</strong>最近のエンタープライズ業界に疎くて、初心者的な質問で申し訳無いのですが、モバイルをエンタープライズで使うというのはもうかなり普通に行われていることなんでしょうか。
<br><br>
<strong>鈴木：</strong>そうですね。モバイル、タブレット、PC、専用の機器とか、何を何に使うといいよねっていうユースケースはちゃんと考えなきゃいけないですが、モバイルはものすごく重要なツールとして使われています。
<br><br>
<strong>白石：</strong>エンタープライズでモバイルといえば結構HTML5が使われているという話を聞くのですが、実際そうなんですか？コンシューマ向けだと、ネイティブアプリが全盛です。</p>

<p><img src="/wp-content/uploads/2015/04/hx-19.jpg" alt="" width="600" height="369" class="aligncenter size-full wp-image-14679" srcset="/wp-content/uploads/2015/04/hx-19.jpg 600w, /wp-content/uploads/2015/04/hx-19-300x185.jpg 300w, /wp-content/uploads/2015/04/hx-19-207x127.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>そもそもモバイルという文脈で求められる操作性とか機能が、エンタープライズの場合はそんなにネイティブでやらなくてもいいようなものが多いので、HTML5がフィットしてるんじゃないかと思います。例えば、ゲームはネイティブアプリがいいといわれますが、別にあそこまでビジュアル的なものとか、細やかな操作性はあんまり求められることはないと。
<br><br>
なので、HTML5でやるっていうのは多いんじゃないでしょうか。Webアプリであれば、リリースも楽ですしね。去年ぐらいまでは写真とか音声とかでいろいろやろうとすると、まだまだHTML5では制約が多いということでネイティブアプリという選択もありましたが、そうした制約もブラウザが進化してきてだんだん問題にならなくなってきています。
<br><br>
<strong>白石：</strong>なるほど。ちなみに、そうしたHTML5で書かれた業務アプリは、ハイブリッドアプリとしてインストールする形が多いのか、それともWebサイトとしてURLでアクセスする形で作るんでしょうか。
<br><br>
<strong>鈴木：</strong>それは両方あります。どちらにも利点があるので。</p>

<h2>クラウドがアーキテクチャに与えた影響は？</h2>

<p><br>
<strong>白石：</strong>これも初心者的な質問で恐縮です。クラウドがエンタープライズのアーキテクチャに与えた影響はありますか。
<br><br>
<strong>鈴木：</strong>もちろんあります。クラウドができたことで一番大きかったのは、PaaSという概念ができたことですね。あるニーズに特化したものっていうのは共有化されたものが使われるべきだっていう概念がはっきりしたのはPaaSのおかげです。例えばAWSのラインナップを見て貰うとわかるんですが、CDNありますねだとか、ロードバランサありますねだとか、ストレージ、サーバーノード、認証認可とか、メールの配信サービスとか、ああいうものはPaaSとしてみんなが共有して使うべきだという概念ができた。
<br><br>
なので、そういうプラットフォームを用意してその上にアプリケーションを作って、アプリケーションはUIを含めてそれだけに特化して、なるべくプラットフォームの機能をうまくつかってやっていくていうアイデアは、今のエンタープライズでも浸透している考え方だと思います。</p>

<p><img src="/wp-content/uploads/2015/04/hx-17.jpg" alt="" width="600" height="394" class="aligncenter size-full wp-image-14677" srcset="/wp-content/uploads/2015/04/hx-17.jpg 600w, /wp-content/uploads/2015/04/hx-17-300x197.jpg 300w, /wp-content/uploads/2015/04/hx-17-207x136.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>細川：</strong>開発者視点でいうと、開発者ができる領域が増えてきましたね。従来だと、サーバ構築とソフトウェア開発は別々のものでしたが、プログラマーがだんだんとクラウドを前提にして、環境を構築するようになってきた。そうすると、同時にパフォーマンスだとかセキュリティだとかをエンジニアが自分で考えなきゃいけない時代になってきていて、Webエンジニアだとかエンタープライズエンジニアとかの区別はなくなってきている。そういう意味では、フルスタックで両方できなきゃまずいんじゃないでしょうか。
<br><br>
<strong>鈴木：</strong>もうそれはエンタープライズでも間違いなくそうですね。
<br><br>
<strong>細川：</strong>もうひとつの特徴としては、昔は大規模＝エンタープライズということが多かったんですが、今ではコンシューマー向けとかゲームだとか、そっちのほうがより大規模なんですよね。それを実現しているのがやっぱりクラウドなのかと思っています。そういった意味でも、これからはWebエンジニアこそ大規模を得意にならなきゃいけないんじゃないかと。サーバーとクライアントのメッセージの単位なんかもパフォーマンスに大きく影響するので、そういったところも、かなりノウハウを積まないといけなくなってきています。</p>

<h2>エンタープライズ・アーキテクチャの未来像</h2>

<p><br>
<strong>白石：</strong>IoTとかウェアラブルとかを見据えて、今後どういうふうにエンタープライズ・アーキテクチャが変わっていくべきか、ご意見はありますか？
<br><br>
<strong>鈴木：</strong>IoTを真剣にやろうとすると、先ほど細川さんが言っていた大規模っていうのがエンタープライズに戻ってくるんですよね。対応するデバイスの数が、今まではユーザーが数万人ですんだのが、億になるかもしれない。例えば、すべてのダンボール箱にチップがついたらどうなるんだろうっていう世界を考える。そうすると日本で流通しているダンボール箱は何箱あるんだとか、ものすごいクライアントの数になってしまう。そうなってくると、エンタープライズがまた大規模な性能を頑張らないといけなりますね。
<br><br>
例えば、わかりやすい例でB2Bのケースを考えると、トラックをトレースする仕組みを作ることになったとします。じゃあ全国にあるトラックを全台管理しますとなったときに、全部で何台あるのか。1台のトラックにセンサーがいくつついているのかということになると、センサーが車輪それぞれにあって、それぞれのタイヤのすり減り方を計測して、運転手が寝てるんじゃないかというのを監視するセンサーがあって、速度・加速度をとるセンサーがあって…というようにトラックにすごい数のセンサーがある。</p>

<p><img src="/wp-content/uploads/2015/04/hx-22.jpg" alt="" width="640" height="353" class="aligncenter size-full wp-image-14690" srcset="/wp-content/uploads/2015/04/hx-22.jpg 640w, /wp-content/uploads/2015/04/hx-22-300x165.jpg 300w, /wp-content/uploads/2015/04/hx-22-207x114.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br>
そして、トラックを1万台管理します、データを500msごとに取るとすなると、ものすごい数になる。つまり、B2BでIoT、ウェアラブルというのはB2Cのスケーラビリティをエンタープライズでもう1回頑張らないといけないということになる。今、Webの人が大規模で頑張っているテクノロジーセット、例えば大量のストリームを処理しながらイベントドリブンでやるっていうのは昔からエンタープライズにあって、それがWeb側ですごく実用化されて使われていたのが、またエンタープライズに戻ってくる。そういう流れが未来にはやってくるんじゃないかなと考えています。
<br><br>
<strong>白石：</strong>なるほど。ちなみに、もう実際にIoTの案件とか発生しているんでしょうか。
<br><br>
<strong>鈴木：</strong>相談はかなり増えてきてますね。まだ実証実験ぐらいが多いという感覚ですが。今は車がうまくいっていて、ホンダの事例がわかりやすいです。日本中の車のブレーキの発生情報を集めてるんですけど、それを解析すると事故が発生しやすい曲がり角がわかるんですよね。みんながたくさんブレーキを踏んでいる曲がり角がどこかっていうのを提供しているんですよ。そしたらそれを元に道路の信号とか標識とかを改善するってことをやっています。</p>

<h2>まとめ</h2>

<p><br>
<strong>白石：</strong>本日は、エンタープライズ・アーキテクチャについて様々なご意見をいただき、誠にありがとうございました。最後に、読者に向けて一言お願いします。</p>

<p><img src="/wp-content/uploads/2015/04/hx-20.jpg" alt="" width="600" height="387" class="aligncenter size-full wp-image-14681" srcset="/wp-content/uploads/2015/04/hx-20.jpg 600w, /wp-content/uploads/2015/04/hx-20-300x194.jpg 300w, /wp-content/uploads/2015/04/hx-20-207x134.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>自分たちの生活を考えると、やっぱりエンタープライズ業界の会社が自分達の生活を支えてるわけじゃないですか。それがより便利になったり、役立つようになったり、世の中が進化するっていうのはとても大事なことだと思うんですよ。なので、それが実現されるためにはどうしたらいいのかっていうときに、エンタープライズとかWebとかそういう区切りはどうでもよくて、どうやれば本当に価値がでるのか、そういうのを考えるのが面白い。
<br><br>
ただ、社会基盤として変えてはいけないところもエンタープライズにはどうしてもあるので、それをどのように変えずに、より新しいことにトライしながら今あるものの価値をより高めるのかというところが大事ですね。なので「エンタープライズwww」という風潮はよろしくないと思います（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/hx-211.jpg" alt="" width="600" height="381" class="aligncenter size-full wp-image-14682" srcset="/wp-content/uploads/2015/04/hx-211.jpg 600w, /wp-content/uploads/2015/04/hx-211-300x191.jpg 300w, /wp-content/uploads/2015/04/hx-211-207x131.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>細川：</strong>2点あって、ひとつは、今までのエンタープライズ開発は、ユーザーの言われたものを作るという風潮が多かったんですが、今後はユーザーと一緒につくるっていうのは大事になってくるんじゃないかと考えています。そういう意味ではエンタープライズ業界もWeb業界と同じようにUXとか、よりユーザーが求めるものは何かというところを柔軟に対応してかなきゃいけない。エンタープライズもWebに学ばなきゃいけないということ。
<br><br>
もうひとつは、今後、変化がたくさんあって、それに対応するためにエンタープライズ側、Web側が両方対応しないと対応できないんじゃないかなと思う。これらの技術の変化に対応できるようにフルスタック、両方できるようなエンジニアが増えてくると心強いんじゃないでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>フレームワーク対決！Angular VS React仮想パネルディスカッション</title>
		<link>/yoshikawa_t/14459/</link>
		<pubDate>Mon, 11 May 2015 00:00:30 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[React.js]]></category>
		<category><![CDATA[アーキテクチャ]]></category>

		<guid isPermaLink="false">/?p=14459</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (2)特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngul...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (2)</div><p>特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngularJSなどのJavaScript MVCフレームワークの台頭と進化、そして新しいアーキテクチャであるFluxとそのフレームワークであるReactなどについて、既に先行して学んでいるエキスパートたちにその知見を聞いてみました。</p>

<p>今回はフレームワーク対決ということで、エキスパートたちがAngularとReactという陣営に分かれ、それぞれのフレームワークについて疑問点をぶつけたり、議論したりする仮想パネルディスカッションという形式でお伝えします。単なるパネルディスカッションとは違って、<strong>キーワードは「プロレス」</strong>です。まさかりの投げ合い、disり合いOKという形で、<strong>NGワードは「適材適所」「ケースバイケース」</strong>などです。白熱した議論をお楽しみください！</p>

<p><img src="/wp-content/uploads/2015/04/avr-9.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-14521" srcset="/wp-content/uploads/2015/04/avr-9.jpg 640w, /wp-content/uploads/2015/04/avr-9-300x195.jpg 300w, /wp-content/uploads/2015/04/avr-9-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />　<span style="font-size: 80%;">　▲議論が白熱する選手たち。左から、久保田光則さん、金井健一さん、増井雄一郎さん、小林徹さん</span></p>

<h2>選手入場（自己紹介）</h2>

<p><br>
<b>白石：</b>さて、それではプロレスを始めていきましょうか（笑）。まずは、皆さんの簡単なプロフィールと一押しのフレームワークなどを教えてください。
<br><br>
<strong>（React陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-17.jpg" alt="" width="120" height="134" class="alignleft size-full wp-image-14550" /><b>小林：</b>小林徹（@koba04）と申します。前職でソーシャルゲームを作っていました。そのときはBackboneとかAngularとかを使っていて、今はReact.jsに興味があって、業務でも使っていこうかと思っています。　　　　　　　　
<br><br>
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
<br>
<img src="/wp-content/uploads/2015/04/avr-16.jpg" alt="" width="120" height="149" class="alignleft size-full wp-image-14549" /><b>増井：</b>増井雄一郎（@masuidrive）です。一押しのフレームワークは、ReactとFluxなんですが、ReactはViewのライブラリなので、Fluxになるのかなと。複雑なことをやるのは嫌いなので、なるべくシンプルに書けるということでReactとFluxの組み合わせは気に入っています。あとは自由度が高いという点も気に入っています。</p>

<p><br><br>
<strong>（Angular陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-14.jpg" alt="" width="120" height="136" class="alignleft size-full wp-image-14545" /><b>金井：</b>金井健一と申します。フリーランスで、AngularJS Japanユーザーグループの管理人をしています。一押しはAngularですね。Angularは何がいいかというと、フルスタックなところで、悪い面もありますが良い面のほうが多いんじゃないかと思います。学習コストが高いというのもよく言われますが、それだけ機能が多岐に渡っているということなので、いったん使いこなせればすごくいいフレームワークだと思います。
<br><br>
<img src="/wp-content/uploads/2015/04/avr-152.jpg" alt="" width="120" height="145" class="alignleft size-full wp-image-14548" /><b>久保田：</b>久保田光則と申します。アシアルという会社でエンジニアをやっています。会社ではOnsenUIというフレームワークを作っています。3年か4年くらい前からずっとJSとかフロントエンドばっかりやってきていて、ちょっと前はKnockoutJSがいいなと思っていたんですけど、気がついたらずっとAngularJSばっかり書いていました（笑）。Angular2は野心的な方針で、いろんなものを取り込んで最高のものにしていこうという気概が感じられるので注目していかないとなと思っています。
<br></p>

<h2>お互いのフレームワークへの疑問点など</h2>

<p><br>
<b>白石：</b>このパネルディスカッションの今後の流れとしては、僕のほうからは何かコントロールするということはないので、レフェリーみたいなものだと思ってください（笑）。自由にやっていただければと思います。それでは、今回の本題ということで、お互いのフレームワークについて疑問点だったり、disったりということをお願いします。
<br><br>
<b>小林：</b>Angularは、1.04ぐらいのときに使っていて、実際にプロダクトに使ったんですが、結構情報がなくて辛かった思い出があります。DirectiveってよくわからないのでシンプルにControllerとかScopeとかで頑張ってやったという印象がありますね。
<br><br>
<b>金井：</b>当時は、結構そうかも。ただ今は、ドキュメントも充実してきているので今はさほど辛くはないかなと思いますね。Reactはルーティングとかバインディングとかその辺はどこまでできるんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-41.jpg" alt="" width="640" height="395" class="alignnone size-full wp-image-14530" srcset="/wp-content/uploads/2015/04/avr-41.jpg 640w, /wp-content/uploads/2015/04/avr-41-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-41-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>React自体はほんとにViewだけなので、まったくそこはケアしないですね。Fluxは考え方なので、実はすごい小さいんですよ。Dispatcherだけなので数百行ぐらいしかない。あとそこにどうやってルーティングをやるかというのは、React Routerとか外部のコンポーネントを組み合わせて使うので、標準では持っていないです。そこは大きく違いところだと思います。
<br><br>
僕はAngular使っていないんですが、会社（トレタ）のほうでは、PC向けの機能は全部Angularで作ってるんです。でもそこの中の人に聞くと、CRUDみたいなよくあるアプリケーションは結構楽にできて、Angularがなかったら短期間では作れなかったと思うと言われました。ただ、そういうパターンからはずれてしまうとすごい書きにくいかもしれなくて、拡張していくとき、パターンが複雑化してきたときに本当に耐えうるのかが不安と聞きました。そういう傾向ってどうなんですかね？</p>

<p><img src="/wp-content/uploads/2015/04/avr-6.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-14522" srcset="/wp-content/uploads/2015/04/avr-6.jpg 640w, /wp-content/uploads/2015/04/avr-6-300x197.jpg 300w, /wp-content/uploads/2015/04/avr-6-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>久保田：</b>何もかもScopeとかで管理しようとすると結構はまりどころ多いなというイメージがありますね。細かいインタラクションとか、例えばドラッグ＆ドロップを直接使いたいときって、結局DOMを触るしかなくて、DOM触るにはDirectiveっていうものが用意されています。Directiveは、ある程度DOMに対してのいろんな機能を追加するとか、細かいDOMの操作を担当するものなんですよ。全部Controllerで管理しようとするとすごいぐちゃぐちゃになったりするんですけど、ちゃんと自分でDirectiveを作って管理すると扱いやすいと思います。
<br><br>
<b>増井：</b>なるほど。あと、Angular1系と2系ってはたから見てると、2系が年末だか来年だかに出て、結構互換性がないっていう話で、1系は捨てちゃうっていうことを聞いてそこはちょっと怖いかなっていう印象はありますね。
<br><br>
<b>金井：</b>2系が主流になって、1系が減ってこない限りはサポートするという話ですね。なので、そこは早いうちにアップデートしないといけないかもしれません。
<br><br>
<b>増井：</b>でもアップデートってまるまる書き直しなんですよね？
<br><br>
<b>久保田：</b>ng-japanでもアナウンスされてましたが、Angular2とAngular1を共存する方法はあって、1系のコードと2系のコードを混在させることができるようですね。</p>

<h2>今からフレームワークを採用するとしたらどちらを使う？</h2>

<p><br>
<b>増井：</b>今から新しくプロジェクト始めるときにどのフレームワークで作ろうかみたいなときに、実際に作る人は悩むんですかね。
<br><br>
<b>白石：</b>実際、今作ろうと思っているものがあるんですが、悩みますね。
<br><br>
<b>金井：</b>なんでそこはAngularじゃないんですか（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-11.jpg" alt="" width="640" height="399" class="alignnone size-full wp-image-14528" srcset="/wp-content/uploads/2015/04/avr-11.jpg 640w, /wp-content/uploads/2015/04/avr-11-300x187.jpg 300w, /wp-content/uploads/2015/04/avr-11-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Angularはでかくて複雑すぎて怖いんですよね。しかもAngular2が迫っているという。この今のタイミングで採用するのはちょっと怖い。
<br><br>
<b>増井：</b>そういう意味では、僕はReact.jsがなくなっても、React.jsと同じものを書ける自信があるんですよ。FluxとReact.jsをまるっとFacebookがやめました、明日からReactはありませんと言われたときに、僕はReact全体をメンテナンスできる。まるっと同じものを作れっていわれたら、まあ頑張って作れる。Angularは作れる気がしない。
<br><br>
<b>金井：</b>作れる気はしないですね（笑）。
<br><br>
<b>増井：</b>僕は結構そこが怖くて。なので、大きいフレームワークは採用しにくいっていう面があります。あと、MVCの上にMVCを乗っけるというのは、その考え方はすごくToo Muchかなと。サーバーサイドは、サーバーサイドでMVCを作っていて、さらにクライアントサイドでMVCを作るわけじゃないですか。MVCの2階建てはアーキテクチャとして本当にいいのかっていうのはすごく思っていますね。
<br><br>
そもそもモデルをデータベースから作って、ちゃんとAPIにしているはずなのに、それをさらにもう一回モデルとして扱う、あんまり効率的じゃないんじゃないかっていう。Reactだけに限ると、MVCのVしかないので、そもそも書いて読んだJSONをそのままViewで表示するってことをやったりするんです。だけど、実はAPIが揃ってると結構なWebアプリケーションで、そもそもモデルまでおこさなくてもいいんじゃないかっていう気がするんですよ。</p>

<p><img src="/wp-content/uploads/2015/04/avr-5.jpg" alt="" width="640" height="388" class="alignnone size-full wp-image-14523" srcset="/wp-content/uploads/2015/04/avr-5.jpg 640w, /wp-content/uploads/2015/04/avr-5-300x182.jpg 300w, /wp-content/uploads/2015/04/avr-5-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>JSONをとってきて出すっていうのはAngularでもできるので、それはアプリの設計によるのかなという気がしています。Angularの場合は、さらにそこから変更もできるという利点があります。
<br><br>
<b>増井：</b>それにしてはToo Muchすぎるんじゃないかと。
<br><br>
<b>金井：</b>それだけしたい場合には確かにそうですね。
<br><br>
<b>増井：</b>結構なケースがそれで済むんじゃないかっていう気はしていて。実はクライアント側でMVCが必要なほど複雑な処理するケースってそんなに多いのかなと。
<br><br>
<b>久保田：</b>まあでも実際には、もちろんアプリの要件によると思います。ハイブリッドアプリって結局JSでなんでもやるので、API叩けばそれで終わりというわけじゃなくて、むしろJSのほうでいろんなことを書かなきゃいけないって感じになるので、API叩けばそれで終わりっていう感じにはならないですよね。
<br><br>
APIってネットワーク越しにやるんでそれってすごく重たいし、あんまりやりたくないっていうのはモバイルアプリだと多いです。そもそもモバイルアプリだとネットワーク繋がらないってこともあるので、それを解決するにはローカルのほうでデータを保持して、繋がったら同期をとるっていう感じになるので、モデルがないとちょっと辛いという感じになりますね。</p>

<h2>JSXは気持ち悪い？</h2>

<p><br>
<b>白石：</b>JSXがキモいんですけど…。
<br><br>
<b>増井：</b>あれは気持ち悪いんですよ実際（笑）。キモいっていうのはまったく異論ないんですけど、あれはあれで理にかなっていると思っています。DOM操作がなんで難しいかっていうとそもそもこのDOMをみたときに、これがいつどこで書き換わるかわからないし、さらにこのボタンを押したときにどこで何が起こるかわからない、イベントは1個じゃなくて100個でも張れるので。っていうのに対してJSXの場合はそういうのを一応ビューとロジックを同じところに書くことで、さらにイベントリスナーを1対1にすることによって、そういう複雑性を省きましょうという考え方なので、気持ち悪いことは認めつつ、理にはかなっているかなと。
<br><br>
1番の問題は、HTMLしか書けない人がこれを触れないっていう。コーダーと分離ができないっていう点ですよね。ただこれはもっと根本的な問題で、Reactは画面の一部をコンポーネントとしてスコープを作りましょうっていう考え方で、HTMLを切ってるんじゃなくて、プログラミングスコープを切ってるんですよ。それって見た目のデザインとはちょっと違って、アーキテクチャのデザインの話なので、見た目とロジックを切り離すっていうところに、そもそも無理があるじゃないかっていうことですね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-8.jpg" alt="" width="640" height="400" class="alignnone size-full wp-image-14534" srcset="/wp-content/uploads/2015/04/avr-8.jpg 640w, /wp-content/uploads/2015/04/avr-8-300x188.jpg 300w, /wp-content/uploads/2015/04/avr-8-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>そこらへん（画面の一部をコンポーネントとしてスコープを作る）は、Angularも目指すところは同じかもしれないですね。
<br><br>
<b>増井：</b>そのやり方が違うってだけなんでしょうね。
<br><br>
<b>久保田：</b>ちょっといいですか。別にJSXって気持ち悪くなくないですか。
<br><br>
<b>小林：</b>私も全然違和感ない（笑）。
<br><br>
<b>白石：</b>人によるんだ。
<br><br>
<b>増井：</b>僕も去年からReactを知ってたのに触ってなかったのは、JSXです（笑）。あれで毛嫌いして触らなくて、でもあんまり話題になってるので去年の年末年始から本格的に触ってみたというのがあります。あれは僕個人も気持ち悪いです（笑）。
<br><br>
<b>小林：</b>ぱっと見たときに、あれ（JSX）がやりたいフレームワークなのかなと思っちゃうんですよね。
<br><br>
<b>増井：</b>日本でのReactの評価は、Virtual DOMっていう技術キーワードとJSXという見た目にすごく左右されている印象がありますね。</p>

<h2>Virtual DOMって本当に早いんですか？</h2>

<p><br>
<b>白石：</b>Virtual DOMって本当にそんなに早かったりするんですか。ぱっと考えると差分をComputeとする計算処理も必要だし、フロントのDOMと仮想DOMって2つ持っているメモリも喰いそうだなと思うんですけど、実際はどうなんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-10.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-14524" srcset="/wp-content/uploads/2015/04/avr-10.jpg 640w, /wp-content/uploads/2015/04/avr-10-300x193.jpg 300w, /wp-content/uploads/2015/04/avr-10-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>実際は何が一番早いかっていうのはやっぱりDOMを直接触るのが一番早いっていうのは間違いなくて、でもそれってコードとしても複雑になるじゃないですか。モデルのデータの変更された部分だけをどういう風に反映するのかっていうところが煩雑になる。Virtual DOMだと、ひとつの状態をもっておいて、パっと更新すると差分だけを綺麗に反映してくれるので、DOMを直接触るよりは遅いですが、該当部分のDOMを全部入れ替えるよりは早いという感じです。最速ではない。
<br><br>
<b>白石：</b>最速ではないと。わりとプログラマーがいい加減な処理をしてもいいってことですね。
<br><br>
<b>増井：</b>Reactはとりあえずざっくり書けば、そこそこ速いっていうような考えですね。
<br><br>
<b>久保田：</b>最近、Atomで内部でReact使ってたけどパフォーマンスのために削除したっていう話がありましたね。
<br><br>
<b>白石：</b>え、そうなんですか。もう使わなくなっちゃったんだ。
<br><br>
<b>小林：</b>最初のやつがちゃんと構造化されていなくて遅かったのをReactにして、ちょっと速くなって。そこをベースにDOM職人が頑張ってやったらさらに早くなったっていう感じですね。</p>

<h2>Angularは謎のルールが多い</h2>

<p><br>
<b>白石：</b>Angularを触ったり調べたりしたときに僕的には謎のルールがすごい多くてとっつきにくかった。例えば、$変数が多すぎ。何々のときは$なんとかが多くて、なんだこれはっていう（笑）。
<br><br>
<b>金井：</b>あれ何なんでしょうね。$$とかあるしね（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-7.jpg" alt="" width="640" height="397" class="alignnone size-full wp-image-14535" srcset="/wp-content/uploads/2015/04/avr-7.jpg 640w, /wp-content/uploads/2015/04/avr-7-300x186.jpg 300w, /wp-content/uploads/2015/04/avr-7-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Dependency Injectionを実装したのはいいんだけど、まず引数の名前で当てるからminifyしないでねとか、minifyしてもいいように別の書き方も発明したよとか配列で指定できるようになったりとか。なんかもう歴史上の問題かもしれないんですけど、謎ルールが多すぎる感があるんですけど。そこらへんはどうなんでしょう？
<br><br>
<b>久保田：</b>やっぱりそこは気持ち悪いなと思います。でも昔からずっと実務上の必要からそういうのが増えてきたのかなと思いますね。あとから来た方がどうしたもの洗練されたものになっていくので…。
<br><br>
<b>増井：</b>Angularっていつできたんでしたっけ？
<br><br>
<b>金井：</b>結構前で、2009年ですね。
<br><br>
<b>増井：</b>そんなに前なんだ！
<br><br>
<b>金井：</b>Angular1が2012年ぐらいなので、そこで注目された感じですね。2009年にできたフレームワークが5年くらい経って実用になりつつも、辛くなってきたということでAngular2を開発しているということだと思います。Angularのいいところっていうのは、その時々で結構先のことを見据えてやろうとしていて、1系だとWeb Componentsを実装したくてDirective作ったりしてるし、Object.observe()欲しいよねっていって2way bindingを実装してみたりとか。どんどん攻めてるんですよね。
<br><br>
<b>増井：</b>そういうイメージはありますね。</p>

<h2>実はReactは大きい</h2>

<p><br>
<b>白石：</b>ちなみにフレームワークの大きさでいうとどうなんでしょう。
<br><br>
<b>増井：</b>ReactってViewのライブラリだけのくせにすごいでかいんですよ。へたしたらjQueryよりでかい。
<br><br>
<b>金井：</b>フレームワークのサイズが大きいと、モバイルのユースケースで叩かれませんか、重いとか。Angularは相当叩かれた覚えがあります（笑）。
<br><br>
<b>増井：</b>とはいっても画像ひとつ分ぐらいですからね。Reactも実際よくあるReactのダメなところに「でかい」っていうのはいろいろ言われていて、でも現実ユーザーからそういう話があがってるわけではなく、数字で見てっていう部分があります。あと、Reactはサーバーサイドレンダリングを持っているので、ファーストビューはサーバーサイドで出しちゃって、その後にJS読み込むっていうことができるので、そういう意味では十分早いですね。面倒くさいですけど、やろうと思えばできます。
<br><br>
<b>白石：</b>今、ダウンロードしてみたんですけど、Angularがminify時で126KBで、Reactが121KBという結果に。</p>

<p><img src="/wp-content/uploads/2015/04/avr-13.jpg" alt="" width="640" height="394" class="alignnone size-full wp-image-14538" srcset="/wp-content/uploads/2015/04/avr-13.jpg 640w, /wp-content/uploads/2015/04/avr-13-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-13-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>しかも、AngularはMVCで、ReactはVだけで、ですからね（笑）。
<br><br>
<b>金井：</b>やれること全然違う。（Angularは）ルーティングからバインディングからすべてできるのに（笑）。</p>

<h2>検索可能にするサーバーサイドレンダリング</h2>

<p><br>
<b>増井：</b>Reactのひとついいところは、サーバーサイド生成ができるのでぐぐったときに引っかかるんですよね。クローラーは基本的にはJSを実行しないので、みんなテンプレートにはじめから引っかかりそうなキーワードを入れたりとかして頑張るんですけど。でもReactはサーバーサイド（Node.js）でReactエンジンを実行してHTMLを生成することができるんですよ。そうすると例えば、基本的な部分をファーストビューで表示すると、JSが実行されなくてもHTMLで画面が見えて、JSが実行されると残りの部分が表示されるという段階的にできるですよ。
<br><br>
そうすれば、検索エンジンに引っかかるし、JSがもし（ブラウザで）動作しなくても本文はちゃんと読めるというメリットがあります。といってもそれをやるには、それなりに考えて書かなきゃならなきゃいけなかったり、その実行エンジンをいろいろセットアップしなきゃいけないので、手放しでできるっていうわけでもないんですが。</p>

<p><img src="/wp-content/uploads/2015/04/avr-12.jpg" alt="" width="640" height="384" class="alignnone size-full wp-image-14537" srcset="/wp-content/uploads/2015/04/avr-12.jpg 640w, /wp-content/uploads/2015/04/avr-12-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-12-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>海外はやっぱりReact導入してるところは、サーバーサイドレンダリングもやっているところが多いですね。海外のほうがサーバーにNode.jsを使うのは結構一般的で、日本だとあんまりないから意外なんですけど。サーバーサイドレンダリングできるからReact採用してるっていうとこも結構ありますね。BBCとか。
<br><br>
<b>増井：</b>ぐぐれるっていうのはでかいですからね。
<br><br>
<b>白石：</b>なるほど。じゃあAngularのほうは、どうですか？
<br><br>
<b>久保田：</b>まあAngular2に期待ですね。Angular2のレンダリングのアーキテクチャについて設計文書が公開されていて、その中でVirtual DOMを使いますと言っています。
<br><br>
<b>小林：</b>Ember.jsも次のバージョンでHTMLbarsとsimple-domを組み合わせてサーバーサイドレンダリングできるようになる予定で、これからのフレームワークはサーバーサイドレンダリングはついてきそうな気がしますね。
<br><br>
<b>久保田：</b>あと、ちょっと面白いと思ったのがサーバーサイドレンダリングだけでなく、Viewの処理をWeb Workerでやりたいっていう点ですね。
<br><br>
<b>増井：</b>Web WorkerはReactでもやるっていってますね。そんなに進んでないですが。
<br><br>
<b>白石：</b>確かに仮想DOMは、本物のDOMじゃないからWorkerでいじれるし、間のメッセージングにコストがかからなければ割と早そうですね。
<br><br>
<b>増井：</b>そこ（Reactの仮想DOM）の差分の計算までWorkerでやってしまうので、それなりの速度がでるはずですね。ChromeもServiceWorkerとか機能を強化してるのでたぶんそういうのに合わせてるんだろうなと思います。</p>

<h2>開発速度・生産性の比較</h2>

<p><br>
<b>小林：</b>たぶんReact使っても開発速度って上がらない。書く量も結構増えますね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-18.jpg" alt="" width="640" height="406" class="alignleft size-full wp-image-14553" srcset="/wp-content/uploads/2015/04/avr-18.jpg 640w, /wp-content/uploads/2015/04/avr-18-300x190.jpg 300w, /wp-content/uploads/2015/04/avr-18-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>むしろ下がります（笑）。プログラムでひとつ大事なところは、1年後に触れるかどうかだと思っていて、よくプログラムは書くより読む時間、回数のほうが多いので読むことを考えて書くべきだって言う考えがありますよね。時間がかかっても読みやすく書いて、それによってコード量が増えるのはプログラムとしてしょうがないんじゃないかっていう考えがあって、Reactはそういう考えに近いですね。なので記述量は減らないし、同じの書いたら5〜10倍ぐらいになっちゃっていう話もあって、あきらかにめんどくさいです。
<br><br>
<b>金井：</b>AngularJSは、預ける部分が大きいので、勝手にやってくれる。コード量は圧倒的に減りますね。なのでCRUD系作るときはすごく早いです。</p>

<h2>おわりに</h2>

<p>このように議論はすごく白熱して、興味深いトピックスが目白押しでした。楽しんでいただけましたでしょうか。今回は「議論は平行線だった」ということで終わりたいと思います。</p>

<p><img src="/wp-content/uploads/2015/04/avr-1.jpg" alt="" width="640" height="385" class="alignnone size-full wp-image-14515" srcset="/wp-content/uploads/2015/04/avr-1.jpg 640w, /wp-content/uploads/2015/04/avr-1-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-1-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>HTML5 Experts.jpはなぜこんなにパフォーマンスが悪いのか…全てお見せします！ーWebパフォーマンス改善企画（改善編）</title>
		<link>/yoshikawa_t/14608/</link>
		<pubDate>Wed, 22 Apr 2015 00:00:46 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[高速化]]></category>

		<guid isPermaLink="false">/?p=14608</guid>
		<description><![CDATA[Webパフォーマンス改善企画（改善編）は、実際の改善内容とその結果をお伝えします！パフォーマンス分析を行った解析編は、こちらからご覧ください。本記事はHTML5 Experts.jpがいかにして速くなったのかを包み隠さず...]]></description>
				<content:encoded><![CDATA[<p>Webパフォーマンス改善企画（改善編）は、実際の改善内容とその結果をお伝えします！パフォーマンス分析を行った解析編は、<a href="https://html5experts.jp/yusuke-naka/13671/" target="_blank" data-wpel-link="internal">こちら</a>からご覧ください。本記事はHTML5 Experts.jpがいかにして速くなったのかを包み隠さずお伝えします！</p>

<h2>今回の前提条件と改善ポイント</h2>

<p>実際の改善を行う前にいくつか前提条件を説明しなければいけません。まず動作環境ですが、HTML5 Experts.jpは、WordPress上で動作しており、改善内容はプラグインの導入やPHPのコード修正が主になっています。ただ、そういったWordPressの泥臭いチューニングは本題ではないので、細かく解説するのではなく大まかな改善内容とその方針を説明したいと思います。また、改善内容に関しても費用対効果がある程度高いものを優先しているため、まだまだ改善できるというところも、あえてそのままにしているところもあります。</p>

<p>今回の改善内容は、前回の分析結果から以下のようになっています。その分析内容などについては<a href="https://html5experts.jp/yusuke-naka/13671/" target="_blank" data-wpel-link="internal">解析編</a>をご確認ください。以下の改善ポイントとその順番に沿って解説していきます。（順番は、改善内容の導入のしやすさや影響の大きさなどを考慮して実際に実施した順序になっています）</p>

<h3>改善ポイント</h3>

<ol>
<li>ソーシャルメディア系サービス（シェアボタンなど）のパフォーマンスを改善する</li>
<li>実際の表示サイズより大きな画像は適正なサイズに変更する</li>
<li>マークアップを改善する（書き方やJSのミニファイ等）</li>
<li>WordPressのキャッシュを導入する</li>
<li>Keep Aliveが全ての環境で効いているか、設定時間は適切かを確認し、コンテンツダウンロード時間を最適化する</li>
</ol>

<h2>ソーシャルメディア系サービスのパフォーマンスを改善する</h2>

<p>まず最初に着手したのは、ソーシャルメディア系のガジェットなどです。HTML5 Experts.jpでは、トップページにはTwitterのタイムラインとFacebookのウィジット、記事ページには、各種シェアボタンとFacebookのコメントを埋め込んでいました。これらのソーシャル系のガジェットは、多数のリソースを読み込んだり、スクリプトによるメインスレッドのブロッキングなどでユーザーの体感スピードを劣化される主たるものです。まずは、不要なガジェットの整理ということで、ほぼ利用がなく効果が不明なTwitterのタイムライン、Facebookのウィジット、Facebookのコメントは完全に削除することにしました。これだけで、トップページからはソーシャル系のガジェットが完全になくなることになります。次に記事ページのソーシャルボタンですが、ソーシャルボタンのスクリプトを読み込まないように自作することにしました。現在（改善後）のソーシャルボタンは次のようになっているはずです。</p>

<div style="overflow:hidden">

<div id="attachment_14614" style="width: 310px" class="wp-caption alignleft"><a href="https://html5experts.jp/wp-content/uploads/2015/04/1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/1-300x111.png" alt="PC版ソーシャルボタン" width="300" height="111" class="size-medium wp-image-14614" srcset="/wp-content/uploads/2015/04/1-300x111.png 300w, /wp-content/uploads/2015/04/1.png 640w, /wp-content/uploads/2015/04/1-207x77.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">PC版ソーシャルボタン</p></div>

<div id="attachment_14612" style="width: 310px" class="wp-caption alignright"><a href="https://html5experts.jp/wp-content/uploads/2015/04/2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/2-300x188.png" alt="モバイル版のソーシャルボタン" width="300" height="188" class="size-medium wp-image-14612" srcset="/wp-content/uploads/2015/04/2-300x188.png 300w, /wp-content/uploads/2015/04/2.png 640w, /wp-content/uploads/2015/04/2-207x129.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">モバイル版のソーシャルボタン</p></div>

</div>

<p>これらのソーシャルボタンでは、例えばTwitterのツイートなどを直接リンクで指定しており、onclickで小さいウィンドウが開くように変更しています。そのため、APIを利用しなければ実現できないFacebookの「いいね」と、Google+の「+1ボタン」は、いずれもシェアボタンに変更しています。各ボタンのカウント数については、サーバー側でキャッシュして表示する「<a href="https://wordpress.org/plugins/sns-count-cache/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SNS Count Cache</a>」というプラグインを導入して利用しています。</p>

<p>ソーシャルメディア系のガジェットの改善は非常に効果が大きく、以下のようにPC版の記事ページでは、ページの読み込み時間が5秒近辺だったものが、2.5秒のほどに劇的に改善しています。また、バラツキがあった計測時間が小さい範囲に収まるように収束しています。</p>

<div id="attachment_14637" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/1f383cad650cc18c4117859a5dd8b09a.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/1f383cad650cc18c4117859a5dd8b09a.png" alt="PC版記事ページの読み込み時間（折れ線グラフ）" width="640" height="276" class="size-full wp-image-14637" srcset="/wp-content/uploads/2015/04/1f383cad650cc18c4117859a5dd8b09a.png 640w, /wp-content/uploads/2015/04/1f383cad650cc18c4117859a5dd8b09a-300x129.png 300w, /wp-content/uploads/2015/04/1f383cad650cc18c4117859a5dd8b09a-207x89.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">PC版記事ページの読み込み時間（折れ線グラフ）</p></div>

<div id="attachment_14639" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/f9d6dee4735766d6f598297f7eea2ff8.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/f9d6dee4735766d6f598297f7eea2ff8.png" alt="PC版記事ページの読み込み時間（スキャッタプロット）" width="640" height="305" class="size-full wp-image-14639" srcset="/wp-content/uploads/2015/04/f9d6dee4735766d6f598297f7eea2ff8.png 640w, /wp-content/uploads/2015/04/f9d6dee4735766d6f598297f7eea2ff8-300x143.png 300w, /wp-content/uploads/2015/04/f9d6dee4735766d6f598297f7eea2ff8-207x99.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">PC版記事ページの読み込み時間（スキャッタプロット）</p></div>

<h2>実際の表示サイズより大きな画像は適正なサイズに変更する</h2>

<p>次は画像サイズの縮小です。HTML5 Experts.jpでは既に画像の最適化を行う「<a href="https://wordpress.org/plugins/ewww-image-optimizer/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">EWWW Image Optimizer</a>」プラグインを導入済みでしたが、画像のサイズ自体はあまりケアしていませんでした。そのため、記事によっては原寸サイズの画像を貼り付けているものもあり、ダウンロード容量が非常に多いページもありました（WordPressの場合、画像を挿入する際にサイズを選択できます）。また、お恥ずかしながら、アイキャッチ画像を設定している記事については、記事一覧でサムネイルに原寸サイズの画像が表示されるというバグも見つかりました。そこで、以下のように対応することに決めました。</p>

<ul>
<li>画像の最大サイズをPC版記事ページの横幅に合わせ640pxとする</li>
<li>画像の最大サイズより大きな画像がアップロードされた場合、強制的にリサイズする</li>
<li>記事一覧で、適切なサイズのサムネイル画像を表示するように変更</li>
</ul>

<div style="overflow:hidden">

<div id="attachment_14634" style="width: 310px" class="wp-caption alignleft"><a href="https://html5experts.jp/wp-content/uploads/2015/04/2f9ed77130ae7997b32a9c805d94efd8.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/2f9ed77130ae7997b32a9c805d94efd8-300x230.png" alt="画像の最大サイズ" width="300" height="230" class="size-medium wp-image-14634" srcset="/wp-content/uploads/2015/04/2f9ed77130ae7997b32a9c805d94efd8-300x230.png 300w, /wp-content/uploads/2015/04/2f9ed77130ae7997b32a9c805d94efd8.png 640w, /wp-content/uploads/2015/04/2f9ed77130ae7997b32a9c805d94efd8-207x159.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">画像の最大サイズ</p></div>

<div id="attachment_14635" style="width: 310px" class="wp-caption alignright"><a href="https://html5experts.jp/wp-content/uploads/2015/04/51388cdcdf3a9a76de3d0c7ddccd3b17.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/51388cdcdf3a9a76de3d0c7ddccd3b17-300x287.png" alt="記事一覧のサムネイル画像" width="300" height="287" class="size-medium wp-image-14635" srcset="/wp-content/uploads/2015/04/51388cdcdf3a9a76de3d0c7ddccd3b17-300x287.png 300w, /wp-content/uploads/2015/04/51388cdcdf3a9a76de3d0c7ddccd3b17.png 640w, /wp-content/uploads/2015/04/51388cdcdf3a9a76de3d0c7ddccd3b17-207x198.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">記事一覧のサムネイル画像</p></div>

</div>

<p>まず初めに、画像の最大サイズを変更します。WordPressでは画像のサイズを設定画面で変更することができ、デフォルトでは「大サイズ」の設定値は1024&#215;1024に設定されている部分を640&#215;640に変更します。しかし、これだけでは編集者が誤ってフルサイズの画像を挿入することができてしまうため、それより大きい画像がアップロードされた場合に強制的に640&#215;640にリサイズするようにします。これは、「<a href="https://wordpress.org/plugins/imsanity/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Imsanity</a>」というプラグインを導入することで解決しました。</p>

<p>次に、記事一覧で適切なサイズのサムネイル画像を表示するように変更します。PC版の場合、サムネイル画像の表示サイズは幅207pxとなっていたため、それに合わせて画像をアップロードする際に自動的に幅207pxのサムネイル画像を作成するように変更しました。同時に、記事一覧を出力する際にサイズを指定して画像を表示するようにコードを修正しています。（これらの詳細なコードは例示しませんが、<code>add_image_size</code> <code>the_post_thumbnail</code> <code>wp_get_attachment_image_src</code> 等のキーワードを調べていただければ見つかるかと思います）</p>

<p>ここでモバイル版について考慮されていないと気がついた方がいらっしゃるかもしれません。モバイル版のサムネイル画像のサイズは、幅93pxとなっていましたが、これをこのまま適用してしまうと高精細なディスプレイではぼやけてしまうため、そのままPC版と同じものを表示するようにしました。本来であれば、レスポンシブイメージを採用するのが理想だと思いますが、この時点ではリソースの問題から断念しています。</p>

<p>最後に、既存の画像ファイルに対して、これらの変更を反映する必要があります。最大サイズの変更と新たなサムネイル画像の表示サイズの追加については、「<a href="https://wordpress.org/plugins/ajax-thumbnail-rebuild/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">AJAX Thumbnail Rebuild</a>」というプラグインを使ってバックグラウンドですべて処理しました。その後、「Imsanity」、「EWWW Image Optimizer」プラグインについても、既存の画像に対するオプション機能を使って再処理を実施しました。これで、すべての画像は適正なサイズに変更されたことになります。</p>

<h2>マークアップを改善する（書き方やJSのミニファイ等）</h2>

<p>ここで実施するのは、不要なスクリプトやスタイルを整理したり、ファイルの結合やミニファイなど、一般的なWebパフォーマンスのベストプラクティスに近いものです。しかしながら、WordPressではすべてのページでjQueryを読み込んでいたり、いろいろなプラグインがそれぞれファイルを読み込んでいたりと、かなり奔放な状況です。そのため、実際の作業はここが一番泥臭く、複雑なものになりました。改善内容は、主に以下のようなものです。</p>

<ol>
<li>すべてのページで読み込んでいるスクリプト、スタイルを調査する</li>
<li>不要なスクリプト、スタイルを削除する</li>
<li>スクリプト、スタイルの移動、結合とミニファイ（「<a href="https://wordpress.org/plugins/autoptimize/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">Autoptimize</a>」プラグイン）</li>
</ol>

<p>まず、1番と2番ですが、初めにすべてのページで読み込んでいるスクリプト、スタイルを調べます。HTML5 Experts.jpの場合、主にトップページ、記事ページ、その他のページの3種類になります。その他のページにもいくつか種類がありますが、スクリプト・スタイル構成は似たようなものになるので、ここでは省略しています。また、上記3種類がそれぞれPC版、モバイル版とあるので計6種類ということになります。これらの各ページでは、HTMLソースコード内のべた書き（scriptタグなど）やWordPress上で読み込まれているリソース、実際にブラウザに表示されているページ上で読み込まれているファイルなどを調べます。（WordPress上では、<code>wp_enqueue_scripts</code>をフックしてそれぞれのハンドル名を表示します）</p>

<p>その後に、どのプラグインが読み込んでいるのか、それらは本当に必要かどうかを判断します。プラグイン自体が不要であればプラグインを削除し、スクリプトやスタイルの読み込みのみを止めたいのであれば設定変更で対応可能か判断し、最終的にはWordPress上で個別の種類のページに対してスタイルを削除します。例えば、「<a href="https://wordpress.org/plugins/facebook/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">Facebook</a>」公式プラグインは、すべてのページでFacebookのスクリプトを読み込むようになっており、ソーシャルボタンを廃止した関係もあって完全に削除しています。その際にプラグインが提供していたOGP設定などは手動で追加しています。また、モバイル版のトップページではjQueryは不要のため、トップページでのみjQueryを読み込まないといった形になっています。（WordPress上では、<code>wp_enqueue_scripts</code>をフックしてif文でそれぞれのページ上で<code>wp_dequeue_script</code>や<code>wp_dequeue_style</code>などでスクリプトやスタイルを読み込まないようにしています）</p>

<p>そして肝心の改善結果ですが、実は問題があり、ページのHTTPリクエストから最初のデータが返ってくるまでの時間（TTFB: Time To First Byte）が遅延するという事象が発生しました。これは、元々WordPressではDBアクセスなどがあり、時間がかかっていた箇所でしたが、加えて今回のAutoptimizeがファイルの結合、ミニファイを行うためにバッファを読み込んで処理している関係でさらにTTFBが伸びるという結果になりました。そのため、スクリプト・スタイルのファイル数とサイズが減ったにも関わらず、結果としてパフォーマンスは相殺され、逆にロード時間が若干長くなるという状態になりました。そのため、Autoptimizeを導入する場合は、基本的には後述するキャッシュを導入する必要があるという結論となりました。</p>

<div id="attachment_14698" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/06f12203127cb2f6f66297b4c0302326.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/06f12203127cb2f6f66297b4c0302326.png" alt="TTFBの遅延（ウォーターフォール図）" width="640" height="293" class="size-full wp-image-14698" srcset="/wp-content/uploads/2015/04/06f12203127cb2f6f66297b4c0302326.png 640w, /wp-content/uploads/2015/04/06f12203127cb2f6f66297b4c0302326-300x137.png 300w, /wp-content/uploads/2015/04/06f12203127cb2f6f66297b4c0302326-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">TTFBの遅延（ウォーターフォール図）*青い部分がTTFB</p></div>

<h2>WordPressのキャッシュを導入する</h2>

<p>WordPressは、簡単にページを構成して表示できる反面、PHPの処理やDBアクセスが発生するため、TTFBが遅くなりがちです。そのため、HTML5 Experts.jpのような、ある程度表示内容が変わらないサイトの場合はキャッシュプラグインを導入するのが望ましいでしょう。今回、キャッシュプラグインには、ページキャッシュ、オブジェクトキャッシュ、DBキャッシュの3つが可能な「<a href="https://wordpress.org/plugins/w3-total-cache/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">W3 Total Cache</a>」と、WordPressのUIの日本語化のための翻訳ファイルをキャッシュする「<a href="https://wordpress.org/plugins/mo-cache/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">MO Cache</a>」を導入しました。いくつかあるキャッシュプラグインのうち、W3 Total Cacheを採用した理由は、現在PC版、モバイル版のテーマを「<a href="https://wordpress.org/plugins/multi-device-switcher/" target="_blnak" data-wpel-link="external" rel="follow external noopener noreferrer">Multi Device Switcher</a>」でブラウザ（UA）によって切り替えていますが、W3 Total CacheにはUser Agent Groupごとにキャッシュできる仕組みがあることです。</p>

<p>これにより、現在はアクセスのある記事ページなどは、キャッシュが1時間保持されるような設定になっています。キャッシュは記事が公開されるとクリアされ、再度アクセスがあるとキャッシュされるようになっています。そのため最初に記事にアクセスした人は若干遅いと感じることがあるかもしれません。また、ソーシャルボタンなどのカウント数も即時には反映されなくなっています。</p>

<p>キャッシュを導入した結果、なんと2〜3秒かかっていたTTFBが100ms前後にまで改善しました。体感速度でもかなり快適に表示されるように、非常に高い効果がありました。</p>

<div id="attachment_14705" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/f78ae094a542122a7b48050891f1887e.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/f78ae094a542122a7b48050891f1887e.png" alt="TTFBの改善（ウォーターフォール図）" width="640" height="277" class="size-full wp-image-14705" srcset="/wp-content/uploads/2015/04/f78ae094a542122a7b48050891f1887e.png 640w, /wp-content/uploads/2015/04/f78ae094a542122a7b48050891f1887e-300x130.png 300w, /wp-content/uploads/2015/04/f78ae094a542122a7b48050891f1887e-207x90.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">TTFBの改善（ウォーターフォール図）</p></div>

<h2>Keep Aliveが全ての環境で効いているか、設定時間は適切かを確認し、コンテンツダウンロード時間を最適化する</h2>

<p>モバイルでKeep Aliveが効いていない問題については、結論からいうと、HTML5 Experts.jpで利用しているHTTPサーバーであるnginxの仕様が問題となっていました。元々、SafariにはKeep-Aliveが効いていると、ファイルがアップロードできないというバグ（該当のissueは<a href="https://bugs.webkit.org/show_bug.cgi?id=5760" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>）があり、それに対応する形でnginx側はSafariに対してデフォルトでKeep-Aliveを無効にするという対策を取っています（<a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_disable" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><code>keepalive_disable</code></a>の設定）。HTML5 Experts.jpでは、ユーザーがファイルをアップロードするユースケースはないので、nginxの設定に&#8221;keepalive_disable none;&#8221;を指定してKeep-Aliveの無効を取り消しています。また同時に、Keep-Aliveのタイムアウトをデフォルトの75秒から20秒に変更しています。これは、現状の読み込み完了までの時間が20秒を超えることはほぼないためです。</p>

<p>その結果、モバイルでも同時接続数分のコネクション（別ドメインの接続を除く）を確保した以降は、Initial Connectionが消え、全体で2秒近く高速になりました。これを見ると、別ドメインへのアクセスを整理することによってもう少し効率化できそうではありますが、今回はここまでとしました。</p>

<div id="attachment_14713" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/92aca65bdef067d637b7d516a27affac.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/92aca65bdef067d637b7d516a27affac.png" alt="モバイルのタイムライン（ウォーターフォール図）" width="640" height="410" class="size-full wp-image-14713" srcset="/wp-content/uploads/2015/04/92aca65bdef067d637b7d516a27affac.png 640w, /wp-content/uploads/2015/04/92aca65bdef067d637b7d516a27affac-300x192.png 300w, /wp-content/uploads/2015/04/92aca65bdef067d637b7d516a27affac-207x133.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">モバイルのタイムライン（ウォーターフォール図） *Initial Connecctionはオレンジ色の部分</p></div>

<h2>まとめ</h2>

<p>これまで5つの改善ポイントについて、記事中の通り改善を実施してきました。これによってどのようにパフォーマンスが改善したのかを、この企画における全期間中のパフォーマンストレンドの推移でご覧いただきたいと思います。</p>

<div id="attachment_14760" style="width: 610px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/11164093_10205366450694456_612702970_n.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/11164093_10205366450694456_612702970_n.jpg" alt="全期間中のパフォーマンストレンドの推移（PC版）" width="600" height="300" class="size-full wp-image-14760" srcset="/wp-content/uploads/2015/04/11164093_10205366450694456_612702970_n.jpg 600w, /wp-content/uploads/2015/04/11164093_10205366450694456_612702970_n-300x150.jpg 300w, /wp-content/uploads/2015/04/11164093_10205366450694456_612702970_n-207x104.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a><p class="wp-caption-text">全期間中のパフォーマンストレンドの推移（PC版）</p></div>

<div id="attachment_14761" style="width: 610px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/11118066_10205366461014714_1779935700_n.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/11118066_10205366461014714_1779935700_n.jpg" alt="全期間中のパフォーマンストレンドの推移（モバイル版）" width="600" height="400" class="size-full wp-image-14761" srcset="/wp-content/uploads/2015/04/11118066_10205366461014714_1779935700_n.jpg 600w, /wp-content/uploads/2015/04/11118066_10205366461014714_1779935700_n-300x200.jpg 300w, /wp-content/uploads/2015/04/11118066_10205366461014714_1779935700_n-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a><p class="wp-caption-text">全期間中のパフォーマンストレンドの推移（モバイル版）</p></div>

<p>いずれも大きく改善され、PC版では5秒台から2秒以下に、モバイル版では20秒前後で大きく揺れていたものが安定して8秒近辺に落ち着いています。これらの結果を受けて、解析編で掲げた改善目標が達成されているかどうかを、個別のデータで確認していきたいと思います。</p>

<h3>改善目標</h3>

<ol>
<li>Total Time（サイトにアクセスした時点からブラウザ上でコンテンツ表示が完了するまでの時間）は2秒を切る</li>
<li>アクセスした際のTotal Timeに関する品質を一定にする（ばらつきをなくして一定にする）</li>
<li>3G回線からのTotal Timeに関するアクセス品質をブロードバンド回線のそれに近づける</li>
</ol>

<p>まずは、改善後のPC版の各ブラウザの計測結果を見ていきましょう。 次のグラフは、トップページの1日の計測結果です。（時間帯によってはネットワーク品質に揺れがあり、計測結果が多少上下します。）</p>

<div id="attachment_14731" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/6ff19498d0260feeede914b24cb57df6.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/6ff19498d0260feeede914b24cb57df6.png" alt="PC版のTotal Time（折れ線グラフ） *Chrome、Firefox、IE" width="640" height="359" class="size-full wp-image-14731" srcset="/wp-content/uploads/2015/04/6ff19498d0260feeede914b24cb57df6.png 640w, /wp-content/uploads/2015/04/6ff19498d0260feeede914b24cb57df6-300x168.png 300w, /wp-content/uploads/2015/04/6ff19498d0260feeede914b24cb57df6-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">PC版のTotal Time（折れ線グラフ） *Chrome:黄色、Firefox:青、IE:赤</p></div>

<p>それぞれの平均Total Timeは、Chromeが1.59秒、Firefoxが1.657秒、IEが1.125秒という結果となりました。<strong>当初目標の「Total Timeは2秒を切る」という点では、余裕を持ってクリアしています</strong>。特にIEの場合、1秒を切るケースもあり非常に高速です。次に同じデータをスキャッタプロットで分布を見てみましょう。</p>

<div id="attachment_14739" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/685b2b40e0bf4944bb04731ed376bf7f.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/685b2b40e0bf4944bb04731ed376bf7f.png" alt="PC版のTotal Time（スキャッタプロット） *Chrome:薄緑、Firefox:オレンジ、IE:青" width="640" height="312" class="size-full wp-image-14739" srcset="/wp-content/uploads/2015/04/685b2b40e0bf4944bb04731ed376bf7f.png 640w, /wp-content/uploads/2015/04/685b2b40e0bf4944bb04731ed376bf7f-300x146.png 300w, /wp-content/uploads/2015/04/685b2b40e0bf4944bb04731ed376bf7f-207x101.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">PC版のTotal Time（スキャッタプロット） *Chrome:薄緑、Firefox:オレンジ、IE:青</p></div>

<p>スキャッタプロットで見ると、各点がきちんと下に寄っているのがわかります。はずれ値も少し見られますが、およそ95%の計測値が2.5秒以下の範囲に収まっています。そのため、<strong>「アクセスした際のTotal Timeに関する品質を一定にする」も達成している</strong>と言えるでしょう。</p>

<p>最後に改善後のモバイル版のトップページの計測結果を見ていきます。次の2つのグラフは、3G回線でのXperiaとiPhone6S、参考としてLAN環境でのiPhone6を加えたものです。</p>

<div id="attachment_14744" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/67ecdef4d389322afe8d57b9909c9ee5.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/67ecdef4d389322afe8d57b9909c9ee5.png" alt="モバイル版のTotal Time（折れ線グラフ） *Xperia(3G):オレンジ、iPhone6S(3G):赤、iPhone6(LAN):青" width="640" height="356" class="size-full wp-image-14744" srcset="/wp-content/uploads/2015/04/67ecdef4d389322afe8d57b9909c9ee5.png 640w, /wp-content/uploads/2015/04/67ecdef4d389322afe8d57b9909c9ee5-300x167.png 300w, /wp-content/uploads/2015/04/67ecdef4d389322afe8d57b9909c9ee5-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">モバイル版のTotal Time（折れ線グラフ） *Xperia(3G):オレンジ、iPhone6S(3G):赤、iPhone6(LAN):青</p></div>

<p>モバイルの場合、ネットワーク品質の揺れ幅が大きくなりますが、平均ではXperiaが12.863秒、iPhone6Sが8.601秒となっています。参考値であるLAN環境のiPhone6が平均0.486秒であることを考えると、3G回線がパフォーマンスに大きく影響していることがわかります。これは、画像ファイルの数、ダウンロード容量が多いためで、ネットワークに遅延が発生すると大きく影響します。この時の画像ファイル数は38で、サイト全体の容量は400KB程度になっています。これは、HTML5 Experts.jpのメディアの特性を考えると、ある程度はやむ得ないと思いますが、もう少し減らせるように工夫すべきかもしれません。救いとしては、遅延の原因が画像ファイルにあるので、ファーストビューへの影響は比較的少なく、体感速度は数値よりも早く感じるという点でしょうか。</p>

<div id="attachment_14745" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/04/ba7509afad0430b432f7d6b553130234.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/ba7509afad0430b432f7d6b553130234.png" alt="モバイル版のTotal Time（スキャッタプロット） *Xperia(3G):薄緑、iPhone6S(3G):オレンジ、iPhone6(LAN):オレンジ" width="640" height="315" class="size-full wp-image-14745" srcset="/wp-content/uploads/2015/04/ba7509afad0430b432f7d6b553130234.png 640w, /wp-content/uploads/2015/04/ba7509afad0430b432f7d6b553130234-300x148.png 300w, /wp-content/uploads/2015/04/ba7509afad0430b432f7d6b553130234-207x102.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">モバイル版のTotal Time（スキャッタプロット） *Xperia(3G):薄緑、iPhone6S(3G):オレンジ、iPhone6(LAN):オレンジ</p></div>

<p>スキャッタプロットのほうを見ると、3G回線のために値の範囲が広がっていますが、概ね下に寄っているように見えるので許容範囲内であると言えるかと思います。しかしながら、前述の問題から<strong>「3G回線からのTotal Timeに関するアクセス品質をブロードバンド回線のそれに近づける」については、大きく改善してはいるものの課題が残っている</strong>という結論としたいと思います。</p>

<p>皆さん、いかがでしたでしょうか。本記事で改善した結果は是非、皆さんの手で体感していただければと思います。HTML5 Experts.jpでは、これからもパフォーマンス改善を続けていきますので、HTML5 Experts.jpを今後とも宜しくお願いいたします。また、この企画に大変なご協力をいただいた<a href="http://spelldata.co.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">株式会社Spelldata</a>の<a href="https://html5experts.jp/takehora/" target="_blank" data-wpel-link="internal">竹洞陽一郎さん</a>にこの場を借りて厚くお礼申し上げます。ありがとうございました！！</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/04/DSC00750.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/DSC00750.jpg" alt="" width="640" height="480" class="aligncenter size-full wp-image-14767" srcset="/wp-content/uploads/2015/04/DSC00750.jpg 640w, /wp-content/uploads/2015/04/DSC00750-300x225.jpg 300w, /wp-content/uploads/2015/04/DSC00750-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>補足事項</h3>

<p>本記事で扱っている計測結果は、改善実施直後の数値です。現在の数値とは異なることがあることをご了承ください。特に本記事の内容より以降に、HTTPS（SPDY対応）化を実施しており、Total Timeは全体的に伸びています。そのあたりの対応についても、別の機会で紹介できればと思います。</p>
]]></content:encoded>
			</item>
		<item>
		<title>Chrome AppsをモバイルでもーChrome Apps on mobileー</title>
		<link>/yoshikawa_t/9240/</link>
		<pubDate>Fri, 01 Aug 2014 00:00:37 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Chrome Apps]]></category>
		<category><![CDATA[ハイブリッド]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=9240</guid>
		<description><![CDATA[連載： ハイブリッドアプリ開発最前線 (8) ハイブリッドアプリ開発の手法のひとつして、Chrome Appsをモバイルアプリに変換するApache CordovaベースのChrome Apps on mobileについ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/hybrid-special/" class="series-181" title="ハイブリッドアプリ開発最前線" data-wpel-link="internal">ハイブリッドアプリ開発最前線</a> (8)</div><p><style>.codecolorer-container.text.default { max-width: 95%; margin-left: 1em; margin-top: -1em; margin-bottom: 2em;}</style>
ハイブリッドアプリ開発の手法のひとつして、Chrome Appsをモバイルアプリに変換するApache CordovaベースのChrome Apps on mobileについて解説します。これによって、Chrome Appsとして作成したWebアプリがAndroidやiOS向けのネイティブアプリとして公開、インストールすることができるようになります。</p>

<!-- more -->

<p><a href="https://github.com/MobileChromeApps/mobile-chrome-apps" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome Apps on mobile</a>は、まだデベロッパープレビュー版で、GitHub上でプロジェクトが公開されています。まだデベロッパープレビュー版ということで、Chrome AppsのすべてのAPIを利用できるわけではありませんが、順次対応される予定です。本記事では、そもそも「Chrome Appsとは何なのか？」というところから、Chrome Apps on mobileの開発環境の構築やビルド、実行までひと通り見ていきます。</p>

<h2>Chrome Appsとは？</h2>

<p>Chrome Appsとは、単にChromeで動作するWebアプリというわけではなく、<a href="https://chrome.google.com/webstore/category/apps?hl=ja" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chromeウェブストア</a>上で配布・販売できるアプリケーションプラットフォームです。通常のWebアプリをChrome Appsとしてそのまま公開することもできますし（若干のマニフェストファイルを書く必要はあります）、Chromeに実装されている高機能なAPIを利用して、よりリッチなWebアプリを作ることもできます。</p>

<div id="attachment_9249" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/chromeapps1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/chromeapps1-300x214.png" alt="Chromeウェブストア" width="300" height="214" class="size-medium wp-image-9249" srcset="/wp-content/uploads/2014/07/chromeapps1-300x214.png 300w, /wp-content/uploads/2014/07/chromeapps1-207x148.png 207w, /wp-content/uploads/2014/07/chromeapps1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Chromeウェブストア</p></div>

<p>例えば、通常のWebアプリをChrome Appsとして公開する場合（Chrome独自のAPIを利用しないケース）、次のようにマニフェストファイル「manifest.json」とバックグラウンドで動作するJavaScriptファイル「background.js」を記述し、Webアプリのファイル一式と同梱することによって簡単にChrome Appsとして動作させることができます。</p>

<p>ChromeAppSample （任意のフォルダ）<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── index.html （Webアプリ本体一式を同梱する）<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── manifest.json<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── background.js<br></p>

<p></p><pre class="crayon-plain-tag">{
  "name": "Chrome App Sample",
  "version": "0.1",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('index.html', {
    'bounds': {
      'width': 400, 'height': 500
    }
  });
});</pre><p></p>

<p>また、Chrome Apps上では、独自の<a href="https://developer.chrome.com/apps/api_index" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome API</a>を使って、さらにリッチなWebアプリを作ることも可能になっています。Chrome Appsの作成方法についてのより詳細な情報は、公式ページの「<a href="https://developer.chrome.com/apps/about_apps" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">What Are Chrome Apps?</a>」にまとまっていますので、参考にしてください。簡単に試してみたいという場合は、「<a href="https://developer.chrome.com/apps/first_app" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Create Your First App</a>」を試してください。</p>

<h2>開発環境の構築</h2>

<p>まずは、Chrome Apps on mobileの開発環境を構築します。Chrome Apps on mobileは、iOSのバージョン6以降、Androidのバージョン4.0以降を対象にしています。どちらを対象にするかによって必要なツール・ライブラリが異なりますので、対象に合わせて準備しましょう。いずれの環境でも必要なのは、Node.js (バージョン0.10.0以降)です。既にインストールされている場合は必要ありませんが、まだの場合はWindows、Mac（またはLinux）いずれでも、<a href="http://nodejs.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>からダウンロードしてインストールしておきましょう。さらに環境によって次のようなツール・ライブラリが必要になります。</p>

<h3>Androidの場合</h3>

<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Java JDK7 以降</a></li>
<li><a href="http://developer.android.com/sdk/index.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Android SDK 4.4.2 以降</a>（ <code>sdk/tools</code> と <code>sdk/platform-tools</code> をPATHに追加する）</li>
<li><a href="http://ant.apache.org/bindownload.cgi" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Apache Ant</a>（ <code>apache-ant-x.x.x/bin</code> をPATHに追加する）</li>
</ul>

<h3>iOSの場合</h3>

<ul>
<li><a href="https://developer.apple.com/xcode/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Xcode 5 以降</a></li>
<li><a href="https://github.com/phonegap/ios-deploy" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ios-deploy</a>（iOSデバイスにデプロイする際に必要です）<br>
<code>> npm install -g ios-deploy</code></li>
<li><a href="https://github.com/phonegap/ios-sim" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ios-sim</a>（iOSシミュレーターにデプロイする際に必要です）<br>
<code>> npm install -g ios-sim`</code></li>
</ul>

<p>※ Appleストアに公開する場合は、iOSデベロッパー登録が必要です</p>

<h3>ccaコマンドラインツールのインストール</h3>

<p>最後に、Chrome Apps on mobileのツールとしてccaコマンドラインツールをインストールします。</p>

<p><code>> npm install -g cca</code></p>

<p>既に、ccaがインストール済みでアップデートをする場合は、<code>npm update -g cca</code>を実行しましょう。ccaのインストール後に、次のコマンドでAndroidおよびiOSの開発環境が揃っているか確認できます。</p>

<p><code></p>

<blockquote>
  <p>cca checkenv
  cca v0.2.2</p>
</blockquote>

<h2>Checking that tools are installed</h2>

<p>Android SDK detected.
Xcode detected.
</code></p>

<p>「Android SDK detected.」と「Xcode detected.」という結果が表示されればOKです。片方のみの環境であれば、いずれか片方だけが表示されます。例えば、Android環境のみの場合は、「Android SDK detected.」だけが表示されます。</p>

<h2>プロジェクトの作成とビルド、実行</h2>

<p>開発環境の構築が終わったら、実際にプロジェクトを作成してビルド、実行してみましょう。ccaコマンドツールを使って次の手順で行います。</p>

<h3>プロジェクトの作成</h3>

<ul>
<li><p>新規にプロジェクトを作成する場合
<code>> cca create ChromeSampleApp</code>
カレントディレクトに <code>ChromeSmapleApp</code> というフォルダが作成され、プロジェクトが作られます。</p></li>
<li><p>既にあるChrome Appsを元にプロジェクトを作成する場合</p></li>
</ul>

<p>既にChrome Appsを作成済みであれば、オプションでそれを指定します。指定方法には、次の2種類があります。</p>

<p><code>> cca create ChromeSampleApp --link-to=path/to/manifest.json</code></p>

<p>作成済みのChrome Appsのマニフェストファイルの場所を指定します。 <code>path/to/</code>を皆さんの環境に合わせて置き換えてください。<code>--link-to</code>オプションでは、指定したフォルダへのシンボリックリンクでプロジェクトが作成されます。</p>

<p><code>> cca create ChromeSampleApp --copy-from=path/to/manifest.json</code></p>

<p><code>--copy-from</code> オプションでは、指定先のフォルダをコピーしてプロジェクトが作成されます。</p>

<h3>ビルド、実行</h3>

<p>プロジェクトの作成が終わったら、いよいよビルドし、実行してみます。こちらも非常に簡単で、プロジェクトのルートフォルダ上で、次のようにccaコマンドを実行するだけで済みます。</p>

<ul>
<li>Androidのエミュレータで実行</li>
</ul>

<p><code>> cca emulate android </code></p>

<p>※ Androidのエミュレータが設定されていない場合、<code>android avd</code>コマンドでセットアップする必要があります</p>

<ul>
<li>Androidの実機で実行（デバイスをUSBデバッグモードで接続します）</li>
</ul>

<p><code>> cca run android </code></p>

<ul>
<li>iOSのシミュレーターで実行</li>
</ul>

<p><code>> cca emulate ios </code></p>

<ul>
<li>iOSの実機で実行（デバイスをUSBで接続します）
<code>> cca run ios </code></li>
</ul>

<p>それぞれの環境に合わせて、<code>cca emulate</code> または、<code>cca run</code>で簡単にビルド、実行することできます。単純にビルドするだけであれば、 <code>cca build</code>で可能です。是非試してみてください！</p>

<div id="attachment_9403" style="width: 169px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/chromeapps2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/chromeapps2-159x300.png" alt="iOSシミュレーターで実行" width="159" height="300" class="size-medium wp-image-9403" srcset="/wp-content/uploads/2014/07/chromeapps2-159x300.png 159w, /wp-content/uploads/2014/07/chromeapps2-545x1024.png 545w, /wp-content/uploads/2014/07/chromeapps2-109x207.png 109w, /wp-content/uploads/2014/07/chromeapps2.png 340w" sizes="(max-width: 159px) 100vw, 159px" /></a><p class="wp-caption-text">iOSシミュレーターで実行</p></div>

<h2>Chrome App Developer Tool</h2>

<p>Chrome Apps on mobileには、実際のデバイス上でChrome Appsを動作させつつ、開発（修正）＞ビルド＞実行のイテレートを高速に回すことができる開発ツール「<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome App Developer Tool</a>」が用意されています。</p>

<p>Chrome App Developer Toolは、モバイルアプリですので、実機にインストールする必要があります。Androidの場合は、<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/releases" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>からapkファイルをインストールして使用することができます。（iOSの場合は、ソースコードからビルドする必要がありますので、公式サイトの「<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Building from Source (iOS or Android)</a>」を参考にインストールしてください）</p>

<p>Androidの場合、Chrome App Developer ToolをインストールしたデバイスをUSBデバッグモードで接続し、次のようにコマンドを実行します。</p>

<p><code>> adb forward tcp:2424 tcp:2424</p>

<blockquote>
  <p>cca push</code></p>
</blockquote>

<p><code>adb forward</code>コマンドは、デバイスを接続後に1回だけ実行します。その後<code>cca push</code>コマンドで、Chrome App Developer Tool上でChrome Appsが動作します。これは、ビルドせずにChrome AppsをそのままChrome App Developer Toolに転送して動作するため非常に高速です。</p>

<div id="attachment_9414" style="width: 178px" class="wp-caption alignleft"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-168x300.png" alt="Chrome App DeveTool 1" width="168" height="300" class="size-medium wp-image-9414" srcset="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-168x300.png 168w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-576x1024.png 576w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-116x207.png 116w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a><p class="wp-caption-text">Chrome App DevTool起動</p></div>

<div id="attachment_9415" style="width: 178px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-168x300.png" alt="Chrome App DevTool 2" width="168" height="300" class="size-medium wp-image-9415" srcset="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-168x300.png 168w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-576x1024.png 576w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-116x207.png 116w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a><p class="wp-caption-text">cca push後</p></div>

<p><br>
Chrome App Developer Toolで動作しているChrome Appsを終了するには、2本指で同時にダブルタップします。</p>

<p>また、<code>cca push --watch</code>コマンドでプロジェクトに変更があれば自動的にpushするということも可能です。ソースコードを修正しながら実機で逐次、動作確認できるのでおすすめです。</p>

<h2>まとめ</h2>

<p>Chrome Apps on mobileは、デベロッパープレビュー版ということで、まだまだこなれていない面もありますが、Chrome Appsがそのままモバイルで動作するということで非常に楽しみなプラットフォームです。単なるWebアプリをモバイルアプリにするのであればPhoneGapなどの方が簡単ですが、Chrome APIを利用したパワフルなChrome Appsを作って、Chrome Apps on mobileにチャレンジしてみてください！</p>

<p>現在対応している・今後対応するChrome APIのステータスは、<a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/APIStatus.md" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>から確認することができます。高機能なAPIの多くは、これからの対応に期待ですが、ぜひ楽しみにしていただきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[ハイブリッドアプリ開発最前線]]></series:name>
	</item>
		<item>
		<title>DOM操作の最適化によるJavaScriptチューニング（後編）</title>
		<link>/yoshikawa_t/1932/</link>
		<pubDate>Sun, 08 Sep 2013 22:00:47 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[ブラウザ]]></category>
		<category><![CDATA[高速化]]></category>

		<guid isPermaLink="false">/?p=1932</guid>
		<description><![CDATA[連載： パフォーマンスチューニング (5) 連載「Webサイト・アプリ高速化テクニック徹底解説」の第5回は、前回の「DOM操作の最適化によるJavaScriptチューニング（前編）」に続く後編です。後編では、create...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/performance-tech/" class="series-149" title="パフォーマンスチューニング" data-wpel-link="internal">パフォーマンスチューニング</a> (5)</div><p><style>.codecolorer-container+h3{margin-top:1.5em;}</style>
連載「Webサイト・アプリ高速化テクニック徹底解説」の第5回は、前回の「<a href="https://html5experts.jp/yoshikawa_t/1888/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">DOM操作の最適化によるJavaScriptチューニング（前編）</a>」に続く後編です。後編では、createElement()などのDOM操作メソッドを使ったさまざまなテクニックや、パフォーマンスを劣化させるよくあるパターンについて詳しく解説します。</p>

<div style="border: 1px solid gray; margin: 1em; padding: 1em;">
<article>
<h1>CodeIQとの連動企画！</h1>
この記事で学べるJavaScriptチューニングのテクニックを、実際に<a href="https://codeiq.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeIQ</a>の問題で試すことができます。もう既に自信がある方は腕試しに、もしくは理解度チェックのための復習として是非ご活用ください！<a href="https://codeiq.jp/ace/yoshikawa_t/q452" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>から問題にチャレンジ！
</article>
</div>

<!-- more -->

<h1>DOM操作の最適化によるJavaScriptチューニング（後編）</h1>

<p>前回は、DOM操作が遅い原因と仕組みについて簡単に説明し、チューニングのサンプルをいくつか解説しました。その中で、innerHTMLを利用したコードをサンプルにあげていますが、innerHTMLを利用する場合、いくつかの点で注意が必要です。</p>

<ul>
<li>HTMLの文字列を扱うため単純な子要素の追加ができない（子要素をすべて書き換えることになる）</li>
<li>追加する要素が多くなると、文字列連結のコストやHTMLをパースするコストが膨れ上がる</li>
<li>HTMLを直接扱うため、きちんとエスケープしないとクロスサイトスクリプティングの脆弱性を作りこむ可能性がある</li>
</ul>

<p>以上の点から、特に理由がなければinnerHTMLよりもDOM操作メソッドを使ったほうが良いでしょう。今回は、DOM操作メソッドを使ったさまざまなテクニックや、パフォーマンスを劣化させるよくあるパターンを紹介し、そのチューニング方法を見ていきます。</p>

<p>また、前回の記事のinnerHTMLを使ったサンプルでは、上に挙げたような複数の要因でパフォーマンスに影響与えていることから、レイアウト・レンダリングの遅さのみを理由とするには、あまり適切ではありませんでした（チューニング自体には問題はありませんので心配しないでください）。折を見て改訂したいと思います。ご指摘して頂いた方々、ありがとうございました。
本連載では、より良い情報を皆さんに届けるため、ご指摘や疑問点などがあれば是非フィードバックを頂ければと思います。フィードバックを受け、できるかぎり記事を更新していきたいと思います。</p>

<h2>DOM操作メソッドを使ったテクニック</h2>

<p>createElement()やappendChild()などのDOM操作メソッドを使った方法では、単純にinnerHTMLによるコードを置き換えるだけでなく、さまざまなテクニックがあります。ここでは、DOM操作メソッドを使う際に覚えておいた方がよいテクニックをいくつか紹介します。</p>

<h3>複数の要素をまとめて追加する</h3>

<p>複数の要素を追加する場合、構造によってはそのままでは一度に追加できないことがあります。例えば、次のサンプルのようにul要素にli要素を追加していくようなケースです。</p>

<pre><code>:javascript:
// サンプル1: ul要素にli要素を追加していく（低速）
var ul = document.querySelector('#output');
for ( var i = 0; i &lt; data.length; i++ ) {
  var li = document.createElement('li');
  li.textContent = data[i];

  // ループのたびにli要素を追加
  ul.appendChild(li);
}
</code></pre>

<p>このサンプルでは、ループのたびにli要素を追加していますので、DOMツリーへ更新が何度も発生します。こういった場合には、DocumentFragmentを利用して複数のli要素をまとめて追加することができます。次のコードは、DocumentFragmentを利用して書き換えたコードです。</p>

<pre><code>:javascript:
// サンプル1: ul要素にli要素をまとめて追加（高速）
var ul = document.querySelector('#output'),
    fragment = document.createDocumentFragment();

for ( var i = 0; i &lt; data.length; i++ ) {
  var li = document.createElement('li');
  li.textContent = data[i];

  // いったんDocumentFragmentに追加する
  fragment.appendChild(li);
}

// 最後にDocumentFragmentをul要素に追加する
ul.appendChild(fragment);
</code></pre>

<p>DocumentFragmentは、従来のDOMツリーとは分離された独立した小さなDOMツリーです。createDocumentFragment()メソッドを使って作成します。DocumentFragmentに追加された要素は、そのままでは見た目に影響を与えないため、まずはDocumentFragmentにli要素を追加していきます。そして、最後にul要素にそのDocumentFragmentを追加し、反映します。こうすることで、元のDOMツリーへの更新が1回だけで済みます。</p>

<h3>繰り返し同じような要素を追加する（テンプレート化）</h3>

<p>同じような要素を繰り返し追加する場合、要素をまた一から作成していくのは面倒です。また、要素が多くなってくるとパフォーマンス的にもあまり良くありません。例えば、ボタンが押されるたびに、次のような構造を持つli要素を追加していくことを考えてみましょう。</p>

<pre><code>:html:
&lt;li&gt;
  &lt;artcile class="item"&gt;
    &lt;h1 class="title"&gt;アイテム&lt;/h1&gt;
    &lt;p class="detail"&gt;詳細&lt;/p&gt;
  &lt;/artcile&gt;
&lt;/li&gt;
</code></pre>

<p>これを素直にDOM操作メソッド使って構築すると次のようにボタンが押されるたびに毎回要素を生成して構築する形になります。</p>

<pre><code>:javascript:
// ボタンがクリックされる度に複雑な要素を追加
button.addEventListener('click', function(){

  // 各要素を生成
  var li = document.createElement('li'),
      article = document.createElement('article'),
      h1 = document.createElement('h1'),
      p = document.createElement('p');

  // 各要素のプロパティを設定し、組み立てる（省略）

  ul.appendChild(li);
}, false);
</code></pre>

<p>サンプルでは、コードが多い部分を省略していますが、多くのDOM操作をしています。このような場合、構築される要素をテンプレート化して、それをcloneNode()を使ってコピーするようにすれば、DOM操作の数を減らすことができます。cloneNode()を利用すると次のようなコードになります。</p>

<pre><code>:javascript:
// テンプレートとしてli要素を構築
var template = document.createElement('li'),
    article = document.createElement('article'),
    h1 = document.createElement('h1'),
    p = document.createElement('p');

// 各要素のプロパティを設定し、組み立てる（省略）

// ボタンがクリックされる度にテンプレートから要素を追加
button.addEventListener('click', function(){

  // テンプレートから要素をコピー
  var li = template.cloneNode(true);

  // 一部書き換えて追加
  li.querySelector('.title').textContent = 'アイテム';
  li.querySelector('.detail').textContent = 'アイテムの詳細'
  ul.appendChild(li);
}, false);
</code></pre>

<p>こうすると、ボタン押すたびにテンプレートからコピーするだけなので効率的です。構築する要素が複雑になればなるほど、cloneNode()を利用する方が高速になります。cloneNode()の引数は、子要素を一緒にコピーするかどうかなので、trueを指定しておきます。また、cloneNode()ではイベントリスナーをコピーすることはできませんので注意してください。</p>

<h3>複数の要素をまとめて置き換える</h3>

<p>既に表示されているインターフェースに対して最新の情報を反映するような場合があるかと思います。その際に、表示するデータが細かいとDOM操作も細かくなってしまうことがあります。例えば、次のようなHTMLの各p要素の内容を書き換えることを考えてください。</p>

<pre><code>:html:
&lt;div class="results"&gt;
  &lt;p&gt;結果1&lt;/p&gt;
  &lt;p&gt;結果2&lt;/p&gt;
  &lt;p&gt;結果3&lt;/p&gt;
&lt;/div&gt;
</code></pre>

<p>これを単純に書き換える場合は、次のようなコードになりがちです。</p>

<pre><code>:javascript: 
var elements = document.querySelectorAll('.results p');
elements[0].textContent = '結果a';
elements[1].textContent = '結果b';
elements[2].textContent = '結果c';
</code></pre>

<p>この場合、3つのp要素を順に書き換えているので、DOMツリーへの更新が3回発生してしまいます。このような場合、replaceChild()を使って一度に置き換えることができます。</p>

<pre><code>:javascript:
var origin = document.querySelector('.results'),
    clone = origin.cloneNode(true);

// コピーした要素を更新する
var elements = clone.querySelectorAll('p');
elements[0].textContent = '結果a';
elements[1].textContent = '結果b';
elements[2].textContent = '結果c';

// 元の要素とコピーした要素を入れ替える
origin.parentNode.replaceChild(clone, origin);
</code></pre>

<p>この方法であれば、DOMツリーへの更新は1回で済みます。また、先ほどのサンプルと同様にcloneNode()がイベントハンドラーをコピーできないことに注意しましょう。</p>

<h2>パフォーマンスを劣化させるよくあるパターン</h2>

<p>ここからは、パフォーマンスを劣化させるよくあるパターンや、そのチューニング方法を紹介します。</p>

<h3>複数のスタイルの書き換え</h3>

<p>ある要素のスタイルを複数書き換える場合に、ついやってしまいがちなのが次のコードです。</p>

<pre><code>:javascript:
// 複数のスタイルの書き換え（低速）
element.style.background = 'gray';
element.style.border = '1px solid black';
</code></pre>

<p>この場合も、レイアウトが複数発生する可能性があるので、次のように記述しましょう。</p>

<pre><code>:javascript:
// 複数のスタイルの書き換え（高速）
// style属性で一度にすべて指定する
element.setAttribute('style', 'background: gray; border: 1px solid gray;');
</code></pre>

<p>setAttribute()を使ってsytle属性を使って一度に複数のスタイルを指定しています。また、あらかじめ指定するスタイルがある程度決っているなら、可読性やメンテナンスを考えてclass属性を使っても良いでしょう。</p>

<pre><code>:javascript:
// classを指定して複数のスタイルを適用する
element.className = 'hoge';
</code></pre>

<h3>アニメーション</h3>

<p>ある要素の位置やサイズを動かしてアニメーションさせるような場合、スタイルでposition: absoluteやpositon: fixedを指定しておくと良いでしょう。これは、レイアウト・レンダリングの範囲を最少化するためです。position: absoluteなどを指定すると他の要素との位置関係やサイズ計算から切り離されるため、その要素に対する変更が他の要素に影響しなくなります。そのため、レイアウト・レンダリングのコストが小さくなり、パフォーマンスが向上します。アニメーションのチューニングについては、また別の記事で触れますので楽しみにしていてください。</p>

<h3>スタイル情報の取得</h3>

<p>多くのDOM操作によるスタイル情報の取得の中でも、次に挙げるプロパティ、メソッドについては特に注意が必要です。</p>

<ul>
<li>getComputedStyle()</li>
<li>offset*系のプロパティ</li>
<li>client*系のプロパティ</li>
<li>scroll*系のプロパティ</li>
</ul>

<p>（offset*系のプロパティとは、offsetという単語を含むoffsetTop、offsetLeft、offsetHeight、offsetWidthなどのプロパティです）</p>

<p>これらのプロパティ、メソッドは、現時点での最新の情報を返そうとするため、それまでに実行したDOM操作があれば、すぐさまレイアウト・レンダリングを実行します。本来であればブラウザが自動的に最適化し、非同期に実行しているものを強制的に実行してしまうため大きなボトルネックになります。例えば、あるブロックを単純に右に動かすだけのコードを見てみましょう。</p>

<pre><code>:javascript:
// あるブロックを右に動かす
setInterval(function(){
  block.style.left = block.offsetLeft + 1 + 'px';
}, 1000 / 60 );
</code></pre>

<p>ここでは、あるブロックのoffsetLeftを取得し、1を加えてスタイルのleftに代入しています。leftの値を更新した後に、またすぐにoffsetLeftを参照しているので、その時点でレイアウト・レンダリングが発生し、遅くなります。そのため、offsetLeftの値をキャッシュしておき、以降はそれを利用するように変更しましょう。</p>

<pre><code>:javascript:
// あるブロックを右に動かす
// offsetLeftの値を一度キャッシュして以降は使いまわす
var left = block.offsetLeft;
setInterval(function(){
  left++;
  block.style.left = left + 'px';
}, 1000 / 60 );
</code></pre>

<p>このように、上記であげたプロパティ、メソッドは、多くのDOM操作をしているような箇所では特にボトルネックになりやすいので注意しましょう。（サンプルでは、JavaScriptを使っていますが、もちろんCSSで記述しても良いでしょう。）</p>

<h3>要素の取得</h3>

<p>それほど気にするほどの差ではありませんが、要素を取得する際にquerySelector()やquerySelectorAll()よりも、getElementById()やgetElementsByTagName()、getElementsByClassName()を利用した方が若干速くなります。</p>

<pre><code>:javascript:
// div要素をすべて取得
var elements = document.querySelectorAll('div');

// querySelectorAll()よりも若干速い
var elements = document.getElementsByTagName('div');
</code></pre>

<p>その他の違いにも、getElementsByTagName()などは、結果として返るリスト（NodeList）が常に現在のDOMツリーを反映したものになるのに対して、querySelectorAll()などは取得した時点のものになります。例えば、これらのメソッドで要素を取得した後に、要素が追加された場合、getElementsByTagName()で取得したリストではリストにその要素が自動的に追加されますが、querySelectorAll()ではリストに変化はありません。そういった違いも覚えておくと良いでしょう。</p>

<h2>まとめ</h2>

<p>ここまで前編、後編にわたってDOM操作の最適化について解説しました。いくつかのサンプルやパターンを交えて、チューニング方法を紹介してきましたが、もちろんこれ以外にもたくさんのテクニックがあります。細かいテクニックをあげていくときりがありませんが、重要なのはDOM操作自体の回数を減らすことと、DOMツリーへの更新とレイアウトやレンダリングなどの範囲、回数を減らすことです。それさえ覚えておけば、自分でいろいろなコードに応用できるかと思います。自分自身で考えてチューニングしていきましょう。</p>
]]></content:encoded>
		
		<series:name><![CDATA[パフォーマンスチューニング]]></series:name>
	</item>
		<item>
		<title>DOM操作の最適化によるJavaScriptチューニング（前編）</title>
		<link>/yoshikawa_t/1888/</link>
		<pubDate>Wed, 04 Sep 2013 22:00:03 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[ブラウザ]]></category>
		<category><![CDATA[高速化]]></category>

		<guid isPermaLink="false">/?p=1888</guid>
		<description><![CDATA[連載： パフォーマンスチューニング (4)連載「Webサイト・アプリ高速化テクニック徹底解説」の第4回は、JavaScriptのチューニングのうち、ボトルネックになりやすいDOM操作の最適化について解説します。前編・後編...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/performance-tech/" class="series-149" title="パフォーマンスチューニング" data-wpel-link="internal">パフォーマンスチューニング</a> (4)</div><p>連載「Webサイト・アプリ高速化テクニック徹底解説」の第4回は、JavaScriptのチューニングのうち、ボトルネックになりやすいDOM操作の最適化について解説します。前編・後編にわたって、DOM操作が遅くなる原因と仕組み、その解決策について詳しく解説します。</p>

<div style="border: 1px solid gray; margin: 1em; padding: 1em;">
<article>
<h1>CodeIQとの連動企画！</h1>
この記事で学べるJavaScriptチューニングのテクニックを、実際に<a href="https://codeiq.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeIQ</a>の問題で試すことができます。もう既に自信がある方は腕試しに、もしくは理解度チェックのための復習として是非ご活用ください！<a href="https://codeiq.jp/ace/yoshikawa_t/q452" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>から問題にチャレンジ！
</article>
</div>

<!-- more -->

<h1>DOM操作の最適化によるJavaScriptチューニング（前編）</h1>

<p>DOM（Document Object Model）とは、HTMLをアプリケーション（ここではJavaScript）から利用するためのAPIです。JavaScriptによるユーザーインターフェースの構築やレスポンスの表示など、インタラクティブな部分はほとんどがDOM操作によるものでしょう。このように、非常に利用頻度の高いDOM操作ですが、同時に性能的にボトルネックになりやすい箇所でもあります。これらのDOM操作の最適化について、今回から前編・後編にわたって詳しく解説していきます。</p>

<h2>DOM操作は書き方によってスピードに数十倍の差が出る</h2>

<p>DOM操作は、書き方によって非常にパフォーマンスに差が出ます。例えば、次のようなコードを見てみましょう。id属性に&#8221;output&#8221;と指定された要素に、data配列の中身を単純にリスト表示するだけのものです。</p>

<pre><code>:javascript:
// サンプル1: パフォーマンスが悪い
var ul = document.querySelector('#output');
for ( var i = 0; i &lt; data.length; i++ ) {
  ul.innerHTML += '&lt;li&gt;' + data[i] + '&lt;/li&gt;';
}
</code></pre>

<p>これは、非常にパフォーマンスが悪い例です。これを次のように書き換えるだけで、環境にもよりますが速度は数十倍にもなります。</p>

<pre><code>:javascript:
// サンプル2: サンプル1に比べてパフォーマンスが良い
var ul = document.querySelector('#output');
var html = '';
for ( var i = 0; i &lt; data.length; i++ ) {
  html += '&lt;li&gt;' + data[i] + '&lt;/li&gt;';
}
ul.innerHTML = html;
</code></pre>

<p>このように、ボトルネックとなっているDOM操作をチューニングすれば、パフォーマンスが大きく改善する可能性があります。ここからは、DOM操作が遅くなる原因と仕組みを解説しながら、対応策を見ていきます。</p>

<h2>なぜDOM操作は遅いのか？</h2>

<p>DOM操作はなぜ遅いのでしょうか。それには、大きく2つの理由があります。1つ目は、DOMの実装方法によるものと、2つ目は、DOM操作によるレンダリングのコストが非常に高いということが挙げられます。この2つの理由と対応方法を覚えておけば、さまざまなコードに応用できます。それぞれ見ていきましょう。</p>

<h3>ブラウザの実装による遅さ</h3>

<p>元々DOMは、特定のプログラミング言語を対象としたものではなく、別々の言語から汎用的にアクセスできるような仕様になっています。そのため、多くのブラウザでは、HTMLのレイアウトや描画を担当するレンダリングエンジンと、JavaScriptを担当するスクリプトエンジンに分かれています。このようにスクリプト部分をモジュール化することによってDOM操作に別のプラグラミング言語を使うことも容易になっています。しかしながら、そのデメリットとして、JavaScriptからDOM操作を行うということは、モジュール間をブリッジするコストが発生することにもなります。そのため、DOM操作自体がプリミティブな操作に比べて非常に低速になっています。そういった観点から、HTMLの要素の単純なプロパティ参照なども含めて、極力DOM操作を減らすようにすることが重要です。</p>

<h3>レイアウト・レンダリングによる遅さ</h3>

<p>DOM操作の結果は、実際のHTMLに反映される際に、ブラウザでさまざまな処理が起こります。例えば、要素が追加された場合には、それによって発生する各要素の大きさや位置といったレイアウトを他の影響する要素を含めて、すべて再計算しなければなりません。また、レイアウトの再計算が終わったあとには、それらを画面にレンダリングする必要もあります。そして、これらの処理は非常にコストが高いものです。そのため、DOM操作によってレイアウトやレンダリングに影響がある範囲、回数をなるべく減らす必要があります。</p>

<p>例えば、冒頭に示したサンプル1のコードでは、次のようにli要素をループが回るたびに追加しているため、レイアウトとレンダリングが何回も発生して非常に遅くなってしまう可能性があります（レイアウトやレンダリングは非同期で処理されるため、実際にはブラウザがある程度、自動的に最適化してくれます）。</p>

<pre><code>:javascript:
// 複数回、レイアウト、レンダリングされる可能性がある
for ( var i = 0; i &lt; data.length; i++ ) {
  ul.innerHTML += '&lt;li&gt;' + data[i] + '&lt;/li&gt;';
}
</code></pre>

<p>innerHTMLを利用しているため、少なくてもHTMLのパースはループのたびに発生します。また、古いブラウザでは文字列の連結自体が問題になることもあります。このコードを、レイアウトとレンダリングが1回になるように書き換えると次のようになります。（その他にも、innerHTMLを「+=」演算子で余分に参照していることや、innerHTMLの中身を毎回すべて書き換えていることも遅さの原因になっていますが、次のコードではそれらも改善しています。）</p>

<pre><code>:javascript:
// 変数にHTMLを格納しておき最後に1回だけ書き換える
var html = '';
for ( var i = 0; i &lt; data.length; i++ ) {
  html += '&lt;li&gt;' + data[i] + '&lt;/li&gt;';
}
ul.innerHTML = html;
</code></pre>

<p>最終的に、結果が表示されれば良いので、li要素のHTMLは、いったん別の変数に格納しておき、最後に1回だけinnerHTMLへ代入しています。これによって、DOM操作の回数もレンダリングの回数も以前のコードに比べて1回で済みます。</p>

<h2>innerHTMLとDOM操作メソッド</h2>

<p>ここまでのサンプルでは、innerHTMLを使ってDOM操作を記述していますが、createElement()やappendChild()などのDOM操作メソッドを使う方法もあります。次のサンプルは、サンプル2をDOM操作メソッドを利用して記述した例です。</p>

<pre><code>:javascript:
// サンプル3: createElement()を使った例
var ul = document.querySelector('#output');
var fragment = document.createDocumentFragment();
for ( var i = 0; i &lt; data.length; i++ ) {
  var li = document.createElement('li');
  li.textContent = data[i];
  fragment.appendChild(li);
}
ul.appendChild(fragment);
</code></pre>

<p>innerHTMLとDOM操作メソッドは、それぞれ良い点がありますが、基本的にはDOM操作メソッドを使っていくほうがクロスサイトスクリプティングの脆弱性を作りこみにくいので安全です（innerHTMLは、文字列をパースするためユーザーの入力値を使う場合はエスケープする必要があります）。これらのDOM操作メソッドを利用する方法は、次回で詳しく取り上げていきます。</p>

<h3>innerHTMLとDOM操作メソッドのスピード</h3>

<p>innerHTMLとcreateElement()などのDOM操作メソッドは、どちらが速いかといった形でよく比較されることが多いですが、パフォーマンスという観点からはそれほど気にしなくても良いでしょう。モダンな環境では、お互いの速度差はそれほど大きくありませんし、ブラウザは常にバージョンアップされていますのでベンチマークの結果はすぐに変わります。特定の環境に特化したチューニングを行うのでなければ、細かい速度差を気にするよりは、機能の違いで使い分けていきましょう（ちなみに、現在はIE、FirefoxはinnerHTMLの方が若干速く、Chrome、SafariはDOM操作メソッドの方が若干速くなっています）。</p>

<h2>次回の内容について</h2>

<p>今回は、DOM操作が遅くなる理由と、その対処方法について簡単に解説しました。次回は、createElement()によるDOM操作と、チューニングのためのさまざまなTipsを紹介していく予定です。お楽しみに！</p>
]]></content:encoded>
		
		<series:name><![CDATA[パフォーマンスチューニング]]></series:name>
	</item>
		<item>
		<title>ユーザーの体感速度を高めるためのJavaScriptチューニング（後編）</title>
		<link>/yoshikawa_t/1016/</link>
		<pubDate>Mon, 22 Jul 2013 20:00:26 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[アプリ高速化]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=1016</guid>
		<description><![CDATA[連載： パフォーマンスチューニング (3)連載「Webサイト・アプリ高速化テクニック徹底解説」の第3回は、前回の「ユーザーの体感速度を高めるためのJavaScriptチューニング（前編）」の続きです。この後編では、「ユー...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/performance-tech/" class="series-149" title="パフォーマンスチューニング" data-wpel-link="internal">パフォーマンスチューニング</a> (3)</div><p>連載「Webサイト・アプリ高速化テクニック徹底解説」の第3回は、前回の「<a href="https://html5experts.jp/yoshikawa_t/877/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ユーザーの体感速度を高めるためのJavaScriptチューニング（前編）</a>」の続きです。この後編では、「ユーザーの操作を阻害しない」方法についてJavaScriptのシングルスレッドやイベントループを交えて解説し、HTML5のWeb Workersについても紹介していきます。</p>

<!-- more -->

<h1>ユーザーの体感速度を高めるためのJavaScriptチューニング（後編）</h1>

<p>前回は、ユーザーの体感速度を向上させるための方法として、3つのうち「ページを素早く表示する」と「ユーザーに素早くインタラクションを返す」を解説しました。今回は、最後の「ユーザーの操作を阻害しない」について詳しく解説していきます。</p>

<h2>ユーザーの操作を阻害しない</h2>

<p>JavaScriptによる処理が重くなると、いつまでも画面が更新されなかったり、ユーザーの操作が止まってしまったりということがあります。止まっている時間が長すぎると、ブラウザから応答がないという警告がでることもあります。それほどひどくなくても、ページのスクロールが途中でつっかかったり、アニメーションがとぎれとぎれになったりといったことは、皆さん経験があるのではないでしょうか。こういった状態は、ブラウザのユーザーインターフェース周りの処理とJavaScriptが同じシングルスレッドで動作していることに原因があります。このようなブラウザにおけるシングルスレッドとイベントループという仕組みを先に簡単に解説しておきましょう。</p>

<h3>シングルスレッドとイベントループ</h3>

<p>通常、ほとんどのブラウザはシングルスレッドで動作しており、JavaScriptのコードや画面の描画、ユーザーの操作（ページのスクロールやマウス操作など）を同時に処理することはできません。そのため、JavaScriptの処理に時間が掛かってしまうと、その間は画面の描画も、ユーザーの操作も止まってしまいます。これらの処理は、イベントループと呼ばれる仕組みで動作しています。</p>

<div id="attachment_1017" style="width: 1034px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/eventloop.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/07/eventloop.png" alt="イベントループのイメージ図" width="1024" height="768" class="size-full wp-image-1017" srcset="/wp-content/uploads/2013/07/eventloop.png 640w, /wp-content/uploads/2013/07/eventloop-300x225.png 300w, /wp-content/uploads/2013/07/eventloop-207x155.png 207w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><p class="wp-caption-text">イベントループのイメージ図</p></div>

<p>イベントループは、イベントを監視する無限ループを持ち、イベント（またはそのコールバック）が発生すると、発生順にそのイベントを処理していきます。ここでいうイベントには、JavaScriptのイベントに加えて、ブラウザのレイアウトイベントや描画イベントなども含まれています。そのため、JavaScriptの実行に時間がかかると、その間に発生した描画イベントなどの他のイベントが実行キューに登録され、いつまでも処理されないということになります。根本的な対応方法は各処理を短くすることですが、このイベントループの仕組みうまく利用すれば、大きな処理を細かく分割することもできます。</p>

<h3>setTimeout関数などによる擬似的な並列処理</h3>

<p>イベントループの仕組みを考えると、JavaScriptの処理に時間がかかる場合は、その処理をいったん終了させて、別のイベントで続きを実行すれば処理を分割できることになります。この分割した処理の間に、ブラウザの描画イベントなどが発生すれば、正常に画面が更新されることになります。</p>

<p>例えば、JavaScriptで時間のかかる処理の前に、先に見た目を更新するという方法（前回の「ユーザーに素早くインタラクションを返す」）を挙げましたが、次のようなコードでは画面がすぐには更新されず、JavaScriptの実行が終わるまで反映されません。</p>

<pre><code>:javascript:
// id属性に"output"を指定した要素にメッセージを表示するコード
var output = document.querySelector('#output');
output.textContent = 'メッセージ';

// ~なんらかの時間がかかる処理~
</code></pre>

<p>これを、メッセージがすぐに画面に反映されてから、時間がかかる処理をするように変更するには、次のように記述します。</p>

<pre><code>:javascript:
// id属性に"output"を指定した要素にメッセージを表示するコード
var output = document.querySelector('#output');
output.textContent = 'メッセージ';

setTimeout(function(){

  // ~なんらかの時間がかかる処理~
}, 0);
</code></pre>

<p>setTimeout関数を利用して、時間のかかる処理を実行しています。setTimeout関数は、一定時間後に指定したメソッドを実行する関数ですが、ここでは0ミリ秒後に指定しています。これは、実際にはすぐに実行されるわけではなく、イベントループの実行キューに登録されることになります。そのため、上で表示しているメッセージの描画イベントが先に実行され、その後にsetTimeout関数で指定した処理が実行されます。</p>

<p>このようにして、setTimeout関数を使って、明示的に大きな処理を分割し、擬似的な並列処理を実現することができます。あまり多用するとコードの可読性やメンテンナンス性などが落ちるので注意が必要です。また、setTimeout関数以外でもイベントやコールバックであれば良いので、XMLHttpRequestやその他のイベントハンドラでも同様のことができます。JavaScriptでは、もともとそういった記述が多いので、意図的ではなくても自然とそういったコードになっていることが多いと思います。しかしながら、こういった仕組みを知っておくことでうまく問題が解決できることもありますので、覚えておくと良いでしょう。</p>

<p>実は、このsetTimeout関数を使った特定の処理を実行キューの最後にスタックする方法は、setImmediate関数として標準化が議論されています（仕様は<a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html" title="setImmediate spec" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>）。現在は、IE9以降で実装されています。</p>

<h2>バックグラウンドでJavaScriptを実行する「Web Workers」</h2>

<p>HTML5には、setTimeout関数などによる擬似的な並列処理ではなく、本当の並列処理を行うための<a href="http://www.w3.org/TR/workers/" title="Web Workers" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Web Workers</a>という仕様があります。このWeb Workersでは、JavaScriptの処理をブラウザのメインスレッドとは別に、バックグラウンドで処理することができるようになります。そのため、画面の描画やユーザー操作を阻害せずに、時間のかかるJavaScriptを実行することができます。</p>

<p>早速、Web Workersの利用方法を見ていきましょう。Web Workersを利用する場合、バックグラウンドで処理するためのJavaScriptファイルを別に用意します。ここでは、表示するページで読み込むmain.js、バックグラウンドで動作するworker.jsの2つに分けています。それぞれのファイルの内容は、次の通りです。</p>

<p><strong>main.js</strong></p>

<pre><code>:javascript:
// ワーカーの作成
var worker = new Worker('worker.js');

// メッセージ受信イベントの登録
worker.addEventListener('message', function(e){
  console.log(e.data);
});

// メッセージ送信
var message = 'test';
worker.postMessage(message);
</code></pre>

<p>main.jsでは、バックグラウンドで動作するWorkerオブジェクト（以下、ワーカー）を引数にworker.jsを指定して作成します。そして、ワーカーとのデータの送受信には、お互いにメッセージをやり取りして行います。ワーカーのpostMessage()メソッドで加工するデータなどを送信し、messageイベントでワーカーから戻ってきたデータを受信します（データはコピー渡しとなります）。送受信できるデータは、基本的な型やオブジェクトなどが可能ですが、Errorオブジェクトや関数（Functionオブジェクト）、DOMノードなどはエラーとなります。</p>

<p><strong>worker.js</strong></p>

<pre><code>:javascript:
self.addEventListener('message', function(e){

  // メッセージを受信して、そのまま返す
  self.postMessage(e.data);
});
</code></pre>

<p>worker.jsでは、main.jsと同じようにmessageイベントとpostMessage()メソッドを利用してメッセージをやり取りします。ここでは、messageイベントでデータを受け取り、受け取ったデータをpostMessage()メソッドでそのまま返しています。例えば何らかの処理をする際には、ここでデータを加工して送り返すといったように変更すると良いでしょう。ワーカー自身にアクセスするには、self変数を利用します。また、ワーカー内では、windowオブジェクトやページのDOMツリーにアクセスすることができませんので注意してください。</p>

<p>このようにして、main.jsでは基本的にユーザーインターフェースの作成やワーカーでの処理結果を反映するだけにとどめ、ワーカーで実際の処理をバックグラウンドで行うようにすると、ユーザーの操作を阻害しないような作り込みができます。また、Web Workersを利用することで、自然とビジネスロジックなどのコードを切り分けることできるので、MVCモデルのような構成を取りやすいこともメリットのひとつでしょう。是非、チャレンジしてみてください。</p>

<p>以降は、Web Workersの対応状況や制限事項などを載せておきますので、参考にしてください。</p>

<h3>Web Workersの対応状況</h3>

<p>デスクトップ向けであれば、IE9を除くすべてのモダンブラウザ（IEはバージョン10より対応）で利用することができます。モバイル向けでは、iOSは対応していますが、残念ながらAndroidの標準ブラウザが未対応です。そのため、Androidに対応するためには<a href="https://code.google.com/p/fakeworker-js/" title="fakeworker-js" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">fakeworker-js</a>などのPolyfillを利用しましょう。</p>

<h3>メッセージで交換できるデータの種類</h3>

<p>メッセージで交換できるデータについては、Boolean、Number、Stringオブジェクトなどの基本的な型に加え、Date、RegExp、ImageData、File、Blob、FileList、Array、Objectオブジェクトなども可能です。逆に扱えないデータとしては、Error、FunctionなどのオブジェクトとDOMノード、RegExpオブジェクトのlastIndexプロパティなどです。また、setterやgetter、prototypeなどはコピーされません。詳しくは、<a href="http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#internal-structured-cloning-algorithm" title="Structured Clone Algorithm" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Structured Clone</a>というアルゴリズムで定義されています。</p>

<h3>ワーカー内で利用できる機能</h3>

<p>ワーカー内では、DOMツリーやwindowオブジェクト、doucmentオブジェクト、parentオブジェクトにアクセスすることができません。ワーカー内で利用できる機能としては、navigatorオブジェクトやlocationオブジェクト（読み取り専用）、XMLHttpRequest、setTimeoutとsetInterval関数、Application Cacheなどです。また、さらに他のワーカーを作成することもできます。ワーカーで利用できる独自の機能には、外部スクリプトをインポートすることができるimportScripts関数などがあります。</p>

<h2>おわりに</h2>

<p>前編と後編にわたって、ユーザーの体感速度を向上させるJavaScriptのチューニング方法について詳しく解説しました。次回からは、引き続きJavaScriptの高速化をテーマに、DOM操作の最適化について解説していく予定です。お楽しみに！</p>

<p>★「<a href="https://html5experts.jp/yoshikawa_t/877/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ユーザーの体感速度を高めるためのJavaScriptチューニング（前編）</a>」を読む★</p>
]]></content:encoded>
		
		<series:name><![CDATA[パフォーマンスチューニング]]></series:name>
	</item>
	</channel>
</rss>
