Electron、React Native、Cordova…Web技術でネイティブアプリ開発する方法を、アシアル田中さんに聞いた

こんにちは、編集長の白石です。

この記事は、9月24日に開催されるHTML5 Conference 2017に登壇するエキスパートに、予定しているセッションのトピックを中心に、様々な技術的なお話を伺おうというものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。

今回お話を伺ったのは、アシアル株式会社 代表取締役社長の田中正裕さんです。

田中さんのセッションは「Web技術でネイティブアプリを開発する話」(ホール 14:20-15:00)です。 (現在HTML5 Conferenceは定員オーバーの状態ですが、無料イベントということもあってキャンセルも多めに出るらしいので、あきらめずにキャンセル待ちすることをお勧めします!)

Webとネイティブ境目が曖昧になってきた

白石: 田中さんは、ずっとWebとネイティブのハイブリッドアプリの分野で活躍してらっしゃいます。そんな田中さんから見て、最近のWebやモバイルアプリ開発についてはどのように見ていらっしゃいますか?

田中: はい、まずはそもそも最近Webがネイティブにかなり近づいてきたな、と思っています。

例えば実現できる機能。以前はWebとネイティブはできることに差がありましたが、最近はWebにできることがすごく増えてきています。Service Workerの登場で、以前はWebでは実現が難しかった、プッシュ通知やバックグラウンド処理なども可能になってきている。

ネイティブはコードがバイナリにコンパイルされて高速に動く、という点でも、Web Assemblyの登場により、今後は目立ったディスアドバンテージではなくなっていくでしょう。そもそも、端末速度の向上とブラウザエンジンの高速化で、速度差自体が目立たなくなってきています。

白石: Web Assemblyは期待ですよね。そのうち、フルWeb AssemblyのWebアプリフレームワークが出たりするのではないか、と期待しています。

田中: きっと出るでしょうね。iOS 11がWeb Assemblyに対応したことも、すごく大きな意味を持っていると思います

他には、アプリの起動方法も違いとしてよく挙げられていましたが、Webはブラウザからアクセスするもので、ネイティブはインストールして使用するもの、という区分けも最近意味がなくなってきました。例えばProgressive Web Appsなんかはその象徴ですよね。ブラウザがWebアプリを端末にインストールしたら、あとはネイティブアプリと遜色なく動作する。

白石: Safariには昔から、ホームスクリーンにWebサイトへのブックマークを追加する機能がありますが、それがもっとスマートな形で実現しそうですね。

田中: そして、Web技術を使ってアプリを作る方法自体が今や多様化していて、以前のような「Webかネイティブか」という単純な二分法じゃなくなっているんですよね。

Electron

白石: はい、その多様化したアプリ開発手法を本日は伺いに参りました。一つ一つ教えてください。

田中: カンファレンスのセッションではコード例を挙げながらお話しようと思いますが、今日は口頭による説明で進めましょう。

ではまず最初に、Electronの紹介からいきたいと思います。クロスプラットフォームなデスクトップアプリを開発するためのフレームワークで、元々はGitHubが開発した「Atom Shell」というツールでした。

田中: 特徴としては、Chromiumを組み込んだブラウザレイヤーと、Node.jsによるネイティブレイヤーの二層構造になっているという点が挙げられるかと思います。WebViewはもちろん、Node.jsもクロスプラットフォーム性の非常に高いプラットフォームですので、Electronを用いると、クロスプラットフォームなアプリを簡単に開発することができます。

白石: 著名なところでいうと、SlackはElectronで書かれているんですよね。

田中: そうです。Slack、Visual Studio Code、そしてもちろんGitHub製のエディタであるAtomと、著名なベンダーもElectronの採用には積極的ですね。

白石: Electronの将来は明るそうですね。Electronの欠点とかはあるんでしょうか?

田中: WebViewの上で動作するので、やはりパフォーマンスやメモリ使用量の面では不利になりますね。ただ実際には、PCはモバイルに比べると速度面で優位ですので、そこまで気にするところでもありません。

さっき挙げた例で言うと、SlackやAtomは重いなあ…と感じることが多いですが、Visual Studio Codeはすごく軽快に動作します。なんでElectron開発元が開発しているAtomがあんなに重いのか(笑)。VS Codeの軽快さは、相当な技術力のなせる業なのかもしれません。

