我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”处理这个问题(即在编译时完全内联所有库)。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间内联。执行此操作的自然方法是同时拥有源 Haxe 文件和一个单独的“标头”目录,其中填充了描述我模块的公共 API 的
extern
,这些 extern
以某种方式自动生成,这样它们就不会需要手动维护。
我不知道如何让 Haxe 发出外部信号。如果
haxe-externs
是一个实际的“目标平台”,这对我来说是有意义的,这样我就可以做类似的事情:
$ 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
只有为用
extern
或其他装饰器装饰的东西生成 @:expose
才有意义。
我将弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成
extern
定义——Haxe 不应该已经有办法做到这一点吗?
我是否已经缺少一些工具或内置方法来执行此操作?当谷歌搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部的项目。但这不是我的用例......
更新:
--gen-hx-classes
在 Haxe 4.0.0-rc3 周围的某个时间被删除。显然,该功能仍然作为 -D gen-hx-classes
秘密存在,但请注意,如果您依赖于此,它似乎会消失。
我相信
--gen-hx-classes
选项可能就是您正在寻找的。奇怪的是我在编译器标志列表中没有看到它。
我在模块化 JavaScript 构建系统中使用它,类似于你所说的。
我相信它会创建一个 .hx 文件目录,这些文件是构建生成的每个类(包括 Haxe 标准库中的类)的外部文件。实际上,在标准库中获取类的重复项可能是您将面临的问题。
您可能还需要使用
@:keep
(或相关宏)来确保死代码消除不会删除其他构建所需的内容。
您可能还需要从一个或其他构建中排除某个类,例如
--macro 'exclude("haxe.io.Input")'
(或者,excludeFile实际上对于整个排除列表来说性能更高。)
只需使用 codegen haxelib。这个基于宏的库可以为 JavaScript 和 TypeScript 生成 haxe extern。