[英]JSIL vs Script# vs SharpKit
我正在將Script#,JSIL和SharpKit看作是用於將C#編譯為Javascript的工具,因此我可以在Visual Studio中使用C#編寫AJAX的客戶端功能。
每個JSIL,Script#和SharpKit的優點和缺點是什么?
我的項目是一個使用剃刀引擎和C#的MVC4項目,如果重要的話。
如果你想直接與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無處不在!)和完全瘋狂的手工命名返回值優化 , 正如我在過去所描述的那樣,它非常容易出錯 。
好的,現在有一些缺點。 不要將此列表詳盡無遺:
希望這些信息有用! 謝謝你的關注。
腳本#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,我必須說我們編寫代碼的方式已經升級。 我看到他們的專業人士:
缺點:
很高興,如果這可以幫助!
對於ScriptSharp,此stackoverflow鏈接可能會有所幫助。
ScriptSharp為我的工具包帶來了哪些優勢?
如果你有任何SVN工具,請從https://github.com/kevingadd/JSIL下載一個樣本,這是一個有效的源代碼,可以幫助你走幾英里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.