ウェブアプリケーション

ウェブアプリケーション(Web application)は、ウェブWorld Wide Web)技術を基盤としたアプリケーションソフトウェアである。

概要

編集

WebHTTPHTMLDOMJavaScriptWebWorld Wide WebWebWeb

使



Web-WWW2010APIWeb

特徴

編集

利点(メリット)

編集
更新が容易である
Webサーバ上のファイルを更新するもしくは、クライアント側はHTTPアクセスすることで、最新のウェブアプリケーションを利用できる。
クライアント側にアプリケーションのインストール不要
Webサーバで処理を行って出力結果のファイルをクライアント側(ウェブブラウザ)で表示するだけなのでクライアントはウェブアプリケーションを事前にインストールする必要はない。
ウェブブラウザがあれば動作環境に依存しない
各クライアント側の環境が違っていてもウェブブラウザがあれば、クロスプラットフォームに対応できる。

欠点(デメリット)

編集

Webアプリの発展に伴って、問題点が解決し、また新たな問題が提示されるという流れが続いている。従来指摘されていたデメリットと提案されている解決技術の例は以下である。

  • 標準機能でメディア再生が困難: HTML5 HTMLMediaElementによるメディア再生・制御がある。[1]
  • Webサーバ障害時・通信途絶時に利用不可: PWA(install + Service Worker API[2])によるオフライン動作
  • ネイティブアプリに比較して遅い実行速度: WebAssemblyによるネイティブ水準コード実行[3]

歴史

編集

1990World Wide Web便UX

WebWebHTMLCGIHTMLWeb

CGIJava ServletJava EEApache HTTP ServerPHPmod_php[4]Active Server PagesAjaxAdobe FlashHTML5

2019Progressive web appPWA[5]WebWeb

技術

編集

HTTPHTTPHTTPCookieID

プログラミング言語

編集

WebDOMWebAssemblyCRustJavaScriptTypeScriptAltJS

WebHTML1HTMLWebHTMLWeb ComponentsHTML

HTMLDOMelement.setAttribute()templatingHTML: lit-htmlJSX

WebWeb Components<slot>.assignedElements()[6]Reactprops.childrenprops.xReact.Children[7][8]

ほとんどのWebアプリはHTMLを基盤技術としており、WebブラウザはDOMを介してドキュメントへのアクセスを可能にしている。Webアプリに求められる性能が高まるにつれて従来のDOM更新速度が不十分になり、DOM更新に関わるいくつかの技術が登場した。仮想DOM(Virtual DOM)、DOM templating(lit-html)はその例である。

通信プロトコル

編集

HTTPHTTPSHTTPgRPCWebSocketHTTPWebRTCHTTP/3HTTP over QUICQUIC

キャッシュ・同期

編集

Web



client-side proxy: Service Worker API Cache

:HTTPHTTP ETag

Web Proxy

CDN

BFF

DB in-memory

WebPOST

delta sync[9]deltadelta syncBaseQueryDeltaQuery+SubscriptionQuery[9]BaseQueryDeltaQueryDeltaQueryQueueDeltaQueryfetchWebSocketsubscription

Delta SyncBaseQueryDeltaQuery使BaseQueryDeltaQueryc.f. exponential backoff+jitterSubscription

アクセス制御

編集

伝統的にはID・パスワードによる認証AuthN/認可AuthZを用いたアクセス制御がおこなわれてきたが、セキュリティと利便性の観点からトークンベースの手法に移行しつつある。ソーシャル・ログインOAuthOpenID Connect等に対応したクラウドサービスが提供する認証・認可サービス(IDaaS)がしばしば利用される。

データバインディング

編集

Webアプリではしばしば、データ更新に伴うUI更新・UI操作によるデータ更新をデータバインディングによって暗示的におこなう。React・LitElementなどのフロントエンドフレームワークがデータバインディングを担っている。宣言的に構築したHTML(likeな)UI定義にデータを混ぜることでデータバインディングを実現する場合が多い。

データアクセス

編集

WebfetchAPIRESTGraphQLRESTOpenAPI SpecificationGraphQL

アーキテクチャ

編集

WebWebWeb

機能単位=サービスの連携

編集

 = 







microservice: 

Micro frontends: 

Self-contained System (SCS): [10]

1c.f. KISS1

WebREST/Web

機能による分類

編集

メディア(動画・音声)

編集

高レベルの要素から低レベルのAPIまでWeb標準で提供されている。

  • <audio> 要素: src属性の設定のみで再生ウィジェットを表示可能

オフライン

編集

Webサーバとの通信(ネットワーク)が途絶している状態をオフラインという。ソフトウェアがオフライン時にも動作するには

  • ローカルに存在するソフトウェアプログラム
  • 失敗するネットワークリクエストの処理
  • オンライン復帰時の同期

などが必要とされる。Webアプリは一般にインストール(プログラムのローカルへの保存と組み立て)を必要としないため、オフライン状態ではそもそもアプリのプログラムにアクセスできない。そのためWebアプリではオフライン対応に特別な仕組みが必要になる。オフライン対応を前提としたWebアプリへの標語として「オフラインファースト/offline first」がある。

ローカルに保存されたプログラム
編集

WebWebURLrequestresponseWebrequestresponseWebService Worker APIFetchEventCacheService WorkerfetchEventrequestresponseCache storagerequestresponseWeb
失敗するネットワークリクエストの処理・オンライン復帰時の同期
編集

多くのWebアプリは起動後もネットワークを介した情報のやり取りを行う。オフライン時にはネットワーク途絶によりこれらのネットワークリクエストが失敗する。ゆえに

  • 失敗リクエストの処理(適切に失敗し、アプリを落とさない)
  • 失敗リクエストの保存・破棄
  • オンライン復帰時の失敗リクエストリトライ
  • オフラインの間に外部で発生した情報との競合解決・同期

などに対応する必要がある。

例えばGmailなどのメールアプリは、適宜メールサーバへ新着メールの問い合わせをおこなっている。オフライン時にはネットワーク途絶によりメールの送信ができなくなるが、リクエストを単に破棄すると書いたメールを捨てることになってしまう。失敗リクエスト時にメールを送信待ちリストに加えるのか、あるいは下書きに戻すのかなどが重要な設計項目になる。待ちリストに加える場合はオンライン復帰時の適切な再送信(リトライ)機能が必要である。またオフラインの間にPCブラウザのGmailから下書きを編集し、同時にスマホのGmailからも下書きに別の変更を加えた場合、オンライン復帰時に2つの相反する編集が存在するため、競合を解決・同期しなければいけない。

脚注

編集


(一)^ HTMLMediaElement  HTMLElement  HTMLMediaElement. MDN web docs

(二)^ Service Worker使 API. MDN web docs

(三)^ WebAssembly  WebAssembly  - WebAssembly . MDN web docs

(四)^ Perlmod_perlPythonmod_pythonRubymod_ruby

(五)^ 使 . MDN web docs

(六)^ assignedElements()  HTMLSlotElement  MDN web docs - Web API

(七)^  children  props 使... children  props  props  React Docs - vs

(八)^ React.Children  this.props.children  React Docs - React  API

(九)^ abDelta Sync 使2 () AWS AppSync - : Delta Sync

(十)^ The Self-contained System (SCS) approach is an architecture that focuses on a separation of the functionality into many independent systems, making the complete logical system a collaboration of many smaller software systems. scs-architecture.org

関連項目

編集