ãã®æçš¿ã¯ãGWTã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã®æé©åãšæ¹åã«é¢ããäžé£ã®èšäºã®å§ãŸãã§ãã ç§ã¯ããããã®è³æãèç©ããŠããã®ã§ã2ã3ã®éšåã«åããããšã«ããŸããã
æåã®èšäºã§ç§ãã¡ãåŸ ã£ãŠãããã®ã説æããŸãã
察åŠãã¹ã質å
GWTã¢ããªã±ãŒã·ã§ã³ã®æé©åã«é¢ããäžé£ã®èšäºã®æåã®éšåã§ã¯ã次ã®ããšã«ã€ããŠèª¬æããŸãã
- ã¯ã©ã€ã¢ã³ãã³ãŒãåé¢ããªã³ããã³ãããŠã³ããŒã
- ã¯ã©ã€ã¢ã³ãã§ã®éãã¯ã©ã¹ã®äœ¿çšãåãé€ã
- ãªãœãŒã¹ãã£ãã·ã³ã°
- RESTã䜿çšããGWT RPCããã©ãŒãã³ã¹ã®åé¡
- ã¬ã€ã¢ãŠããã¢ããªã±ãŒã·ã§ã³ã«äžãã圱é¿ã®ç¹åŸŽ
- äŒéã®æé©å
- ã¹ã±ãžã¥ãŒã©ã䜿çšãã
- ãã£ã¹ãããã£ãŒã䜿çšããŠãµãŒããŒèŠæ±ãéçŽãã
ãããŠä»ãèšåãããåç¹ã«ã€ããŠè©³çŽ°ã«èª¬æããŸãã
ã¯ã©ã€ã¢ã³ãã³ãŒãåé¢ããªã³ããã³ãããŠã³ããŒã
GWTã«ã¯ãéçºè ãã¢ããªã±ãŒã·ã§ã³ãããŒãã«ãã«ãããã§ããçµã¿èŸŒã¿ã¡ã«ããºã ããããŸãã ããã¯ãŸãã次ã®ç®çã®ããã«å¿ èŠã§ãã
- ããŠã³ããŒãããããŒã¿ã®åæãµã€ãºãæžãã
- é 延ããŒãã®ååã䜿çš-å¿ èŠãªããŒã¿ã¯å¿ èŠã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠããŠã³ããŒããããŸã
ã¯ã©ã€ã¢ã³ãã³ãŒããéšåã«åå²ããã«ã¯ãGWT.runAsyncã¡ãœããã®åŒã³åºãã䜿çšããŸãã
RunAsyncã®äŸïŒ
GWT.runAsync(new RunAsyncCallback() { public void onSuccess() { new MySettingsDialog().show(); } public void onFailure(Throwable ohNoes) { // indicate that something went wrong, // usually a connectivity or server problem } });
åæã«ãGWTã³ã³ãã€ã©ã¯ãã¯ã©ã€ã¢ã³ãã³ãŒããåå²ããã ãã§ãªããã³ãŒãã®ã³ãŒãã£ã³ã°æ¹æ³ãåæãã責任ãè² ããŸãã åé¢ãæ£ããããšãä¿èšŒãããŸãã ãã ããåé¢ãçºçããªãå ŽåããããŸãã ãã®çç±ã¯ãã³ãŒãå ã®çžäºåç §ã§ããå¯èœæ§ããããŸãã
Google I / Oã䜿çšããGWT Can What Whatãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ãrunAsyncã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒãããåãšåŸã§ã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ããŒãé床ãæ¯èŒã§ããŸãã
ãããã£ãŠãrunAsyncã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéãå€§å¹ ã«ççž®ãããã¯ã©ã€ã¢ã³ãã«éä¿¡ãããããŒã¿éãåæžãããŸãã
AsyncProxyã¯ã©ã¹ã«æ³šæãã䟡å€ããããŸãã ãããããç§ã¯åœŒã®èª¬æãèšäºã®ç¬¬2éšã§èª¬æããŸããã圌ã®ææžã«åŸã£ãŠåœŒã«ç²Ÿéããããšãã§ããŸã ã
ã¯ã©ã€ã¢ã³ãã§ã®éãã¯ã©ã¹ã®äœ¿çšãåãé€ã
Google Web Toolkitã°ã«ãŒãããŒãžã§ã¯ãã³ã³ãã€ã«ãããGWTã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºãåæžããæ¹æ³ã«é¢ããè°è«ãèŠã€ããããšãã§ããŸãã ç¹ã«ãã¯ã©ã€ã¢ã³ãåŽã§ãéããã¯ã©ã¹ã䜿çšããããšãæåŠããã¯ã©ã€ã¢ã³ãåŽã§å€§éã®ã³ãŒããå«ããå¿ èŠããããšããã¢ãããŒãã泚ç®ãããŠããŸãã
ãŸããã¯ã©ã€ã¢ã³ãã§Comparatorã䜿çšããäŸã瀺ããŸãã ããã䜿çšããã«ã¯ãã¯ã©ã€ã¢ã³ãé¢é£éšåã«ã10 Kbã®ã³ãŒãé¢é£ã¯ã©ã¹ãå«ããå¿ èŠããããŸãã
RequestFactoryã䜿çšãããšãã¯ã©ã€ã¢ã³ããããã«å¢å ãââãŸããäžèšã®èª¬æã§ã¯ãã¯ã©ã€ã¢ã³ãéšåã150 Kbå¢å ããŸããã
å€éšã¢ãžã¥ãŒã«ã䜿çšããå Žåã泚æãã䟡å€ããããŸã-ãããžã§ã¯ãã«ããããå«ãããšãä»ã®å€ãã®ã¯ã©ã¹ãè¿œå ããããããã¯ã©ã€ã¢ã³ãéšåãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸãã
ãªãœãŒã¹ãã£ãã·ã³ã°
ã¯ã©ã€ã¢ã³ãåŽã®HTTPãªã¯ãšã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãåŽã®éèŠãªããã©ãŒãã³ã¹å¶éã§ãã ã¢ããªã±ãŒã·ã§ã³ãåãªãœãŒã¹ãåå¥ã«èŠæ±ããå Žåããã¹ãŠã®ãªãœãŒã¹ãããŠã³ããŒãããããã®æéã¯é«ããªããŸãã
ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®é床äœäžãé²ãããã«ããªãœãŒã¹ãã£ãã·ã³ã°ã«é¢é£ããã¢ãããŒãã䜿çšãããŸãã
GWTã«ã¯ClientBundleãšããã¡ã«ããºã ããããŸãã ClientBundleã¯ãããŸããŸãªã¿ã€ãã®ãªãœãŒã¹ïŒããã¹ããã°ã©ãã£ãã¯ãCSSãªã©ïŒããã£ãã·ã¥ããŸãã ClientBundleã«ã€ããŠã¯ãã¡ããã芧ãã ãã ã
ClientBundleã¢ãããŒãã®å©ç¹ïŒ
- å¿ èŠãªãªãœãŒã¹ã¯ã䜿çšããããã³ã«ããŒãããã®ã§ã¯ãªããäžåºŠããŒããããŸã
- ä¿ç®¡ããããªãœãŒã¹ã®åèšéã¯å°ãªããªããŸã
ClientBundleã§ãªãœãŒã¹ã¹ãã¬ãŒãžã®æå°åã¯ã©ã®ããã«æ©èœããŸããïŒ
GWTã§ã§ããããšãã¬ãŒã³ããŒã·ã§ã³ã«æ»ãã ãã®äžã«æ¬¡ã®å³ãèŠãããšãã§ããŸãïŒ
ãããã£ãŠãåãããŒã¿ãæ ŒçŽããããã®ãªãŒããŒããããåæžãããŸãã
çµæãšããŠã©ã®ããã«ãªãœãŒã¹ãåæžã§ããŸããïŒ
RESTã䜿çšããGWT RPCããã©ãŒãã³ã¹ã®åé¡
GWT RPCã¯æ¬åœã«äŸ¿å©ãªããŒã«ã§ãã IDEã®ãµããŒããåããŠããµãŒãã¹ã®ã¯ã©ã€ã¢ã³ãã³ãŒããšãµãŒããŒã³ãŒããæŽçããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããããšã¯ãGWTã§AJAXã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããçŽ æŽãããæ©èœã®1ã€ã§ãã ãã ããèªåã«åã£ãŠãããã©ãããæ€èšãã䟡å€ããããŸãã
GWT RPCã䜿çšããå Žåã®äž»ãªæ¬ ç¹ã¯ãèŠæ±ã«åé·ãªããŒã¿ãéå°ã«è¿œå ããããããã°ãè€éã«ãªãããšã§ãã
RESTã®äœ¿çšã¯ããããã®åé¡ã®è§£æ±ºçãšããŠæ³šç®ããããšãã§ããŸãã Zack Grossbartã«ããèšäºã§ ãGWTãããžã§ã¯ãã«RESTã䜿çšããäŸãèŠã€ããããšãã§ããŸãã
åæã«ã圌ã®èšäº 4 More GWT Anti-patternsã§ãRESTã®äž»ãªå©ç¹ã«æ³šç®ããŠããŸãã
- RESTã«ãããéçºè ã¯APIã«ã€ããŠèããããã«ãªããŸãã APIã¯å€éšãµãŒãã¹ãã¢ããªã±ãŒã·ã§ã³ã«ãæäŸã§ããããã察話ã®å©äŸ¿æ§ãšæ©èœãè¿œå ãããŸãã
- ãŠãŒã¶ããªãã£ãã¹ã
- ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®æ確ãªåé¢
ã¬ã€ã¢ãŠããã¢ããªã±ãŒã·ã§ã³ã«äžãã圱é¿ã®ç¹åŸŽ
å€ãã®å Žåãgwtéçºè ã¯èªå調æŽã¬ã€ã¢ãŠãã䜿çšããŸãã ãã®äŸã¯ãã³ã³ããŒãã³ãã§ã®height = "100ïŒ "ã®äœ¿çšã§ãã contentHeightãoffsetHeightã¯éãæäœã§ãããšèšã䟡å€ããããŸãã 以äžã¯ãGoogle I / O 2009ã®ãããªç§åäœã®æž¬å®ããã¬ãŒã³ããŒã·ã§ã³ããååŸããIEH offsetHeightã©ã³ã¿ã€ã çµ±èšã§ãã
æäœã®çµæãäžååã«äºæž¬ãããã ãã§ã¯ãããŸããã 18åã®æž¬å®ã®ããŒã¯å€ã¯ã85 msã®ãªãŒããŒã®å€ã«éããŸããã
ãµã€ãºå€æŽã€ãã³ãã®å®å šãªåŠçã«ã¯æéãããããŸãã å€ãã®å Žåã匷å¶ã¬ã€ã¢ãŠãã®å Žåã®ãµã€ãºå€æŽæäœã¯ãã¹ã¿ã€ã«ã®åèšç®ãããæ°åæéãããããŸãã
ã©ãããã°ãã®åé¡ãåãé€ãããšãã§ããŸããïŒ CSSã䜿çšããå¿ èŠããããŸãã CSSã§å®çŸ©ãããã¬ã€ã¢ãŠãã¯ãããé«éã«ã¬ã³ããªã³ã°ããããããã³ã³ããŒãã³ãã®DOMéå±€å šäœã«å¯ŸããŠoffsetHeightãªã©ã®éãã¡ãœãããåŒã³åºãå¿ èŠããªããªããŸãã
ãµã€ãºå€æŽãªãã·ã§ã³ã§javaScriptã䜿çšããªããæŽæ°ãããDockPanelã䜿çšã§ããŸãã
ãã¹ãããããŠã£ãžã§ããã®å€§ããªããªãŒãäœæããŠä¿åããããšã¯åŒ·ããå§ãããŸããã ãŠã£ãžã§ããã«ã¯è¿œå ã®ãªãŒããŒããããããã䜿çšãããã¡ã¢ãªãšã¯ã©ã€ã¢ã³ãã®ãµã€ãºã«æªåœ±é¿ãåãŒããŸãïŒçµæãšããŠãé床ïŒã HTMLPanelããœãªã¥ãŒã·ã§ã³ãšããŠäœ¿çšã§ããŸãã ããŒãžäžã®ãŠã£ãžã§ããã®æ°ã远跡ããããã«ãInspectorWidgetããŒã«ããããŸãã ãã©ã°ã€ã³ã®ããããã£ã«ã€ããŠã¯ããã®ããŒãžã§ç¢ºèªã§ããŸã ã
äŒéã®æé©å
ã·ãªã¢ã«åå¯èœãªãªããžã§ã¯ãã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§åžžã«éä¿¡ãããŸãã éçºè ã¯èªåããå¿ èŠããããŸã-æãå¿ èŠãªããŒã¿ã®ã¿ãå®éã«éä¿¡ãããŸããïŒ ãªããžã§ã¯ãã®å€§ããªã°ã©ãããã¹ãããããµããªããžã§ã¯ããããã³äžèŠãªãã©ã¡ãŒã¿ã®ã»ããã¯è²Žéãªæéãè²»ãããäœåãªè² è·ãäœæããŸãã ã¯ã©ã€ã¢ã³ãã§å¿ èŠãªãã®ã ããéä¿¡ããŸãã å€ãã®å ŽåããŠãŒã¶ãŒã«è¡šç€ºããããã®ã®ã¿ã å¿ èŠã«å¿ããŠãããŒã¿ã§å¿ èŠãªãã®ããã¹ãŠå ¥æã§ããŸãã ãã¡ããããã®ã¢ãããŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã§ãªãœãŒã¹ããã£ãã·ã¥ãããšããããªã·ãŒãšççŸããã¹ãã§ã¯ãããŸããã
ã¹ã±ãžã¥ãŒã©ã䜿çšãã
GWTã«ã¯ä¿çäžã®åŒã³åºãã¡ã«ããºã ããããŸãã 以åã¯DeferredCommandãšåŒã°ããŠããŸããããéæšå¥šãšå®£èšãããŸããã çŸåšããã®ã¡ã«ããºã ã¯ã¹ã±ãžã¥ãŒã©ãšåŒã°ããŠããŸãã
ã¹ã±ãžã¥ãŒã©ã¯ãå®éã«ã¢ã¯ã·ã§ã³ãéåæã«å®è¡ããããã®ã¯ã©ã¹ãæäŸããŸãã ãã©ãŠã¶ãŒã®ã€ãã³ãã«ãŒãã®çµäºåŸã«ã¢ã¯ã·ã§ã³ãå®è¡ãããããšãä¿èšŒãããŠããŸãã
å©ç¹ïŒ
- å®è¡ã®ã¹ã¬ããããããã¯ããŸãã
- æåã®UIã€ãã³ããå®äºã§ããŸãã
å€ãã®å Žåãã¹ã±ãžã¥ãŒã©ã¯äžéšã®ãªããžã§ã¯ãã®æ§ç¯ã®åŸåã§äœ¿çšãããŸãã ãã ããå Žåã«ãã£ãŠã¯ãUIã€ãã³ãã®åªå é äœãããé«ããªããããã¢ããªã±ãŒã·ã§ã³UIãé©åã«äœ¿çšãããšã¢ããªã±ãŒã·ã§ã³UIãé«éã«ãªããŸãã
ãã£ã¹ãããã£ãŒã䜿çšããŠãµãŒããŒèŠæ±ãéçŽãã
ãµãŒããŒãžã®ååŒã³åºãã¯ãå®è¡ã«äžå®ã®é 延ã課ããŸãã ãµãŒããŒã«å¯ŸããŠé »ç¹ã«è€æ°ã®åŒã³åºããè¡ãå¿ èŠãããå Žåã¯ãããããããã€ãã®ãããåäœã«éçŽã§ããŸãã
ããŒãžã§ã³2.3以éãGWTã«ã¯RequestFactoryã䜿çšããæ©èœããããŸãã
requestContext.method1().to(new Receiver<T>(){...}); requestContext.method2().to(new Receiver<T>(){...}); requestContext.fire(new Receiver<Void>(){...}); //called only 1
ãã®ã¢ãããŒãã®å©ç¹ã¯æããã§ã-åŒã³åºãã®æ°ãå€§å¹ ã«åæžããããã®çµæãå®è¡ã®é 延ãçºçããŸãã
ãµãŒããŒã®å¿çããã£ãã·ã¥ã§ããå Žåã¯ããã£ãã·ã¥ãããŒãžã£ãŒã䜿çšã§ããŸãã ãªã³ã¯ãã¯ãªãã¯ããŠããããã®äœ¿çšæ¹æ³ã確èªã§ããŸãã
çµè«ãšããŠ
GWTã¯ãåªããã¯ãã¹ãã©ãŠã¶ã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ãã匷åãªããŒã«ã§ãããGoogle以å€ã§æ¢ã«åºã䜿çšãããŠããŸãã ãã ãããã®æã䟿å©ãªããŒã«ã®ããã€ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«é倧ãªå¶éã課ããŠããŸãã ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã®æäœã«æºè¶³ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®é床ãæ éã«æé©åããå¿ èŠããããŸãã
次åã®èšäºã§ã¯ãããã©ãŒãã³ã¹ã®æ¹åãšGWTã¢ããªã±ãŒã·ã§ã³ã®æé©åã®æ©èœã«ã€ããŠåŒãç¶ã話ãåãäºå®ã§ãã ç¹ã«ãGWT RPCãJS Shrinkãã¯ã©ã€ã¢ã³ãã§ãã€ãã£ãã³ãŒãã䜿çšããæ©èœãã¹ã¯ãªããã®ãµã€ãºãçž®å°ããããã®ãã³ãã®é床ãæ¹åããæ¹æ³ãæ€èšããŸãã ãŸããã³ã³ãã€ã«é床ã®æé©åã«ã€ããŠè©±ããã€ã³ã¿ãŒãã§ã€ã¹ã®ã¬ã€ã¢ãŠãã«é¢ãããã³ããæäŸããäºå®ã§ãã
ãæž èŽããããšãããããŸããïŒ
æçšãªãªãœãŒã¹ïŒ
- static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en//events/io/2011/static/presofiles/drfibonacci_devtools_high_performance_gwt.pdf
- dl.google.com/io/2009/pres/W_1115_GWTCanDoWhat.pdf
- dl.google.com/io/2009/pres/W_1230_MeasureinMilliseconds-PerformanceTipsforGoogleWebToolkit.pdf
- turbomanage.wordpress.com/2010/07/12/caching-batching-dispatcher-for-gwt-dispatch
- www.zackgrossbart.com/hackito/antiptrn-gwt
- www.zackgrossbart.com/hackito/antiptrn-gwt2
- www.zackgrossbart.com/hackito/gwt-rest
- habrahabr.ru/blogs/gwt/99614