如何在 Funscript 中导出接口



我已经有了Funscript示例。现在我正在尝试制作类似 Funscript 库的东西,它具有可以从 JavaScript 代码调用的函数(希望是类!(。 但是我看不到从 Funscript 生成的.js中访问任何内容的方法。

简而言之,我如何让Javascript调用Funscript?

抱歉,FunScript 不是为这个用例设计的。它旨在使用脚本中各种源的代码和数据,而不是将代码导出为库。

你会注意到FunScript生成的代码非常丑陋。我们最近稍微改进了它,但这些更改只能直接从 FunScript 存储库获得(在撰写本文时(。在它生成可以从其他基于 JavaScript 的语言中很好地使用的 JavaScript 之前,还有很长的路要走。

改进代码生成目前不是项目的高优先级任务。我们不想在积极添加大量新功能的同时,致力于以任何特定样式/格式生成代码。此外,很难将 F# 中的某些概念映射到可消费和高性能的 JavaScript。例如:

  • 泛型类型、方法和函数
  • 泛型类型约束(关于相等和比较之类的东西(
  • 反射

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

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

您可以通过将函数放在窗口对象上来公开函数。例如:

[<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");

最新更新