我有一個Qt應用程序,其中包含一個Webkit模塊並使用Dart(編譯爲JS)。它就像一個用Qt編寫的裸機瀏覽器。該應用程序基本上用不同的文本替換網頁上的某些文本。我希望用戶能夠製作自己的Dart文件,以便用自己的不同文本替換自己的文本。我如何爲我的Dart應用程序添加一個插件系統?
有關創建插件系統方法的任何建議?
我有一個Qt應用程序,其中包含一個Webkit模塊並使用Dart(編譯爲JS)。它就像一個用Qt編寫的裸機瀏覽器。該應用程序基本上用不同的文本替換網頁上的某些文本。我希望用戶能夠製作自己的Dart文件,以便用自己的不同文本替換自己的文本。我如何爲我的Dart應用程序添加一個插件系統?
有關創建插件系統方法的任何建議?
我覺得這個問題需要澄清一下:你要問關於使用DART for腳本的Qt應用(其中省道扮演一個腳本語言的作用),或者是你問一個插件系統飛鏢應用程序編譯爲JS並用於Qt應用程序,可能通過QtScript(在這種情況下,腳本語言的作用是由JavaScript播放的)?
我認爲它是後一種變體(而且我不知道Qt能夠回答關於前一個變體的問題)。
讓我們假設Dart應用程序的所有插件在Qt應用程序的構建時間都可用,這樣就不需要動態地將Dart編譯爲JS。然後,如果您編譯Dart腳本,則生成的JS將包含來自其#import
的所有必需代碼。所有你需要的是創建一個適當的腳本,導入所有插件並調用它們(導入是不夠的,因爲死代碼將被消除)。
也許一個例子會更具啓發性。假設你想允許插件在網頁上做一些工作。你可以構造它的一種方式是,每個插件都將是一個獨立的#library
,它具有一個衆所周知的名稱的頂層函數(如doWork
)。一個插件的例子:
// my_awesome_plugin.dart
#library('My Awesome Plugin')
doWork(page) {
page.replaceAll('JavaScript is great', 'Dart is great');
}
如你願意,你可以有這種性質的許多插件。然後,你會(在編譯時)生成以下簡單的主腳本飛鏢:
// 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);
}
然後,如果你編譯main.dart
爲JavaScript,這將包括所有這些插件。
還有其他的可能性來構造插件系統:每個插件可以是一個實現特定接口(或從一個特定的基類繼承)的類,但一般的方法是相同的。至少我會推薦的方法 - 將每個插件製作成單獨的庫。
您可能不喜歡自動生成主腳本的步驟,我也不喜歡它。但目前,Dart只允許一種方式動態加載新代碼:產生新的分離物。我不確定在QtScript中是如何(或者甚至是如何)工作的,因爲編譯爲JavaScript時,分離器會作爲Web工作者實現,所以我不會在這裏討論這一點。
如果你想支持在你的Qt應用程序的運行時編譯Dart腳本,事情會變得更加複雜,但我認爲我已經猜測你的項目太多了,而且我可能會寫關於你不需要的東西真的需要。所以我現在就這樣完成它。
有趣的是,我一直在想同樣的條件,但像你一樣,我對主文檔的生成並不滿意。不過,我會試一試。再次感謝Ladicek。 –
請注意,正在查看動態加載類,請參閱http://dartbug.com/3819(因此在將來不需要生成主腳本)。另外,如果你嵌入了Dart VM,嵌入式API可以讓你做到這一點(但我認爲情況並非如此)。 – Ladicek