Webkitを使用しないNode-Webkit

どういうわけか、デスクトップアプリケーションnw.jsについて議論していました。 すべては問題ありませんが、ブラウザーエンジン全体を分散する必要性(時間が経つにつれて、新しい機能が追加されても小さくならず、現在は圧縮された30MBの重さ)が必要です。

しかし、システムブラウザーでUIを表示できるnode.js用のモジュールを作成したらどうでしょうか。

カットの下で、その試みについて説明します。それがどのようなものか、努力する価値があるか、使用できるか、結果として何が起こったのかを説明します。



ディクスライマー



基本的に、このプロジェクトは概念実証として作成されました。再生、表示、確認を行います。 「組み込みのWebビューを備えた小さなアプリケーションが必要」または「デスクトップアプリケーションウィンドウでサイトのラッパーが必要」というスタイルで、3〜4件注文しました。 誰かが私の経験を役に立つと思うかもしれないので、私はそれを公開しました。 githubのコード。 コードのニュアンスを詳細に説明するのではなく、目標はコードを説明することではなく、結果の適合性について考えることです。



仕組み



アプリケーションは、そのエントリポイントを含むnode.jsで静的にコンパイルされます。 起動時に、ウィンドウ表示ロジックを備えたネイティブモジュールがノードに追加され、制御が_thirdPartyMain.jsに転送されます(ノードにそのような可能性があります)。 そこから、ユーザーmain.jsがロードされ、uiモジュールが接続されます。 モジュールはhttpサーバーを起動し、指定された設定でウィンドウを開き、ユーザーコンテンツを提供する組み込みサーバーのアドレスにwebviewを向けます。 ウィンドウはイベント(移動、最小化など)を生成し、メソッドを実行できます(閉じるなど)。



Webview



ActiveX WebBrowserは Windowsに挿入されます(これは同じMSIEですが、チューブラー、住所行などはありません)。 デフォルトでは、多くの不要なダイアログ(奇妙な方法でオフになります)が表示されますが、一般的には希望どおりに機能します。 IE、それはよく更新されませんが、XPをサポートする必要があったので、Windowsの古いバージョンではWebキット(クロム埋め込みフレームワーク)をダウンロードできます。 必要に応じて、ユーザーが気にしない場合、アプリケーションはライブラリをダウンロードして展開し、Webキットで動作します。

ケシの下では、すべてが透明であり、統合されたIEと比較してWebKit WebViewははるかにシンプルで理解しやすいものです。 Linuxでは、webkit-gtkがあります。



アプリケーションのパッケージング



アプリケーションを1つのEXEにパックする必要がありました。 最も適切な形式はZIPです。末尾から読み取られるため、実行可能ファイルに何でも追加して、自分で解凍することができます。 SFXもこの原則に基づいています。 node.jsから使用する場合、fsの呼び出しにフックを掛け、ディスクから読み取る代わりに、アーカイブ内のファイルへの要求を仮想ファイルシステムにリダイレクトできます。



ブラウザの相互作用



IEとWebKitは、C ++からJSへ、およびその逆の両方でやり取りする方法を提供します。 IEでは、関数を含むjavascriptオブジェクトはIDispatchオブジェクトです。 そのようなオブジェクトのtypeofをチェックすると、javascriptエンジンは不明な値を返します。これらはいわゆるホストオブジェクトです(ES6標準でtypeof演算子のそのような結果を使用することは推奨されなくなりましたが 、非標準タイプについては何も言われていませんでした)。 ホストがこのメソッドを実装していれば、window.externalオブジェクトにアクセスして、C ++から何かを呼び出すことができます。

同様に、Webkitでは、ウィンドウプロパティを、呼び出しに使用できるメソッドを持つオブジェクトとして追加できます。



node.jsとの相互作用



ノードでは、プラグインを作成するプロセスが十分に文書化されてます 。 組み込みアドオンも同じ方法で作成されますが、別のマクロに登録されます。 アドオンクラスを作成すると、EventEmitterから継承され、emitメソッドへの参照を受け取ることでイベントを生成できます。

Node.jsは意図的に別のスレッドに存在するため、長時間の操作によってUIがブロックされないため、UVライブラリを使用してノードにメッセージを送信し、同期します。



何がうまくいった



アプリケーションサイズ



2〜3 MB(アンパック7)です。 原則として、node.jsを使用せずにアプリケーションでページを開くだけでよい場合は、アセンブリを小さくすることができます(一般的に、サイズのためにすべてが行われました)。



打ち上げ時間



なぜなら アプリケーションは追加のフレームワークを使用せず、平均1秒ですばやく起動します(最初の起動時については、以下を参照)。 プロファイリングを追加すると、ブラウザの初期化に主な時間を費やすことができます。



問題



最初の打ち上げ



Windowsは、より頻繁に使用するアプリケーションとコンポーネントの起動を最適化します。 IEがほとんど使用されない場合、アプリケーションが最初に起動するのは、オペレーティングシステムとコンピューターによって異なりますが、3..10秒前後です。



ブラウザのバージョン



IEは、ブラウザをダウンロードするためのツールとして使用されることが非常に多くまったく更新されません(ただし、最新バージョンのWindowsでは状況は改善されています)。 IEを強制的に更新することはできません(ダイアログを表示するには、アプリケーションからIEを更新することは自殺に相当します。IEの更新は複雑で、長く、多くの場合再起動が必要です。そのようなユーザーをモックすることはできません、彼は別のアプリケーションを見つけるだけです)。

ブラウザのバージョンはOSに関連付けられています。WindowsXPにはIE10はありません。OSX LionにはSafari 8はありません。



Javascriptコンテキスト



node.jsオブジェクトはブラウザで使用できません。その逆も同様です。対話は、従来のクライアントサーバーアプリケーション(xhr)のように、またはプログラムによって提供される方法(ウィンドウまたはノードのpostMessage)で行われます。 Web Workerの場合と同様に、転送できるのは単純なデータのみです。 コンテキストブリッジを作成することは可能でしたが、ES6がほとんどここにあり、たとえばIE10でプロキシオブジェクトを使用して何をするかが不明であるため、まず困難で重要で、次に近視眼的です。



なに



win / mac / linuxのアセンブリがあり、原則としてカスタマイズなどに使用できます。 誰かが突然必要になったときに、カスタマイズされた「ブラウザアプリケーション」を作成するために使用します。 比較的安定していますが、気にせず品質をリリースしませんでした。



結論



アプリケーションがダウンロードされることはほとんどなく、インターネットは非常に高速になりました(アプリケーションをインストールする場合、EDGEは実際には無視できます。アプリケーションはサイトではないため、道路にインストールされないため)、システムブラウザーの使用には未解決の問題があります。 ほとんどの場合、ゲームはろうそくに値するものではなく、Webキットを使用する方がより正しいようです。 目的が主に新しいOS向けの小さなアプリケーションを作成することである場合-または場合によっては可能です。



参照資料






All Articles