我怎么能为我的Dart应用程序添加插件系统?

时间:2012-06-25 11:56:12

标签: plugins dart

我有一个包含Webkit模块和使用Dart(编译为JS)的Qt应用程序。它就像用Qt写的一个简单的浏览器。该应用程序基本上用不同的文本替换网页上的某些文本。我希望用户能够制作自己的Dart文件,用自己的不同文本替换自己的文本。

有关创建插件系统的方法的任何建议吗?

1 个答案:

答案 0 :(得分:4)

我认为这个问题需要一点澄清:您是否在询问使用Dart编写脚本 Qt 应用程序(Dart扮演脚本语言的角色),或者您是否在询问插件系统对于编译为JS并在Qt应用程序中使用的 Dart 应用程序,可能通过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');
}

你可以根据自己的意愿拥有这种性质的插件。然后,您将(在构建时)在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);
}

然后,如果您将main.dart编译为JavaScript,它将包含所有这些插件。

构建插件系统还有其他可能性:每个插件可以是实现特定接口的类(或继承自特定基类),但一般方法是相同的。至少我建议的方法 - 使每个插件成为一个单独的库。

您可能不喜欢自动生成主脚本的步骤,我也不喜欢它。但是目前,Dart只允许一种方式动态加载新代码:产生新的隔离区。我不确定在Qt​​Script中是如何(或者甚至是否),因为在编译为JavaScript时,隔离区是作为Web worker实现的,所以我不会在这里讨论它。

如果你想在Qt应用程序的运行时支持编译Dart脚本,事情会变得更复杂,但我认为我已经猜到了你的项目太多了我可能会写一些你不是真的需要。所以我现在就这样完成它。