在 WebSharper 中与 JavaScript 互操作不是问题。我们为现有的 JS 库提供了很多绑定,如果缺少任何功能,您可以使用如下代码在 F# 中相当快速地恢复它:
[<Direct "jQuery($x).hide()">]
let hide (x: obj) = ()
F# 中的挑战是类型安全——你愿意在无类型(通常是无类型!)JavaScript 库之上改进多少类型安全和精确的代码完成。我从未使用过 ClojureScript,但我想这甚至不是一个问题,因为 Clojure 也是无类型的。
与底层 .NET 平台的互操作确实是“危险的”。正如 Tomas 所指出的,WebSharper 要求对所有 JavaScript 可调用函数进行注释。我们已经解决了一些标准类(字符串、字典、地图和集合等集合)的限制,但支持还远未完成。
使用 WebSharper,您可以在服务器上运行 .NET 代码并通过 AJAX 相当透明地使用它:
[<Remote>]
let add (x: int) (y: int) = async.Return(x + y)
[<JavaScript>]
let remoteAdd () =
async {
let! sum = add 1 2
return JavaScript.Log("RESULT", sum)
}
|> Async.Start
不幸的是,如果您必须在客户端上运行大型 .NET 库,这不是一个解决方案,您可能不得不转向 Silverlight 的方向。
免责声明 - 我正在开发 WebSharper,所以我的输入显然是有偏见的。话虽如此,在 WebSharper 和 Pit 之间进行选择时,请记住 WebSharper 具有积极的开发、支持,并已在实际项目中使用。由于我们在较大的项目中使用它,因此我们必须注意优化输出代码并解决 F# 反射模型中的一些限制和错误,甚至为了我们的目的重写 F# 元数据读取器。这意味着我可以从 WebSharper 跟踪器中提取数十个已关闭的问题,并将它们重新发现为 Pit 问题。我不这样做,因为人类会因这种重复劳动而受到损害。