【发布时间】:2016-12-15 14:08:45
【问题描述】:
我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”来处理这个问题(即在编译时完全内联所有库)。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间进行内联。这样做的自然方法是让源 Haxe 文件和一个单独的“头”目录充满 extern 描述我的模块的公共 API,这些 externs 以某种方式自动生成,因此它们不会需要手动维护。
我不知道如何让 Haxe 发出 externs。如果haxe-externs 是实际的“target platform” 对我来说是有意义的,这样我就可以做类似的事情:
$ haxe ClassName -hxe externsoutdir
如果 -D 标志之一像 -D dump (这似乎是其中的一部分)或一些虚构的、不存在的 -D dump-externs 存在,这将不太有意义,但仍然可以接受。然后你可以在编译到你最喜欢的目标时生成外部:
$ haxe ClassName -js outfile.js -D shallow-expose -D dump-externs=externsoutdir
我们的想法是采用这样的类定义:
@:expose
class ClassName {
function quack() {
trace('quack');
}
}
并在单独的目录中发出类似的内容:
extern class ClassName {
function quack():Void;
}
这样我就可以像这样从另一个模块中使用它:
@:expose
class MyClassName extends ClassName {
override function quack() {
super.quack();
trace('…and again I say “quack”');
}
}
$ haxe -cp path\to\externsoutdir MyClassName -js outfile.js -D shallow-expose
只有为用@:expose 或其他装饰器装饰的东西生成externs 才有意义。
我将弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成 extern 定义——难道 Haxe 不应该已经有办法做到这一点吗?
是否已经有一些我缺少的工具或内置方法可以做到这一点?在谷歌上搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部的项目。但这不是我的用例……
【问题讨论】:
标签: haxe