Inline JSONPã®é·æã«ã¤ã㦠(ç¶: ãµã¼ããµã¤ãããã¯ã©ã¤ã¢ã³ããµã¤ãã®JavaScriptãå¼ã³åºãéã®ãã¹ããã©ã¯ãã£ã¹)
サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス - kazuhoのメモ置き場 ã®ä»¶ãid:tokuhirom ãããã£ã¨ HTML::CallJS ã¨ããã¢ã¸ã¥ã¼ã«ãæ¸ãã¦å ¬éãã¦ããã (Shipped HTML::CallJS - tokuhirom's blog åç §) ã®ã§ãã©ããã Inline JSONP ã使ãã¨ã©ãããå½¢ã§æ¸ããããã±ã£ã¨ä¾ãããããã¨æãã¾ãã
ã¾ãããµã¼ããµã¤ãã®ããã°ã©ã ã
以ä¸ã¯ perl ã§ãtokuhirom ã® HTML::CallJS 㨠Text::MicroTemplate ã使ã£ã¦ããä¾ã
JavaScript ã®å¼åºãä¿åããé åãç¨æããããã«å¼åºãã©ãã©ã追å ãã¦ãã£ã¦ãã¾ããä¸å®æ¡ä»¶ä¸ã§ã®ã¿ç¹å®ã®ã¯ã©ã¤ã¢ã³ããµã¤ãå¦çãå¼ã³åºããããé åã®åè¦ç´ ã«ã¤ãã¦å¼ã³åºããããããã¨ãç°¡åã«ã§ãã¾ãã
# Inline JSONPã§å¼ã³åºãã³ã¼ããå ¥ããããã®ãªã¹ã my @inlineJsonP; push @inlineJsonP, call_js("foo", { a => 1}); # ã¾ã foo ãå¼ã¶ if (...) { push @inlineJsonP, call_js("bar", { ... }); # ä¸å®æ¡ä»¶ãæç«ãããbarãå®è¡ } for my $e (@list) { push @inlineJsonP, call_js("baz", $e); # é åã®åè¦ç´ ãå¼æ°ã¨ãã¦bazãå®è¡ } # ã¬ã³ããªã³ã°ã¨ã³ã¸ã³ãå®è¡ my $html = $renderer->({ ... # other args to template engine inlineJsonP => [ map { encoded_string($_) } @inlineJsonP ], })
次ã«ãã³ãã¬ã¼ãã®ã³ã¼ãã
HEADè¦ç´ ã®çµäºé¨ã« Inline JSONP ã® SCRIPT è¦ç´ ãå±éããã³ã¼ããå ¥ããå½¢ãããã§ããããText::MicroTemplate ã®å ´åã¯ã以ä¸ã®ãããªæãã«ãªããã¨æãã¾ããHEADå ã§ããã®ã§ããµã¼ãã¹å ¨ä½ã§å ±éã®ãããç¨ãã³ãã¬ã¼ãã«ä»è¾¼ãå½¢ã«ãªãã¾ãã
<html> <head> ... ? for my $e (@{$_[0]->{inlineJsonP}}) { <?= $e ?> ? } </head> <body> ...
æå¾ã«JavaScriptã®ã³ã¼ãã
ã¨ã³ããªãã¤ã³ããå®ç¾©ããã ãã§ãã
function foo(arg) { ... } function bar(arg) { ... } function baz(arg) { ... }
ã§ã¯ããã®ææ³ã®ã¡ãªããã DOM ãã¼ã¹ã§ã®æ å ±åã渡ãã«æ¯ã¹ã¦ä½ã便å©ãªã®ããããããã¦ç¢ºèªãã¦ã¿ã¾ãããã
- å¼ã³åºãå¿ è¦ã®ããã¯ã©ã¤ã¢ã³ããµã¤ãã®ã³ã¼ããå¢ããããå¼æ°ãå¤ãã£ãããã¦ããã³ãã¬ã¼ããå¤æ´ããå¿ è¦ããªã
- ã¯ã©ã¤ã¢ã³ããµã¤ãã®ã³ã¼ããå¼åºãã¿ã¤ãã³ã°ãæ¡ä»¶ããµã¼ããµã¤ãã§å¶å¾¡ã§ãã
- ã¯ã©ã¤ã¢ã³ããµã¤ãã®å¦çãé¢æ°ã¨ãã¦æ½è±¡åããã¦ããã®ã§ãã¹ããããã
- HTMLå ã«äººéãèªãã§æå³ä¸æãªæ å ±ãæ··å ¥ããªã
å¥ã®è¨ãæ¹ãããã¨ãDOMãã¼ã¹ã§ã®æ å ±åã渡ãã¯ãã°ãã¼ãã«å¤æ°ã使ã£ã¦ããã®ã¨åããªã®ã§ã*1ãé¢æ°å¼åºã使ã£ãæ¹ãã«ãã»ã«åã§ãã¦è¦éãããããªãã®ã¯å½ç¶ã§ã¯ãªãã§ããããã
PS. ãInline JSONPãã¨ããåå㯠はてなブックマーク - rryuのブックマーク / 2013年11月6日 ããããã ãã¾ãããrryu++
*1:ã¨ãããããRPCãå®è¡ããéã«ãã¡ã¤ã«ã«å¼åºãæ å ±ãæ¸ãã¦ãããããªãã®ãã¨ããã®ãæ£ãã