1

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

对于创建插件系统的方法有什么建议吗?

4

1 回答 1

4

我认为这个问题需要稍微澄清一下:您是在询问使用 Dart 编写Qt应用程序的脚本(其中 Dart 扮演脚本语言的角色),还是询问编译为 JS 并使用的Dart应用程序的插件系统在 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');
}

您可以拥有任意数量的这种性质的插件。然后,您将(在构建时)在 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 只允许一种动态加载新代码的方法:产生新的隔离。我不确定它在 QtScript 中如何(或什至是否)工作,因为隔离在编译为 JavaScript 时被实现为 web worker,所以我不会在这里讨论这个。

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

于 2012-06-25T16:32:53.147 回答