我已经有了Funscript示例。现在我正在尝试制作类似Funscript库的东西,它具有可以从javascript代码调用的函数(希望是类!)。但是我看不到从Funscript生成的.js访问任何东西的方法。
简而言之,我如何让Javascript调用Funscript?
答案 0 :(得分:3)
很抱歉,FunScript不是针对此用例设计的。它旨在消耗脚本中各种来源的代码和数据,而不是将代码导出为库。
你会注意到FunScript生成的代码非常难看。我们最近略有改进,但这些更改只能直接从the FunScript repository获得(在撰写本文时)。在它生成可以从其他基于JavaScript的语言中使用的JavaScript之前,还有很长的路要走。
目前,改进代码生成不是项目的高优先级任务。我们不想承诺以任何特定的样式/格式生成代码,同时我们正在积极地添加大量新功能。此外,很难将F#中的一些概念映射到可消耗和高性能的JavaScript中。例如:
为了说明一般情况,假设在F#中,您有一个泛型函数,它使用比较约束来对泛型类型的实例数组进行排序。首先,将它与原始数字类型(如int)一起使用。其次,您将它与记录类型一起使用。如果为两种情况生成相同的JavaScript代码,并且通过在对象上调用某些方法Compare(...)
来实现比较,则会导致数字情况的性能非常差。为了获得更好的性能,需要对生成的代码进行一些特化。这里可以内联映射到内置JavaScript类型(如数字和字符串)的F#类型的比较。这提供了更好的性能,但是,您现在拥有相同F#函数的多个JavaScript版本。没有一种明确的方式以易于使用的方式呈现此生成的代码。
总之,FunScript设计做了一些权衡,优先考虑支持泛型,性能和代码生成之类的事情。您可能希望查看WebSharper。它可能支持这个用例。
答案 1 :(得分:2)
您可以通过将函数放在窗口对象上来公开函数。例如:
[<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");