自從加入 Errai 團隊後,我對人們說了很多關於這個 project 的事。每次在述說的時候,我發現我是在驅除人們對 GWT 的常見誤解、以及講解 GWT 可以怎麼使用。我也發現人們對於 GWT 的程式碼可以輕易地存取 browser 的原生環境感到驚訝,雖然 GWT 在跨 browser 之間的實作細節處理的很好,但 GWT 並不是建立一道高牆把你跟底層環境隔絕開來。
所以,GWT 是啥?
GWT(Google Web Toolkit)是一個包含許多獨立部份的 project。下面列出其中一部分:
- 一個將 Java 編譯成 JavaScript 的 compiler。
- 一個 library 提供:
- JavaSE 5 標準 library 的一個子集(尤其是 java.lang 與 java.util)
- 可程式化的 UI Framework(像 Swing 那樣)
- 原生 browser 功能——例如 JSON、XML 的操作、XMLHttpRequest(AJAX 跟 Comet)、以及 Canvas、Local storage、Audio、Video 這些 HTML5 的功能——的 Java wrapper。
- RPC 機制,前提是你的 application 後端是用 Java 寫的才能用。(GWT RPC 沒辦法輕易改裝既有的 object model,不過你可以把他用來建立 server-side 的 RPC 層)
- GWT Designer,一個視覺化 layout 工具,可產生類似 Swing 的 UI framework 程式碼。
- UiBinder,一套定義 UI 的系統。(定義 layout 的檔案實質上是一個 XHTML,裡頭設定了 GWT 的 widget,有命名的 element 會自動對應到 Java class 中的 field)
- 給 Eclipse、Maven、Ant 的 plugin,以協助建立、測試 GWT 的 application、並除錯。
那,GWT 不是什麼?
我們已經用清單的方式將 GWT 是什麼給凸顯出來,現在的重點是界定它不是什麼:
- GWT 並沒有限定 UI 的建立方式。尤其是用「browser 上的 Swing」思維來建立 UI,這完全不必要——除非你本來就想這麼作。
- GWT 不像 JSF 是 server-centric 的系統,GWT application 會編譯成一堆 HTML、CSS、圖檔、JavaScript 的靜態檔案。application 在 browser 上頭運作,只有在需要的時候與 server 作資料傳輸。如果你沒有用 GWT RPC,你的 application 就不用放在 Java web server 上。
- GWT 不需要任何 browser plugin(譯註:這裡是相對於 Flash 等技術實際使用時需要安裝 plugin。雖然說開發 GWT 基本上也是可以不裝 browser plugin...... XD)。編譯完的 application 就是一個或多個標準的 web 頁面。
- GWT 並不阻止你直接寫 JavaScript。你可以用 JSNI的方式在 Java class 中寫 inline JavaScript、你可以把 Java API 轉成 JavaScript、你也可以在 Java 當中呼叫 JavaScript API。
- GWT 並沒有停止開發(譯註: 我也寫了〈GWT and Dart〉的中文翻譯)。這個謠言實在太誇張了。
如果 GWT application 只是簡化 JavaScript 跟 HTML,幹麼這麼麻煩咧?
感謝你問了這麼一個好問題。有許多令人信服的理由,讓我在原始 HTML 與 JavaScript 上使用 GWT。我會在未來的文章當中指出我特別喜歡的原因,此外,我也希望你能思索一下這個問題:「如果 GWT 把這些都處理好了,為甚麼 Errai 也要來插一腳呢?」
譯註:errai 是由 JBoss 所維護的 GWT framework。這篇的原文是張貼在 errai 的官方開發 blog 上,內容以及基本論調與當初自己寫的〈GWT:這是什麼?幹什麼的?〉相似。不過人家是搞 JavaEE 的 JBoss、我只是個小痞子,所以還是翻譯一下,提供對照比較的機會。
沒有留言:
張貼留言