2012-06-25 71 views
1

我有一個Qt應用程序,其中包含一個Webkit模塊並使用Dart(編譯爲JS)。它就像一個用Qt編寫的裸機瀏覽器。該應用程序基本上用不同的文本替換網頁上的某些文本。我希望用戶能夠製作自己的Dart文件,以便用自己的不同文本替換自己的文本。我如何爲我的Dart應用程序添加一個插件系統?

有關創建插件系統方法的任何建議?

回答

4

我覺得這個問題需要澄清一下:你要問關於使用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只允許一種方式動態加載新代碼:產生新的分離物。我不確定在Qt​​Script中是如何(或者甚至是如何)工作的,因爲編譯爲JavaScript時,分離器會作爲Web工作者實現,所以我不會在這裏討論這一點。

如果你想支持在你的Qt應用程序的運行時編譯Dart腳本,事情會變得更加複雜,但我認爲我已經猜測你的項目太多了,而且我可能會寫關於你不需要的東西真的需要。所以我現在就這樣完成它。

+0

有趣的是,我一直在想同樣的條件,但像你一樣,我對主文檔的生成並不滿意。不過,我會試一試。再次感謝Ladicek。 –

+1

請注意,正在查看動態加載類,請參閱http://dartbug.com/3819(因此在將來不需要生成主腳本)。另外,如果你嵌入了Dart VM,嵌入式API可以讓你做到這一點(但我認爲情況並非如此)。 – Ladicek

相關問題