我如何让 haxe 生成 externs?

How do I get haxe to generate externs?

我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”(即在编译时完全内联所有库)来处理这个问题。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间进行内联。这样做的自然方法是同时拥有源 Haxe 文件和一个单独的“headers”目录,其中包含 extern 描述我的模块的 public API,其中这些 extern 以某种方式自动生成,因此不需要手动维护。

我不知道如何让 Haxe 发出外部事件。如果 haxe-externs 是一个实际的 “target platform” 对我来说是有意义的,这样我就可以做类似的事情:

$ haxe ClassName -hxe externsoutdir

如果像 -D dump 这样的 -D 标志之一(这似乎是其中的一部分)或一些虚构的、不存在的 -D dump-externs存在。然后你可以在编译到你最喜欢的目标时生成 externs:

$ haxe ClassName -js outfile.js -D shallow-expose -D dump-externs=externsoutdir

想法是采用这样的 class 定义:

@: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 或其他装饰器装饰的东西生成 extern 才有意义。

我会弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成 extern 定义——Haxe 不应该已经有办法做到这一点吗?

是否已经有一些工具或 built-in 方法让我无法做到这一点?在谷歌搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部文件的项目。但这不是我的用例……

更新: --gen-hx-classes 在 Haxe 4.0.0-rc3 的某个时间 removed。显然该功能仍然作为 -D gen-hx-classes 秘密存在,但请注意,如果您依赖它,它似乎会消失。


我相信 --gen-hx-classes 选项可能就是您要找的。奇怪的是我在 compiler flags list.

中没有看到它

我在模块化 JavaScript 构建系统中使用它,与您所说的类似。

我相信它创建了一个 .hx 文件的目录,这些文件是构建生成的每个 class 的外部文件(包括那些来自 Haxe 标准库的文件。)实际上,获取 class 的副本标准库中的es可能是你会遇到的问题

您可能还需要使用 @:keep(或相关宏)来确保消除死代码不会删除其他构建所需的东西。

您可能还需要从一个或另一个构建中排除 class,例如--macro 'exclude("haxe.io.Input")'(或者,excludeFile 实际上对于整个排除列表的性能更高。)