JavaScript+HTML5 API でできること2017

Yu Watanabe(@yuw27b)
2017.05.20 【NDSiN#12×Niigata.js×C4N】JavaScript 2017春

自己紹介

ECサイト運営
[東京]
非常勤エンジニア+フリーランス
[新潟]


最近のお仕事

SPA+API+DBなWebサービスの制作
  • JavaScript[Backbone.js/React.js/Node.js]
  • Ruby、PHP
  • MySQL、Neo4j、RDF
その他

サービスのサーバ設定・管理

HTML+CSS+JavaScriptのコーディング

・・・などをやっています。

APIって・・・?

Application Programing Interface

ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様

https://ja.wikipedia.org/wiki/アプリケーションプログラミングインタフェース

JavaScriptと、JavaScriptを実行するブラウザがやりとりするための仕様

具体的にどんなもの?

  • DOM APIとかXMLHttpRequestとか
  • APIごとに標準化が進められてはいるが、ブラウザによって実装状況に差がある
    例えばjQueryは、ブラウザごとのDOM APIの実装の差異を吸収してくれていた

HTML5 APIって・・・?

「HTML5」は2014年10月に勧告されたHTMLの仕様

「広義のHTML5」として周辺仕様も含めたものを指すことも多い
←今回取り上げるのはココ

つまりHTMLとCSS以外の、ここ3年くらいで使えるようになってきた機能

主にJavaScriptで操作する

https://ja.wikipedia.org/wiki/HTML5

どんなことができるの?

  • オフラインとストレージ - App Cache、Web Storage、Indexed Database API、File API
  • デバイスアクセス - Geolocation API、マイク・カメラ、アドレス帳・カレンダー、端末の向き
  • 接続性 - WebSocket、Server-Sent Events
  • マルチメディア - audio要素, video要素
  • 3D、グラフィックス、エフェクト - SVG、canvas要素、WebGL
  • パフォーマンスと統合 - Web Workers、XMLHttpRequest Level 2

https://ja.wikipedia.org/wiki/HTML5

ということで、
このへんのAPIでできることと
ブラウザの対応状況などを追ってみます。

大昔からあるもの、深い考察などは取り上げません。

その前にちょっと寄り道・・・

PWA[Progressive Web Apps]のこと

  • Googleが2015年に提唱
  • ネイティブアプリに近いUXを提供するWebサイト
  • オフラインでも動くとか、通知が来るとか、写真撮れるとか
  • 実現にはHTML5 APIが不可欠
  • Apple(iPhone)のスタンスは・・・?

DOM・CSS関係

  • ドラッグ&ドロップのAPIが標準化(jQuery UI がなくても大丈夫!)
    Drag and drop API
  • タブレット、スマートフォンのタッチイベントが扱えるように
    Touch Events
    Touch Events - Level 2・・・こちらはまだ草案
  • マウスイベントとタッチイベントをまとめて扱えるように
    Pointer Events
    Pointer Events - Level 2・・・こちらもまだ草案
  • CSSアニメーションのイベント取得
    CSS Conditional Rules Module Level 3
    →将来的にはWeb Animations APIに統合される?
    
    $('.element').bind('mozTransitionEnd webkitTransitionEnd transitionend', function(){
      console.log('Transition end!');
    });
    $('.element').on('webkitAnimationEnd animationEnd', function(){
      console.log('Keyframe animation end!');
    });
    

ファイル

  • File API
    ローカルファイルにアクセスできるようになった(Flashがなくてもアップロードできる!)
    読み取り専用、パスは取れない。
  • File and Directory Entries API
    ディレクトリ(フォルダ)のドロップは基本的にはまだ扱えない。(Chromeだけならがんばればできる。)

音を鳴らす

  • Web Audio API
    HTMLのaudio要素を扱う(play/stopなど)
    だけじゃなくて、ものすごくいろいろできる。
    
    var ctx = new AudioContext();
    
    var osc = ctx.createOscillator();
    osc.frequency.value = 440;
    osc.type = 'sine';
    
    var gain = ctx.createGain();
    gain.gain.value = 0.5;
    osc.connect(gain);
    gain.connect(ctx.destination);
    
    osc.start(ctx.currentTime);
    osc.stop(ctx.currentTime + 5);
    
  • Web MIDI API
    MIDIデバイスを扱う
  • Web Speech API
    音読してもらう