白石: さすがマイクロソフトってところですね。

Cordova

田中: では次はCordovaについてですが、これは説明の必要もないくらい有名なフレームワークですね。Electronのモバイル版と言ってもいいかなと。WebViewと、ネイティブ機能を利用するためのCordovaプラグインという「二層構造」であるところも同様です。

Electronと違うところは、よりベースとなるOSの依存度が高いというところが挙げられると思います。WebViewは基本的にOSネイティブのものを使用しますし、Cordovaプラグインは通常ネイティブの開発言語で開発します。(Electronの場合はWebViewは組み込みのChromium、ネイティブ部分はNode.js)

白石: 田中さんはMonacaの開発者でもあり、Cordovaのことは誰よりも知りつくしていらっしゃるかと思いますが、利点や欠点を教えていただけますか?

田中: 利点はやはりクロスプラットフォーム性です。複数のモバイルOS上で動作するアプリを、ほぼ1ソースで書くことができます。

欠点は昔から言われているように、パフォーマンスが遅いという点。ただ先程も申し上げたように、端末もブラウザも速度が向上していて、「遅さ」はあまり気にならないレベルになっていると思います。少なくとも、Monacaのユーザーに限って言うと、ほとんどの方が問題ないとおっしゃってますね。

白石: ぼくも、もうそういう段階なんじゃないかな…とは思っていたのですが、田中さんに言われると説得力が違いますね。

田中: 今では、Cordovaを使っていても、ユーザーが気付くこともほとんどないと思います。例えば、◯◯(某ECアプリ)も実はCordovaを使っているようなんです。

白石: えっ!あの◯◯が!ぼくもよく使っていますが、全然気づきませんでした。

田中: そうなんです。意外と広がっているんですよね。今後もその存在感は増していく…と言ってもいいんじゃないでしょうか。

React Native

田中: では次はReact Nativeです。Facebookが作っているモバイルアプリ用のフレームワークで、一言で言えばReactを使ってモバイルアプリを作るためのツールですね。Reactの仮想DOMを、ネイティブのUIコンポーネントを利用してレンダリングするものです。

白石: React Nativeは最近人気急上昇中ですよね。その理由は何なんでしょうか?

田中: React自体に人気があるということと、そしてFacebookが自ら使用しているのが大きいですね。React Nativeは、元々Instagramのチームが作っていたそうです。

白石: React Nativeの利点や欠点はなんでしょうか。

田中: WebViewの上で動作するのではなく、ネイティブに動作するアプリが作れるというのは大きな利点ですね。パフォーマンス上の問題も生じにくいし、ネイティブのルック&フィールをそのまま利用できる。

また、UIスレッドとJavaScriptのUIスレッドが最初から分かれているのも利点だと思います。JavaScriptの処理がUIスレッドの動作を阻害しないので、UIが60fpsを維持しやすい。

白石: では、React Nativeには欠点といえるものはありますか?

田中: 作ってみると分かるのですが、結構作り方に癖があるんですよね。それに慣れるのが少し大変かもしれません。コードの共通化は促進されるものの、クロスプラットフォームじゃないというところも、議論が分かれるところです。

白石: Facebookは「Learn Once Write Anywhere」(一度学べばどこでも書ける)と言っていますね。

田中: そうですね。クロスプラットフォームは最初から目指していない。そこもCordovaとは大きな違いです。

CordovaはWebそのものですから、ブラウザを使って開発し、ブラウザの機能が増えてネイティブと遜色なくなれば、なくなって当然のものという前提でした。React Nativeは、ネイティブアプリをJavaScriptで作るという発想です。なので、開発にはネイティブの知識が必要になります。JavaScriptを使用するので、開発体験自体はWebに近いものがあるのですが、やはりHTMLやCSSを使ったUI開発とは別物です。

NativeScriptとWeex

田中: あとはNativeScript、あとWeexというフレームワークを紹介していこうと思います。

白石: ここらへんまで来ると、聞いたことないという人も多そうですね〜。

田中: NativeScriptは、ネイティブで動作するアプリをJavaScriptで書けるフレームワークです。「React NativeからReactを抜いたもの」と考えてもいいでしょう。

白石: ぼくもNativeScriptの名前は聞いたことがあったのですが、Angularの界隈で耳にしました。

