Javascript 如何在Funscript中导出接口

Javascript 如何在Funscript中导出接口,javascript,f#,funscript,Javascript,F#,Funscript,我已经让Funscript示例工作了。现在,我正在尝试创建一个类似于Funscript的库,它具有可以从javascript代码调用的函数(希望还有类!)。但是我看不到从Funscript生成的.js中访问任何内容的方法 简而言之,如何让Javascript调用Funscript?对不起,这不是为这个用例设计的。它设计用于在脚本中使用来自不同来源的代码和数据,而不是将代码导出为库 您会注意到FunScript生成的代码非常难看。我们最近对其进行了一些改进,但这些更改只能直接从(撰写本文时)获得。

我已经让Funscript示例工作了。现在,我正在尝试创建一个类似于Funscript的库,它具有可以从javascript代码调用的函数(希望还有类!)。但是我看不到从Funscript生成的.js中访问任何内容的方法

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

对不起,这不是为这个用例设计的。它设计用于在脚本中使用来自不同来源的代码和数据,而不是将代码导出为库

您会注意到FunScript生成的代码非常难看。我们最近对其进行了一些改进,但这些更改只能直接从(撰写本文时)获得。在它生成可以从其他基于JavaScript的语言中使用的JavaScript之前,还有很长的路要走

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

[<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)
  • 泛型类型、方法和函数
  • 泛型类型约束(关于等式和比较等)
  • 倒影
为了说明泛型情况,假设在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)
或者,事实上,简单地说:

SayHello("Ray");

我怀疑有很多需要权衡的地方。谢谢你的回答。继续努力!我希望有更系统的东西,比如TypeScript生成的JS。所以我可以自动调用——没有属性——Foo.SayHello(“ray”)