Kyl*_*yle 20 .net javascript c# asp.net-mvc
我正在将Script#,JSIL和SharpKit看作是用于将C#编译为Javascript的工具,因此我可以在Visual Studio中使用C#编写AJAX的客户端功能.
每个JSIL,Script#和SharpKit的优点和缺点是什么?
我的项目是一个使用剃刀引擎和C#的MVC4项目,如果重要的话.
Kat*_*add 21
如果你想直接与MVC项目集成,那么像Script#或SharpKit之类的东西可能是你最好的选择 - 我知道Script#内置的东西可以使这种集成变得更容易,所以我会从那里开始.
如果您确实想尝试使用JSIL,它可能具有您需要的核心功能,但您可能需要的东西 - 如可视化工作室集成,自动部署等 - 并不存在.目前它主要针对应用程序的交叉编译,因此它做得很好但不是其他用例的好工作.
我将尝试总结一下您可能想要考虑JSIL而不是其他替代方案的原因 - 由于我没有使用它,我无法真正评论这些替代方案的优缺点:
JSIL对C#4中可用的功能提供了极大的支持.值得注意的是(因为其他工具不支持它们,或者它们很复杂)包括:
dynamic, yield, Structs, ref/out, Delegates, Generics, Nullables, Interfaces和 Enums.
当然,上面的一些内容并没有完全的支持 - 为了了解绝对可行的事情,你可以查看测试用例 - 每个都是一个小的自包含的.cs文件,经过测试以确保JSIL和本机C#产生相同的输出.
这种广泛支持的原因是我的目标是使JSIL能够将完全未修改的 C#应用程序转换为工作JS.对于JSIL网站上的所有演示,这是真的,我有几个近乎完成的大型真实游戏的端口,这也是如此.
另一个原因是JSIL让你的C#和你的JavaScript相对简单.
所有C#类型和方法都通过尽可能友好的javascript接口公开.JS版本具有基本的重载解析和分派,因此本机C#接口可以从脚本代码中调用,就像在大多数情况下它们是本机JS一样.您不必采取任何步骤来专门标记您希望向JS公开的方法,或者为它们指定特殊名称,或者除非您愿意.
当你想从C#调用JS时,可以通过以下几种方式实现:
JSIL积极使用类型信息以及您提供的元数据,尝试并安全地优化它为您生成的JavaScript.在某些情况下,这可以产生比手工编写的更好的等效JavaScript - 目前这是真正的主要区域是使用结构的代码,但它也适用于其他情况.
例如,在此代码段中,JSIL能够静态地确定尽管代码隐含了结构副本的数量,但代码中没有一个副本实际上是正常运行所必需的.由此产生的JavaScript最终没有任何不必要的副本,因此它的运行速度远远超过了你天真翻译原始C#的语义所能获得的速度.这是一个很好的中间点,在编写基于结构的天真的东西(Vector2s无处不在!)和完全疯狂的手工命名返回值优化,正如我在过去所描述的那样,它非常容易出错.
好的,现在有一些缺点.不要将此列表详尽无遗:
希望这些信息有用!谢谢你的关注.
小智 12
脚本#sros:
脚本#cons:
SharpKit专业人士:
SharpKit缺点:
JSIL专业人士:
JSIL缺点:
反馈的答案:
Kevin:JSIL输出并不错,它只是为了实现完整的.NET行为而生成,就像SharpKit的CLR模式一样.另一方面,SharpKit支持本机代码生成,其中任何本机JavaScript代码都可以从C#生成,就像它手工编写的一样.
SharpKit的简洁生成JavaScript代码示例:http://sharpkit.net/Wiki/Using_SharpKit.wiki
开发人员可以选择创建更复杂的代码生成并获得更多功能,例如支持编译时方法重载.指定时,SharpKit为重载方法生成方法后缀.
脚本#需要.NET 4才能运行,但它不支持完整的C#4.0语法,如Generics,ref和out参数,名称空间别名等...
另一种选择是WootzJs.完全披露,我是它的作者.
WootzJs是开源的,并致力于成为一个相当轻量级的交叉编译器,允许所有主要的C#语言功能.
支持的显着语言功能:
yield 语句(作为有效的状态机生成)async/await 方法(生成为像C#编译器一样的状态机)ref和out参数this)T将抛出强制转换异常)它是使用Roslyn实现的,这意味着它将首先利用未来的语言改进,因为这些将通过Roslyn本身实现.它提供了一个自定义版本,mscorlib因此您可以确切地知道脚本中实际可用的库功能.
它的缺点是什么?
System.String都添加到本机Javascript String类型.与其他交叉编译器的比较:
脚本#非常稳定,并且与第三方Javascript库进行了广泛的集成.此外,它具有出色的Visual Studio集成,并提供自定义实现mscorlib.这意味着您确切地知道在工具级别实际实现了哪些功能.例如,如果Console.Write()未实现,则该编辑器中将无法使用该方法.
但是,由于它的自定义解析器,它仍然停留在C#2.0中(甚至没有在该版本的C#中找到的泛型).这意味着现代C#开发人员放弃了我们大多数人毫无保留地依赖的大量语言功能 - 特别是除了lambda和LINQ之外的上述泛型.这使得Script#对许多开发人员来说基本上都不是首发.
JSIL是一个非常令人印象深刻的工作,它将IL交叉编译为Javascript.它非常强大,可以轻松处理大型3D视频游戏的交叉编译.缺点是,由于其完整性,生成的Javascript文件是巨大的.如果你只是想要mscorlib.dll和System.dll,它的下载速度约为50MB.此外,该项目实际上并非设计用于Web应用程序的上下文,并且开始所需的工作量有点令人生畏.
此工具包也实现了自定义mscorlib,再次允许您了解可用的功能.但是,它与Visual Studio集成较差,迫使您创建调用编译器并将输出复制到所需位置所需的所有自定义构建步骤.
SharpKit:这个商业产品致力于为大多数C#4.0语言功能提供支持.它通常会成功,这个产品很有可能满足您的需求.它是轻量级的(小.JS文件),支持现代C#语言功能(泛型,LINQ等)并且通常是可靠的.它还为第三方Javascript图书馆提供了大量绑定.但是,有一些令人惊讶的边缘情况,您将不可避免地遇到这些边缘情况.
例如,该类型的系统是浅,并且不支持较泛型或阵列(即typeof(Foo[]) == typeof(Bar[]),typeof(List<string>) == typeof(List<int>)).对反射的支持是有限的,各种成员类型不能支持属性.表达式树支持不存在,并且yield实现效率低(没有状态机).此外,自定义mscorlib不可用,脚本C#文件和普通C#文件混合在您的项目中,迫使您使用[JsType]属性装饰每个脚本文件,以区别于正常编译的类.
我们有两年SharpKit,我必须说我们编写代码的方式已经升级.我看到他们的专业人士:
缺点:
| 归档时间: |
|
| 查看次数: |
7318 次 |
| 最近记录: |