Funscript中接口如何导出

4
我已经成功运行了Funscript示例。现在,我正在尝试创建类似于Funscript库的东西,其中包含可以从Javascript代码调用的函数(并希望能有类!)。但我无法从从Funscript生成的.js文件中访问任何内容。
简而言之,我该如何使JavaScript调用Funscript?
2个回答

3

抱歉,但FunScript并不适用于这种情况。它设计用于在脚本中消费来自各个来源的代码和数据,而不是将代码导出为库。

你会注意到FunScript生成的代码相当丑陋。我们最近稍微改善了一下,但这些更改仅直接从FunScript存储库 (在撰写此文时) 可用。在生成可从其他基于JavaScript的语言消费的JavaScript之前,还有很长的路要走。

改进代码生成目前不是该项目的重要任务。在我们积极添加大块新功能时,我们不希望承诺以任何特定的样式/格式生成代码。同时,将一些F#概念映射到可消耗性和高性能的JavaScript很困难。例如:

  • 泛型类型、方法和函数
  • 泛型类型约束(例如平等和比较)
  • 反射

为了说明通用案例,假设在F#中,您有一个通用函数,该函数使用比较约束对通用类型的实例数组进行排序。首先,您将其与原始数值类型(如int)一起使用。其次,您将其与记录类型一起使用。如果为这两种情况生成相同的JavaScript代码,并且通过调用某些方法(例如Compare(...) )在对象上实现比较,则数值情况的性能非常差。要实现更好的性能,需要对生成的代码进行某种特殊化。在此处,将映射到内置JavaScript类型(如数字和字符串)的F#类型比较可以内联。这样可以获得更好的性能,但现在您拥有了相同F#函数的多个JavaScript版本。没有明确的方法以易于消费的方式呈现此生成的代码。

总之,FunScript设计做出了一些权衡,优先考虑泛型、性能和反射等方面,而不是代码生成等方面。你可能想看看WebSharper。它可能支持此用例。


我怀疑有很多权衡需要做出。谢谢你的回答,继续保持好的工作! - Ray

2
您可以通过将函数放在window对象上来公开函数。例如:
[<ReflectedDefinition>]
module Program

open FunScript
open FSharp.Data
open System.IO

module Foo =
  let SayHello name = Globals.window.alert ("Hello, " + name)

[<JSEmitInlineAttribute("window.SayHello = {0};")>]
let expose(f : string -> unit) : unit = failwith "never"

// Create a function that will be compiled into JavaScript...
let main () =
  expose(Foo.SayHello)

您可以从JavaScript中访问它们:

window.SayHello("Ray");

或者,事实上,只需:
SayHello("Ray");

我希望有像TypeScript生成的JS那样更系统化的东西,这样我就可以自动调用Foo.SayHello("ray"),而不需要属性。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接