JavaScript開發資源大全
JavaScript 起源于 Netscape 公司的 LiveScript 語言,這是一種基于對象和事件驅動的客戶端腳本語言,最初的設計是為了檢驗 HTML 表單輸入的正確性。
早些年,JavaScript 由于其復雜的文檔對象模型(DOM)、糟糕的實現和調試工具、不一致的瀏覽器實現而不受開發者的待見。而隨著技術的發展, JavaScript 變得越來越的強大、完善,比如, Ajax 技術可以創建更加迷人的 Web 應用,Node.js 將 JavaScript 的應用范圍擴展到了服務器端,各種層出不窮的框架使得 JavaScript 的開發更加簡捷,尤其是近幾年 HTML5 的出現,將 JavaScript 提升到了前所未有的高度。
如今 JavaScript 已經變成了 Web 開發必備的語言,甚至開始逐步向移動領域滲透,由于 JavaScript 的跨平臺特性,使得它在移動互聯網時代有更大的作為。
凡是可以用 JavaScript 來寫的應用,最終都會用 JavaScript 來寫。——Atwood 定律(Jeff Atwood 在 2007 年提出)
不會 JavaScript 怎么辦?
如今 JavaScript 已經成為了 Web 開發的“標配”語言,不管你喜不喜歡,在 Web 開發中,必定要涉及到 JavaScript。JavaScript 可以實現真正的“一次編寫,到處運行”,并可以控制所有常用的瀏覽器,因此,JavaScript 還被稱作“Web 的虛擬機”以及“Web 上的匯編語言”。
盡管如此,但是如果你還沒開始學習 JavaScript,這也不影響你編寫 Web 應用。你完全可以用你喜歡的語言(Java、.NET、C/C++、Python、Ruby……)來編寫應用程序,然后將它們編譯為 JavaScript 語言,然后再運行于瀏覽器上。
如果你對 JavaScript 的語法不滿意,你也可以使用一些 JavaScript 的增強版語言。比如,如果你更喜歡經典的面向對象方式,并想要一些語法糖,那么你可以試試 CoffeeScript;如果你希望有一個更嚴格的類型系統,那么你可能會發現 Dart 或 TypeScript 更有趣一些;如果你更喜歡函數式編程,那么 ClojureScript 或 Roy 可以幫助你。
將你擅長的語言編譯為 JavaScript
將 Java 代碼編譯為 JavaScript
盡管 JavaScript 名字中包含“Java”,實際上 JavaScript 和 Java 沒有任何關系,只是由于當時 Java 火得一塌糊涂,為了借助 Java 的名氣來推廣,就起名為 JavaScript 了。
各種強大的工具的出現,使得 JavaScript 代碼和 Java 代碼之間有了一定的聯系,就是可以將 Java 代碼編譯為 JavaScript 代碼,以便在瀏覽器中運行。當然,除了 Java 外,其他基于 JVM 的語言都可以如此做。
可以實現此類操作的工具如下。
- BicaVM:一個使用 JavaScript 實現的 JVM,可以運行 60% 的 Java 字節碼
- Ceylon:一個可編譯為 JavaScript 的、模塊化的、靜態類型 JVM 語言[*]Doppio:一個使用 Coffeescript 實現的 JVM,使得 Java 程序可以運行在任何 JavaScript 引擎上[*]GrooScript:一個可以將 Groovy 代碼轉為 JavaScript 代碼的小框架
- j2js:可以將 Java 字節碼轉換為 JavaScript 代碼
- Java2Script:Eclipse 中的 Java to JavaScript 編譯插件,并實現了一個 JavaScript 版的 Eclipse SWT
- Kotlin:可以編譯為 JVM 字節碼和 JavaScript 的靜態類型編程語言
- Processing:一個基于 Java 的可視化語言,可以編譯為 JavaScript
- STJS:Strongly-Typed JavaScript(強類型的 JavaScript),一個可以將 Java 源碼轉換為 JavaScript 代碼的 Maven 插件 </ul>
- Emscripten:Mozilla 開發的 LLVM 后端,可以將任何通過 LLVM 前端(比如C/C++ Clang)生成的 LLVMIR 中間碼編譯成 JavaScript 代碼。
- mala:可以將 vala 代碼(vala 代碼在編譯時,首先會編譯為C代碼)編譯為 JavaScript
- Mandreel:可以將 C++ 和 Objective-C 代碼編譯為高度優化的 JavaScript 源碼
- Clue:一個C語言編譯器,可以將C語言代碼編譯為高質量的 Lua、Javascript 或 Perl 代碼。 </ul>
- Brython:用于替換網頁上的 JavaScript 代碼,允許使用 Python 來編寫腳本,并直接在網頁上執行
- PYXC-PJ:可以將 Python 轉換為 JavaScript,并會產生一個行/列號映射文件
- Pyjaco:可以將 Python 轉換為 JavaScript
- Pyjamas:Python to JS 轉換器
- Pyjs:Python to JS 轉換器
- PyCow:可以將 Python 代碼轉換為 MooToolsJS 代碼
- PyvaScript:一個類似于 Python 語法并擁有 JavaScript 特性的編程語言
- RapydScript:增強版的 PyvaScript
- Skulpt:客戶端的 Python </ul>
- 8ball:一個可以將 Ruby(或 Ruby 子集)的源碼轉換為 JavaScript 源碼的編譯器
- ColdRuby:一個 Ruby 1.9 MRI 字節碼編譯器和 JS 運行時,包括一個 C++ 運行時以及用于本地執行的 V8 引擎
- HotRuby:可以在瀏覽器內部或 Flash 平臺上運行由 YARV 編譯的 Ruby 操作碼
- Opal: 一個 Ruby to JavaScript 編譯器,可用于任何 JS 環境
- rb2js:一個 Ruby to JavaScript 編譯器
- Red:允許你以 Ruby 的方式編寫代碼,然后以 JavaScript 的方式運行代碼 </ul>
- Apps in Motion:允許使用 C# 來構建可以運行在任何設備上的 Web 應用程序
- Blade:一個 Visual Studio 擴展,可以將 C# 代碼轉換為 JavaScript
- FunScript:可通過 TypeScript 的類型提供器將F#代碼轉換為 JavaScript 或 JQuery 代碼
- jsc:可將 .NET 程序重新編譯為 JavaScript、ActionScript、PHP 或 Java 程序
- JSIL:可將 MSIL(.NET 字節碼)轉換為 JavaScript
- NemerleWeb:可將 Nemerle 語言(微軟的多范型語言)編譯為 JavaScript
- Pit:可將F#代碼編譯為 Javascript
- Prefix(開發中):可將 C# 代碼編譯為 Javascript
- Saltarelle:可將 C# 代碼編譯為 Javascript
- SharpKit(商業工具):可將 C# 代碼編譯為 Javascript
- Script#: 可將 C# 代碼編譯為 Javascript
- WebSharper:可將F#代碼編譯為 Javascript. </ul>
- Scala.js:一款將 Scala 編譯為 JavaScript 的編譯器,支持全部 Scala 語言特性,允許開發者用 Scala 開發從前端到后端的 Web 應用
- js-scala:在 Scala 中將 JavaScript 作為嵌入式的 DSL 語言
- Scala+GWT:通過 GWT 工具鏈將 Scala 代碼編譯為 JavaScript 語言 </ul>
- Go2js:可以將 Go 代碼行到行地編譯為 JavaScript 代碼
- Perlito:可以將 Perl 5/6 代碼編譯為 JavaScript、Ruby、SBCL 和 Go 語言代碼。 </ul>
- ADsafe:提供了客戶端靜態驗證功能和相關的 API,增強第三方腳本的安全性
- Caja:可以將傳統的 HTML 和 JavaScript 轉換為安全限制的 JavaScpit 格式
- Dojo Secure:用于構建安全混搭應用的框架
- FBJS:非死book 的 JavaScript 工具,用于編寫 非死book 小插件
- Jacaranda:支持對象的靜態驗證器
- Gatekeeper:一個 JavaScript 密碼保護腳本
- Microsoft Web Sandbox:通過隔離來保證安全性 </ul>
- JSX:一個更快、更安全、更易用的 JavaScript 替代品
- Elm:類型安全的函數式語言,可編譯為 HTML、CSS 和 JavaScript.
- Lambdascript:一個強類型的純函數式原型語言
- MileScript:一個類似于 C# 和 Java 的強類型語言,可編譯為 JS
- SafeJS:為 JavaScript 增加了語法糖
- Mascara:為 JavaScript 增加了強大的功能,比如類、命名空間和類型檢查等
- Roy:函數式語言,與 JavaScript 語義保持接近,擁有類型推斷、結構類型、sum 類型、模式匹配等 </ul>
- CoffeeScript: CoffeeScript 是一個使用純 Ruby 編寫的編程語言,只使用了 JavaScript 的“精髓”,拋棄了原來 JavaScript 晦澀、容易出問題的部分,如全局變量聲明、with 等。并提供了很多語法糖,讓代碼更優雅可讀。
- Dart:Google 推出的一種基于類的可選類型化編程語言,可以在原生虛擬機中直接運行,也可以用編譯器將 Dart 代碼翻譯成 JavaScript 代碼。
- TypeScript:JavaScript 的一個超集,添加了可選的靜態類型和基于類的面向對象編程。
- ClojureScript:由 Clojure 的創建者 Rich Hickey 推出,目標是“做 Javascript 所能做到的事情”,代碼可編譯為 Javascript。
- IcedCoffeeScript: Coffeescript 語言的擴展集,添加了 2 個關鍵字 await 和 defer,為瀏覽器和服務器兩者提供了強大的異步控制功能。
- LiveScript: Coco 的一個分支,是 CoffeeScript 的間接子集,并在面向對象和命令式編程方面進行了諸多改進,代碼可以編譯成 JavaScript。
- Kaffeine:JavaScript 語法的擴展,與 JavaScript 非常類似,代碼可以直接編譯成 JavaScript。 </ul>
將C/C++代碼編譯為 JavaScript
C/C++如今也可以用來編寫 Web 應用程序,同樣可以將它們編譯為 JavaScript。一些工具如下。
由于 Emscripten 可以將 LLVM 二進制代碼編譯成 JavaScript,LLVM 是一種很流行的中間編譯格式,幾乎所有語言都有 LLVM 編譯器,因此 Emscripten 也可以作為大部分語言轉換為 JavaScript 的通用工具。
將 Python 代碼編譯為 JavaScript
可以使用如下工具將 Python 代碼編譯為 JavaScript 代碼。
將 Ruby 代碼編譯為 JavaScript
在 Ruby 領域,有一個使用 JavaScript 實現的 Ruby 標準庫—— RubyJS,它實現了 Ruby 中的所有方法,如 Array、Numbers、Time 等。Ruby 之父松本行弘稱“如果我必須編寫 JavaScript 代碼,我會使用 RubyJS”。
另外,你也可以使用如下工具將 Ruby 代碼編譯為 JavaScript 代碼。
將 .NET 代碼編譯為 JavaScript
你可以使用如下工具將C#、F#以及其他 .NET 代碼編譯為 JavaScript 代碼。
將 Scala 代碼編譯為 JavaScript
你可以使用如下工具將 Scala 代碼編譯為 JavaScript 代碼。
將 Flash 轉換為 JavaScript
HTML5(HTML/JavaScript/CSS3 技術組合)的最大對手就是 Flash,盡管目前 Flash 的市場份額還高居 70%,但也不可否認,未來將是 HTML5 的天下。
就連 Flash 的開發商 Adobe 也開始擁抱 HTML5,并發布了 Toolkit for CreateJS 工具,方便 Web 開發者將 Flash 轉換為 HTML5 格式。
去年,Google 曾發布了一套基于網頁的的工具——Swiffy,在線即可將 SWF 格式的 Flash 文件轉化為 HTML5 格式。
除了轉換外,Mozilla 還推出了一個新的解決方案——Shumway,這是一個“基于 JavaScript 的 Flash 虛擬機和運行時”,目的是在瀏覽器中構建一個可靠有效的 SWF(Flash 文件格式)渲染器,無需插件直接在瀏覽器中運行 Flash。
由此可見,這些工具將進一步加速 HTML5 取代 Flash 的步伐。
其他編譯工具
編譯為 JavaScript 后的問題
調試問題
由于是交叉編譯,導致輸出的代碼很難被跟蹤調試。
一些工具在編譯的過程中會生成映射文件(將編譯后的 JavaScript 代碼映射到源語言),可以通過這些文件來進行調試。
性能問題
由于 JavaScript 在瀏覽器中運行問題,本地代碼編譯為 JavaScript 后的執行速度可能會下降。
對于此類問題,Mozilla 給出了一個解決方案—— asm.js(見《 asm.js:JavaScript 的“匯編語言”》)。asm.js 是一個 JavaScript 的一個嚴格的子集,提供了一個類似于C/C++虛擬機的抽象實現,包括一個可有效負載和存儲的大型二進制堆、整型和浮點運算、高階函數定義、函數指針等,可以被用來作為一個底層的、高效的編譯器目標語言。
此外,還可以使用 Mozilla 開發的 JavaScript 引擎 OdinMonkey 來獲得更快的執行速度。開發者可以將編寫的代碼編譯為 JavaScript,然后手動編寫為 asm.js 代碼,當瀏覽器執行該程序時,OdinMonkey 引擎會讓程序的執行速度更接近于本地應用。Mozilla 未來可能會開發一些工具(類似于 LLJS)來自動生成 asm.js 代碼。
隨著技術的發展,未來 JavaScript 也許會跑得和 native C 一樣快。
一些演示
2012 年,Mozilla 曾推出一款 Web 版的第一人稱射擊游戲演示 BananaBread,今年 5 月份,Mozilla 宣布與 Epic Games 合作將虛幻引擎3(C/C++實現)移植到瀏覽器上,并發布了基于虛幻引擎 3 的 HTML5 演示游戲 Epic Citadel,這些游戲都是基于 WebGL、 Emscripten 和高性能的 JavaScript 子集 asm.js 實現,重新定義了 3D 游戲在瀏覽器中運行的性能,展示了高端游戲也可以很容易地移植到 JavaScript 和 WebGL 平臺,同時不失性能和畫面效果。
Mozilla 的另一款支持多人在線的 HTML5 游戲—— BrowserQuest。
隨著 HTML5 新特性 Full Screen API、Gamepad API 和 Mouse Lock API 的完善,瀏覽器或將成為未來游戲的新戰場。
增強版的 JavaScript
JavaScript 大量的擴展,在很大程度上彌補了 JavaScript 某些方面特性的不足。比如你可以使用如下這些工具或擴展來讓 JavaScript 更強大。
安全性增強
靜態類型特性
JavaScript 的衍生品
JavaScript 如今在 Web 開發界的地位無法撼動,但是仍不斷有一些新的語言出現,希望能夠通過提供更強大、更完善、更優雅的特性來代替 JavaScript。
更多工具可參見: http://altjs.org/
最后
幾乎所有主流的語言都可以編譯為 JavaScript,進而能夠在所有平臺上的瀏覽器中執行,這也體現了 JavaScript 的強大性和在 Web 開發中的重要性。此外,互聯網中還存在大量的工具,使得這些語言可以與 JavaScript 進行互操作,我們將在以后的文章中詳細介紹。
以上這些工具中,大部分都是開源項目,如果感興趣,你也可以通過源碼來了解這些語言之間進行轉換的相關原理和技術。