田中: そう、Angularと組み合わせて使えるというのを一つのウリにしています。Angularのイベントとかにも積極的に出ていて、Angularチームとの関係は良好そうです。

白石: 利点や欠点を教えていただけますか?

田中: 利点はやはりネイティブのパフォーマンスで動くこと、そしてAngularと組み合わせて使えることでしょうね。ただ、「組み合わせて使える」と言っても、React Nativeほどスムーズには使えないのが悩ましいところですが。

欠点は…なんといってもユーザーが少ないことですね。採用事例とかも探したのですが、今のところ見つかっていない状態です。GitHub上ではかなりの人気なのですが (筆者注: 2017/9/16時点で11,076のスターを集めている)。

あと、開発していたTelerikという会社がProgressという大企業に買収されてしまって。その後ちょっと開発が停滞してしまっているように見えるんですよね。それもちょっと心配なところです。

白石: 買収あるあるですね(笑)。

田中: 最後はWeexをご紹介しましょう。

これはVue.jsを使ってネイティブアプリを作れるというフレームワークです。React NativeのVue版と言っても差し支えないかと思います。

白石: では、利点もReact Nativeなどと同様に、ネイティブの速度で動く、ネイティブのUIコンポーネントが使えると言ったところですよね、きっと。

田中: はい、あと面白いのは、これってアリババが開発に携わっているんです。なので、実は中国ではすでに事例が多いそうなのですよね(筆者注: Weexのサイトに、「Who uses it」というセクションで採用企業の一覧がある)。

白石: おお、それはNativeScriptとは違うところですね。アリババが付いているとなると、開発リソースも割けそうだし、事例もどんどん増えていきそうです(筆者注: 元々アリババのGitHubリポジトリ上で開発されていたが、Apache Software Foudationに寄贈された)。

田中: Vue自体もすごく人気がありますしね。Vueに関心のある方にとっては、注目に値するプロダクトだと思います。

Web技術を用いたネイティブアプリ開発は広まるか?

白石: では最後にまとめとして、Web技術を使ってネイティブアプリを作るという手法は、今後も広がっていくのかどうかをお聞きしたいです。

田中: そうですね、今回取り上げた各プロダクトのnpmのダウンロード数とかを見ると、右肩上がりではあるんです。ただ、その事実を以て、Web技術によるアプリ開発の人気が高まっていると言い切れるかは微妙です。アプリ開発市場そのものも、まだまだ拡大していっていますからね。

個人的には、Web技術によるアプリ開発が、ネイティブの開発手法よりも人気が上回るようなことにはならないと思います。OSの開発元がオフィシャルに推進しているわけでも、何かを保証しているわけでもありませんし。これまでiOSやAndroidの開発者を雇って、アプリ開発を行っていたような企業が、Cordovaを選ぶようなことは、今後もあまり起きないと考えています。

白石: なるほど、冷静なご意見。

田中: ただ一つだけ言えるのは、Web技術者による、フロントエンドのアプリケーション開発が今後も伸びていくのは間違いないということです。それが純粋なWeb技術だけを用いてProgressive Web Appsを作るのか、先程紹介した技術のどれかを利用してモバイルアプリを作るのかについては、あまり変わらないと思います。

だから、元々Webをやっていた会社にとっては、既存のスキルセットや資産を使って、やれることの選択肢が増えてきているのは間違いありません

Web技術の進化も、Webブラウザによる実装もまだまだ続いていますし、Webの未来にはまだまだ期待しています。

白石: よくわかりました。田中さん、今日はWeb技術を使ってネイティブアプリを作るテクノロジーについて、幅広く教えていただきありがとうございました。大変勉強になりました。

週間PVランキング

新着記事

Powered byNTT Communications

tag list

アクセシビリティ イベント エンタープライズ デザイン ハイブリッド パフォーマンス ブラウザ プログラミング マークアップ モバイル 海外 高速化 Angular2 AngularJS Chrome Cordova CSS de:code ECMAScript Edge Firefox Google Google I/O 2014 HTML5 Conference 2013 html5j IoT JavaScript Microsoft Node.js Polymer Progressive Web Apps React Safari SkyWay TypeScript UI UX W3C W3C仕様 Webアプリ Web Components WebGL WebRTC WebSocket WebVR