ビデオ関係

2D・3Dグラフィック

SVG

SVG1.1 / SVG2
HTML DOMと同様にSVG DOMをJavaScriptから操作できるようになった。IE9以降。

Canvas

Canvas API
JavaScriptで絵が描けるようになった

WebGL

WebGL / WebGL 2
ブラウザでOpenGLライクな3Dグラフィックの描画。グラフィックボードで演算する。
非常に煩雑なJavaScriptコードを記述する必要があるため、ラッパーライブラリのthree.jsが使われることが多い。

WebVR

WebVR
VRデバイスとの接続についての仕様。デバイスからセンサーの値を取得するなど。

デバイスにアクセスする

※ネイティブアプリでやる場合はOS提供のAPIを使うので、あくまでもWebブラウザからデバイスへのアクセスです。

サーバリクエスト

  • XMLHttpRequest Level 2
    おなじみのAjaxです。Level2からCORSがサポートされました。
  • Fetch API
    XHRより低レベルのAPI。現状、Chrome・Firefoxのみ。
    後述のWebWorkersからも使える。
    
    fetch(url).then(function(response) {
      return response.text();
    }).then(function(text) {
      console.log(text);
    });
    
    Promiseが返ってきます。

Web Worker

Web Workers API

従来のwindowコンテキストとは別のスレッドでJavaScriptを動かせる。
重たい演算処理を別スレッドで行う、など。
このベーシックな機能はすべてのモダンブラウザに実装済み。

ServiceWorker

Web Workerのひとつで、ブラウザとネットワークの間のプロキシサーバーとして機能する。
PWAには欠かせないが、Chrome、Firefoxでしか動かない(モバイルも同様)。
  • ページのキャッシュを返す(ServiceWorkerの仕様にCache APIが含まれている)
  • オンラインになったらデータを同期する
  • 通知を出す

Androidの場合はChromeブラウザを起動していなくてもプロセスは生きている

Web Worker

ストレージ

Web Storage

Cookieより容量の大きなキーバリューストア。保存できるのは文字列。
sessionStoragelocalStorageがある。
すべてのブラウザで実装済み。
プライベートブラウジングでは保存できなかったり、ユーザーがクリアしようと思えばできる点に注意。

IndexedDB

Indexed Database API
Indexed Database API 2.0
Web Storageより「データベース」っぽいストレージ。基本的な機能は全ブラウザで使用できる。
キーバリューストアだが、テーブル(的なもの)やトランザクション、インデックスの概念がある。
WebWorkersから利用できるストレージはIndexedDBのみ。

WebRTC

WebRTC 1.0: Real-time Communication Between Browsers
Media Capture and Streams
Media Capture from DOM Elements

P2Pでブラウザ間の通信を行うための仕様。例えばビデオチャット。
Chrome、Firefoxで実装済み。
UDPを使う。
接続の確立にはサーバが必要だったり、The WebSocket APIの併用がデファクトだったり、実装はけっこう大変そう。

※WebRTCを利用した有名なビデオチャットサービスにappear.inがありますが、対応ブラウザは「Chrome, Firefox, Opera and Vivaldi.」となっています。
モバイルの場合は、アプリか、AndroidではChrome, Firefox, Operaとあります。

そのほか

  • History API
    HTML5の仕様に含まれている
    Custom Scroll RestorationはIE、Edgeで未実装。
  • Credential Management Level 1
    Chromeだけが対応中。ブラウザに保存されたID・パスワードの情報にアクセスできる。(もちろん生パスワードが見られるわけではない。)
  • Web Cryptography API
    JavaScriptでハッシュ(SHA-1、SHA-2)とか公開鍵の生成ができる。ブラウザ実装はまだ足並みが揃っていない感じ。
  • The Permissions API
    GPSとかプッシュ通知とかが使えるかどうかを判定してくれる。Chrome・Firefoxのみ。
  • Payment Request API
    AndroidのChromeのみで動いている・・・。仕様自体は草案段階。
    Credential Management APIと同様で、ブラウザに保存されたクレジットカード情報にアクセスできる。

おまけ:標準化から外れたもの

END