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)

1 則留言:

  1. Oftentimes, the slot is a well-liked game and well-known among casino gamers. It will also be fairly risky to provide the participant a chance of hitting a bonus function. Resorts Casino options an incredible loyalty program with plenty of advantages for its gamers. Among slots and jackpots, gamblers can discover big number of slingo and stay supplier games. The necessities for reload bonuses are often much like these for https://casino.edu.kg/%EC%A0%95%EC%B9%B4%EC%A7%80%EB%85%B8.html join bonuses.

    回覆刪除