AngularJSã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã«server-side prerenderingã¨ã„ã†ã®ãŒã‚ã‚‹ã®ã§ã™ãŒã€å½“分ã§ããã†ã«ãªã„ã®ã§è‡ªåˆ†ã§ä½œã£ã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚
https://github.com/dai-shi/connect-prerenderer
express.jsã®middlewareã§ä½¿ã†ã“ã¨ã‚’想定ã—ã¦ã„ã¾ã™ãŒã€express.jsã«ã¯ä¾å˜ã—ãªã„よã†ã«ã—ãŸã®ã§ã€connect-prerendererã§ã™ã€‚expressã¨connectã®é•ã„ã¯ã€ä»–ã®ãƒ–ãƒã‚°ãªã©ã§ã‚‚説明ã•れã¦ã„ã‚‹ã“ã¨ã§ã—ょã†ã€‚
何をやã£ã¦ã„ã‚‹ã‹ã‚’一言ã§è¨€ã†ã¨ã€ã‚µãƒ¼ãƒå´ã§jsdomを使ã£ã¦JavaScriptを走らã›ã¦ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°å¾Œã®HTMLページをクライアントã«è¿”ã™ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚
基本的ãªã¨ã“ã‚ã¯ã—ã°ã‚‰ãå‰ã«ã§ãã¦ã„ã¦ã€ç°¡å˜ãªãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã¯å‹•ã„ã¦ã„ãŸã®ã§ã™ãŒã€AngularJSã‚’å‹•ã‹ã™ã®ãŒãªã‹ãªã‹å¤§å¤‰ã§ã—ãŸã€‚çµå±€ã€angular.jsã®ã‚½ãƒ¼ã‚¹ã«æ‰‹ã‚’入れるã“ã¨ã«ãªã‚Šã¾ã—ãŸã€‚
AngularJSを使ã£ãŸç°¡å˜ãªãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã‚‚å‹•ã„ã¦ã€æº€è¶³ã§ã™ã€‚
ã‚‚ã£ã¦ãã¦ã™ã使ãˆã‚‹ã‚ˆã†ãªãƒ©ã‚¤ãƒ–ラリã§ã¯ãªã„ã§ã™ãŒã€ãŸã¶ã‚“世界åˆã®å–り組ã¿ã§ã—ょã†ã€‚
ã‚ã¨ã¯ã¯AngulaJSå´ã§ã‚‚ã£ã¨ã†ã¾ãå–り込んã§ã‚‚らã‚ãªã„ã¨ã¤ã‚‰ã„ã¨ã“ã‚ã§ã™ã€‚ä»Šã¯æ±ºã‚ã†ã¡ï¼ˆng-repeat="..."ã¯OKã ãŒã€class="ng-repeat:..."ã¯å‹•ã‹ãªã„ã¨ã‹ï¼‰ã§ã‚„ã£ã¦ã„る部分ãŒã‚ã‚‹ãŸã‚。
ã‚ã¾ã‚Šèª¬æ˜Žã§ããšã«æ„味䏿˜Žã‹ã¨æ€ã„ã¾ã™ãŒã€ã“れã«ã¦ã€‚
JavaScriptã®ãŠè©±ã§ã™ã€‚node.jsã«é™ã‚‰ãªã„話ã ã¨æ€ã„ã¾ã™ãŒã€node.jsã§ã®å‹•作を説明ã—ã¾ã™ã€‚
一言ã§è¨€ã†ã¨ã€"g"オプションをã¤ã‘ãŸRegExpã®test()
ã®å‘¼ã³å‡ºã—ã¯ãƒ«ãƒ¼ãƒ—(?)ã—ã¾ã™ã€‚
説明ã™ã‚‹ã‚ˆã‚Šã‚‚ã€å®Ÿéš›ã®å‹•ãを見ã¦ã¿ã¾ã—ょã†ã€‚
% node
> re = new RegExp('xyz', 'g');
/xyz/g
> s = 'aaaxyzbbbxyz';
'aaaxyzbbbxyz'
> re.test(s)
true
> re.lastIndex
6
> re.test(s)
true
> re.lastIndex
12
> re.test(s)
false
> re.lastIndex
0
> re.test(s)
true
> re.lastIndex
6
ã¨ã„ã†æ„Ÿã˜ã§ã€re.lastIndex
ãŒãƒžãƒƒãƒã‚’é–‹å§‹ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’ä¿æŒã—ã¦ã„るよã†ã§ã™ã€‚ã§ã€æœ€å¾Œã¾ã§è¡Œã£ãŸã‚‰åˆã‚ã«æˆ»ã‚‹ã¨ã€‚
"g"オプションをã¤ã‘ãªã‘れã°ã“ã‚“ãªã“ã¨ã«ã¯ãªã‚‰ãšã€lastIndex
も常ã«0ã®ã¾ã¾ã§ã™ã€‚
ã¤ã„ã§ã«ã€RegExp.test()
ã¨RegExp.exec()
ã¨String.match()
ã¨String.search()
ã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚‚ã—ã¦ãŠãã¾ã—ãŸã€‚
一ã¤ã¯ã€node.js用。
https://gist.github.com/dai-shi/5169296
ã‚‚ã†ä¸€ã¤ã¯ã€ãƒ–ラウザ用。自分ã§ä½œã‚ã†ã‹ã¨æ€ã£ãŸã‚‰ã€æ—¢ã«ã‚りã¾ã—ãŸã€‚
http://jsperf.com/regex-test-or-exec-or-string-search-or-match
ã‚„ã¯ã‚Šã€æ£è¦è¡¨ç¾ã®ãƒžãƒƒãƒã‚’確èªã™ã‚‹ã ã‘ãªã‚‰ã€RegExp.test()
ãŒä¸€ç•ªã‚ˆã•ãã†ã§ã™ã。
ã¡ã‚‡ã£ã¨é¢ç™½ã„çµæžœã ã£ãŸã®ã¯Firefoxã®ã‚±ãƒ¼ã‚¹ã§ã€RegExp.test()
ã¨RegExp.exec()
ã®é€Ÿã•ãŒã»ã¨ã‚“ã©å¤‰ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ã¤ã¾ã‚Šã€test()
ã®å†…部ã§exec()
を呼ã³å‡ºã—ã¡ã‚ƒã£ã¦ã‚‹æ„Ÿã˜ã§ã™ã€‚Chromeã¨node.jsã§ã¯ï¼ˆã©ã¡ã‚‰ã‚‚v8ã ã‘ã©ï¼‰å·®ãŒå‡ºã¦ã„ã‚‹ã®ã§ã€Firefoxã®JavaScriptã‚¨ãƒ³ã‚¸ãƒ³ã¯æ”¹å–„ã®ä½™åœ°ãŒã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã—ょã†ã€‚
å‰ã‹ã‚‰æ€ã£ã¦ã„ã¾ã—ãŸãŒã€Chromeã®æ£è¦è¡¨ç¾ã®å‡¦ç†ã¯é€Ÿã„ã§ã™ãã‡ã€‚Firefoxã¨ã¯æ¯”ã¹ã‚‚ã®ã«ãªã‚‰ãªã„ã§ã™ã€‚