2012年5月1日 星期二

GWT Elemental library

原文來自於 +Ray Cromwell 以及後續某些 comment。

特別感謝 +YC Ling 指正 bleeding edge 用法。

Ray Cromwell:
為甚麼 GWT 的 SuperDevMode 還沒有 commite 到 trunk?幾個星期前,我提到一個 Google 內部、給 GWT 用的 library,簡稱「clevername」。由於種種原因,目前 SuperDevMode 跟 Google 內部的東西產生了一些相依性,其中一個就是「clevername」。

過去兩週,我跟 +Alan Leung 做了一些努力,讓「clevername」更接近 release 階段,SuperDevMode 也就更接近 trunk 了。

所以,這是什麼神秘的 library?我們內部把這個 library 叫做「Elemental」,對外我們還是保留這個名字。它最初是由 +Joel Webber+Kelly Norton 所設計,一個新的、徹底乾淨、lightweight、「to the metal」、只針對 HTML5 的 library。這個 library 已經對應到幾乎所有的 HTML5 標準,因為他從規格的 IDL(譯註:應該是 Interface Description Language)自動產生。用 Elemental 寫程式,就像用 JS 一樣,如果你知道 JS 裡頭有什麼 API,Elemental 也會有。

此外,還有幾個設計上的特點:
  1. 將 interface 與實作拆開。許多 API(像 HtmlFormElement)在 interface 後頭有實際的 JSO class。如此一來舊可以向 server 端一樣建立 mock 實作來測試(如果有人夠有愛去作類似 htmlunit 的 Elemental 版 interface)。
  2. 一組新的 Collection class,與 JRE Collection 彼此不相容,而是與 JS 的 Map、Array 相容。這組 class 是 primitive(ArrayOfInt、ArrayOfBoolean)的 subtype。
  3. 設計成沒有 overhead(沒有 boxing、wrapping)、新的 JSON library。
  4. 第二、三點的實作沒有 JS 碼,所以 Collection 與 JSON 的 package 可以在 server 端也運作良好。
要說 Elemental 的最主要目標,是在 compile 的過程中盡可能地 transparent、melt away(譯註:融化),leaving code as efficient as you'd write by hand(譯註:翻譯不能 Orz)。如果你想要更上層的 library,就在 Elemental 上建立吧。

Elemental pushes bleeding edge compiler stuff(譯註:大意是 Elemental 用了一些新且有風險的 compiler 功能)。它在某些地方為了效率而用了一些巫術,因此過去幾周我修正了一些 compiler 的錯誤,像是 JSO implement 泛型的 interface 沒辦法運作正常。Alan 則是在我們推出 Elemental 之前,用最最最~新的 HTML5 規格更新了自動產生的 IDL API。在 Elemental 完成後,SuperDevMode 也會很快跟上。

Ray Cromwell:
Collection class 應該可以使用,但我改變原本不打算支援 IE8 的想法。問題是這樣的:

許多人寫的 GWT JS Map coolection class 會用 prefix key 然後使用 hasOwnProperty,因為 Object.prototype 有 field 在上頭的話,你不會想蓋過去。也就是說,你不能只是寫 Map.put("defineGetter", "blah") 來代表 this[key]=value,因為這可能會蓋在 Object.prototype 上。所以 collection 最後會這樣作:this[':'+key]=value

但是如果你的 browser 支援 EcmaScript 5,你可以這樣寫:var map=Object.create(null) 而不用擔心暴露 Object.prototype 的 property。

IE8 不支援 ES5,尤其是 Object.create()。我可以把它裝到 optimal 的版本,然後當人們需要的時候切換到 IE8 的版本。

從這個例子,你們可以看到我們在最佳化方面的嘗試,即使很多 library 已經擺脫 map key prefix 或是用其他替代方案。

Ray Cromwell:(譯註:回答 +Ray Ryan 是否可以在 UiBinder 上用的問題)
+Ray Ryan 不行,但是發表後我可能會回頭把我的 patch 挖出來,讓 UiBinder 可以偵測 ui:field 是不是一個 com.google.gwt.com.Element 或是 elemental.dom.Elemental,然後加上對應的程式碼。這在 Elemental 還不是 GWT 的一部分之前,很難做到。

(譯註:其實下面還有 +Joel Webber 提到 corss-browser 的議題,不過我已經沒力氣了...... Orz)

沒有留言:

張貼留言