我只想以某种方式说“我希望这个项目中的所有方法都使用[JavaScript]”手动注释每个方法都很烦人
3 回答
F# 3 允许您使用ReflectedDefinition属性(在 WebSharper 中也称为 [JavaScript])标记模块,该属性标记下面的所有方法。
查看有关 F# 3.0 语言功能的更多信息:
(说到不常见的属性,在 F# 3.0 中,[< ReflectedDefinition >] 属性现在可以放在模块和类型定义上,作为将其应用于模块/类型的每个单独成员的简写方式。)
我认为 Phil 的答案是要走的路——当你可以标记整个模块或类型时,它不会增加太多噪音,它还允许你区分 WebSharper 中的服务器端和客户端代码。
仅作记录,F# 编译器是开源的,因此某人(认为此问题很重要)可以轻松创建分支,该分支将添加一个额外的命令行属性来覆盖该设置。我认为这只是添加参数然后在中设置reflect
标志的默认值的问题check.fs
(这里是 GitHub 上的源代码)。
目前,主要 F# 存储库不接受添加新功能的贡献(请参阅此处的讨论),但这无疑是向 F# 团队发送功能请求的好方法 :-)
如果您使用 JavaScript 属性注释所有代码,WebSharper 编译器将尝试将所有内容转换为 JavaScript。WebSharper 开发中的一条经验法则是将服务器端代码和客户端代码分开,因此如果您的目标是 .NET 4.5,您可以简单地注释包含客户端代码的模块/类,而不是每个函数/成员。
namespace Website
open IntelliFactory.WebSharper
module HelloWorld =
module private Server =
[<Rpc>]
let main() = async { return "World" }
[<JavaScript>] // or [<ReflectedDefinition>]
module Client =
open IntelliFactory.WebSharper.Html
let sayHello() =
async {
let! world = Server.main()
JavaScript.Alert <| "Hello " + world
}
let btn =
Button [Text "Click Me"]
|>! OnClick (fun _ _ ->
async {
do! sayHello()
} |> Async.Start)
let main() = Div [btn]
type Control() =
inherit Web.Control()
[<JavaScript>]
override __.Body = Client.main() :> _