Webkit モジュールを含み、Dart (JS にコンパイル) を使用する Qt アプリケーションがあります。Qt で書かれた最低限のブラウザのようなものです。アプリケーションは基本的に、Web ページ上の特定のテキストを別のテキストに置き換えます。ユーザーが独自の Dart ファイルを作成して、独自のテキストを独自の別のテキストに置き換えることができるようにしたいと考えています。
プラグイン システムを作成するためのアプローチに関する推奨事項はありますか?
この質問には少し説明が必要だと思います。Qtアプリケーションのスクリプト作成にDartを使用することについて質問していますか(Dartがスクリプト言語の役割を果たしています)、またはJSにコンパイルされて使用されるDartアプリケーションのプラグインシステムについて質問していますか? Qtアプリケーションでは、おそらくQtScriptを介して(この場合、スクリプト言語の役割はJavaScriptによって実行されます)?
私はそれが後者の変種であると推測します(そして私はとにかく前者の変種について答えることができるようにQtについて十分に知りません)。
DartアプリケーションのすべてのプラグインがそのQtアプリケーションのビルド時に利用可能であると仮定して、DartをJSに動的にコンパイルする必要がないようにします。次に、Dartスクリプトをコンパイルすると、結果のJSにはそのから必要なすべて#import
のコードが含まれます。必要なのは、すべてのプラグインをインポートして呼び出す適切なスクリプトを作成することだけです(デッドコードが排除されるため、インポートだけでは不十分です)。
たぶん、例はもっと有益でしょう。プラグインがWebページで何らかの作業を行えるようにしたいとします。構造化する方法の1つは、すべてのプラグインが#library
、よく知られている名前のトップレベル関数(たとえばdoWork
)とは別のものになることです。プラグインの例:
// my_awesome_plugin.dart
#library('My Awesome Plugin')
doWork(page) {
page.replaceAll('JavaScript is great', 'Dart is great');
}
この性質のプラグインはいくつでも持つことができます。次に、(ビルド時に)Dartで次の簡単なメインスクリプトを生成します。
// main.dart
// these lines are automatically generated -- for each plugin file,
// one #import with unique prefix
#import('my_awesome_plugin.dart', prefix: 'plugin1');
#import('another_plugin.dart', prefix: 'plugin2');
main() {
var page = ...; // provided externally, from your Qt app
// and these lines are automatically generated too -- for each plugin,
// call the doWork function (via the prefix)
plugin1.doWork(page);
plugin2.doWork(page);
}
次に、JavaScriptにコンパイルmain.dart
すると、それらすべてのプラグインが含まれます。
プラグインシステムを構造化する他の可能性があります。各プラグインは、特定のインターフェイスを実装する(または特定の基本クラスから継承する)クラスである可能性がありますが、一般的なアプローチは同じです。少なくとも私がお勧めするアプローチは、各プラグインを個別のライブラリにすることです。
メインスクリプトを自動的に生成する手順はおそらく気に入らないでしょうし、私も気に入らないでしょう。しかし現在、Dartは新しいコードを動的にロードする1つの方法、つまり新しい分離を生成することしか許可していません。分離はJavaScriptにコンパイルされたときにWebワーカーとして実装されるため、QtScriptでどのように機能するか(または機能する場合でも)はわかりません。そのため、ここではこれについて説明しません。
Qtアプリケーションの実行時にDartスクリプトのコンパイルをサポートしたい場合は、事態はさらに複雑になりますが、私はすでにプロジェクトについて推測しすぎているので、本当に必要のないものについて書いているかもしれません。なので、とりあえずこのように仕上げます。