ãã®èšäºã§ã¯ãå°ããªCombinatorius Javaã©ã€ãã©ãªãŒã䜿çšããŠããªãœãŒã¹ãšããã«ç¶ãæå°åãšå§çž®ãçµã¿åãããŠJavaScriptãšCSSã転éããæ¹æ³ã«ã€ããŠèª¬æããŸããããã«ãããã³ã³ãã³ãã®è»¢éãé«éåããã³åçŽåã§ããŸãã
ãã¢ïŒ
combinatorius.dkiriusin.comGitHubïŒ
github.com/deniskiriusin/combinatoriusäž»ãªã©ã€ãã©ãªæ©èœ
- JavaScriptãšCSSããããã1ã€ã®JavaScriptãšCSSãªãœãŒã¹ã«çµã¿åãããŠãHTTPèŠæ±ã®æ°ãæžãããŸãã
- å¿çæéãæ¹åããããã«çæãããããŒã¿ã®ããŒã«ã«ãã£ãã·ã¥ã
- ãã©ãŠã¶ãŒã®æ¡ä»¶ä»ããªã¯ãšã¹ããæ¯æŽããæ£ããExpiresããã³Cache-Control HTTPããããŒã
- ãã©ãŠã¶ã®ãã£ãã·ã¥ãšãµãŒããŒäžã®ããŒã¿éã®å¯Ÿå¿ã決å®ããããã®ETagãµããŒãã
- HTTPå¿çã®ãµã€ãºãçž®å°ããGzipå§çž®ã
- YUI Compressorã®ãµããŒãã
- 転éããããªãœãŒã¹ã®ããŒãžã§ã³ã®ãµããŒãïŒæçŽãšéçãªãœãŒã¹ã®ããŒãžã§ã³ç®¡çïŒã
- URLãŸãã¯Cookieãªãã·ã§ã³ãä»ããCSSããŒãã®ãµããŒãã
- ã·ã³ãã«ãªæ§æã
ç°¡åãªåæ
WebããŒãžã®èªã¿èŸŒã¿é床ã¯ãWebéçºè
ãç¥ã£ãŠããå¿
èŠã®ããå€ãã®èŠå ã«äŸåããŸãã
ã€ã³ã¿ãŒããããããã€ããŒã«ãã£ãŠæäŸãããé床ãDNSèšå®ããŸãã¯ãªãœãŒã¹ã®å°ççãªå Žæã«ã€ããŠã¯èª¬æããŸããããHTTPãããã³ã«ãšãCSSããã³JavaScriptã³ã³ãã³ãã®è»¢éãå éããããã«äœ¿çšã§ããæ¹æ³ã«çŠç¹ãåœãŠãŸãã
ãããã£ãŠãããŒãžã®èªã¿èŸŒã¿é床ã«åœ±é¿ããäž»ãªèŠå ã¯æ¬¡ã®ãšããã§ãã
-éä¿¡ãããã³ã³ãã³ãã®ãµã€ãº
-HTTPãªã¯ãšã¹ãã®æ°
ãããã£ãŠãç§ãã¡ã®ç®æšã¯ãéä¿¡ãããã³ã³ãã³ãã®ãµã€ãºãšãµãŒããŒãžã®ãªã¯ãšã¹ãã®æ°ãæå°éã«æããããšã§ãã
åé¡1ïŒè»¢éãããã³ã³ãã³ã
ããŒãžãèªã¿èŸŒãŸãããšã©ããªãããèããŠãã ããã è±å¯ãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåããææ°ã®ã€ã³ã¿ãŒããããªãœãŒã¹ã¯ãã³ã³ãã³ããããŠã³ããŒãããããã«æ°åãæã«ã¯æ°çŸã®HTTPèŠæ±ãéä¿¡ããŸãã ãããã®å€ãã¯CSSãšJavaScriptã«ãããŸãã éä¿¡ãããCSSããã³JavaScriptã®ç·ééã¯éåžžãæ°çŸãããã€ã以äžã§ãã ã³ã³ãã³ããæå°åããã³å§çž®ããããšã«ãããéä¿¡ãããã³ã³ãã³ãã®éãæžããããšãã§ããŸãã
æå°åãšã¯ãæ©èœãç¶æããªããã¹ã¯ãªãããæžããããšãã¿ã¹ã¯ãšããããã»ã¹ã§ãã ããã¯ãã¹ã¯ãªããããã³ã¡ã³ããåé€ããããšãã¹ããŒã¹ãããã³å€æ°ã®ååãæžããããšã«ãã£ãŠå®çŸãããŸãã
ã©ã€ãã©ãªã¯
YUI Compressorãå®å
šã«ãµããŒãããCSS / JavaScriptãšããŒã¿å§çž®çšã®gzipãæå°åããŸããããã«ãããéä¿¡ãããCSSãšJavaScriptã®ç·ééãæã
æžããããšãã§ããŸãã ããã©ã«ãã§ã¯ãã©ã€ãã©ãªã¯ãååã«ãµãã£ãã¯ã¹ã.minãããå«ãŸãããªãœãŒã¹ãæå°åããŸããã
prop.YUI.OmitFilesFromMinificationRegEx = .*\\.min\\.(js|css)$
æ£èŠè¡šçŸã¯
combinatorius.properties
ã§å€æŽã§ããŸãã
ããŒã¿å§çž®ã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããããã»ã¹ã§ãããããæçµããŒã¿ã¯ãµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã®äž¡æ¹ã§ãã£ãã·ã¥ãããåŸç¶ã®ãªã¯ãšã¹ãã§ã¯ãã£ãã·ã¥ããçŽæ¥æäŸãããŸãã CSSãšJavaScriptãå€æŽããããšãããŒã¿ã¯æå°åãå§çž®ãããã³ãã£ãã·ã¥ãããŸãã
åé¡2ïŒHTTPãªã¯ãšã¹ãã®æ°
ã¯ã©ã€ã¢ã³ãã¯ãããŒãžäžã®CSSãªãœãŒã¹ãšJavaScriptãªãœãŒã¹ã®æ°ã«é¢ä¿ãªãã2ã€ã®ãªã¯ãšã¹ãã®ã¿ãéä¿¡ããå¿
èŠããããŸãã ããããCSSãšJavaScriptããšã«1ã€ã ãã®ã¢ãããŒãã®å©ç¹ãèŠãŠã¿ãŸãããã
RFC 2616ã«ããããã«ãHTTPèŠæ±ã¯æ¬¡ã®åœ¢åŒã«æºæ ããå¿
èŠããããŸãã
Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ]
å®éã«ã¯ã次ã®ããã«ãªããŸãã
GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1 Host: www.w3.org Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 HTTPS: 1 Referer: https://www.google.ie/ Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 Cookie: _ga=GA1.2.587820689.1448903370; JSESSIONID=00002Fn37WPDiDzeIspqmDaEY1J:-1; web_vid=1140991966240108
åãRFC 2616ã«åºã¥ããŠãHTTPå¿ç圢åŒã¯æ¬¡ã®ãšããã§ãã
Response = Status-Line *(( general-header | response-header | entity-header ) CRLF) CRLF [ message-body ]
Chrome DevToolsã«ã¯æ¬¡ã®ãããªãã®ã衚瀺ãããŸãã
HTTP/1.1 200 OK Date: Tue, 12 Apr 2016 15:56:01 GMT Last-Modified: Thu, 18 Feb 2016 10:16:05 GMT ETag: "19982-52c08a77e8340" Accept-Ranges: bytes Content-Length: 104834 Keep-Alive: timeout=10, max=100 Connection: Keep-Alive Content-Type: text/css X-Pad: avoid browser bug
HTTPããããŒã®ãµã€ãºã¯ãCookieãèæ
®ããŠã200ãã€ããã2KB以äžãŸã§ããŸããŸã§ãã
ãããããã§ãããã»ãšãã©ã®å Žåãããããªããšã«ãéãæããªããã°ãªããŸããã ããšãã°ããµã€ãºããããã1ãã€ãã®10åã®éçãªãœãŒã¹ãå«ãããŒãžãäœæãããšããã©ãŠã¶ã¯10ãã€ãã®æçšãªããŒã¿ãããŠã³ããŒãããããã«ãæ°ãããã€ãã®HTTPããããŒã®ã¿ãå¿çããŠéåä¿¡ããå¿
èŠããããŸãã
ããããäž»ãªåé¡ã¯ããã§ãããããŸãããããããã-èŠæ±ã¯é
ãã§ãã ææ°ã®ãã©ãŠã¶ã¯ãã«ãã¹ã¬ããåãããŠãããæåãå°œãããŠããŸãããã»ãšãã©ãã¹ãŠã®HTTPãªã¯ãšã¹ãã«ã€ããŠãäœããã®æ¹æ³ã§DNSã決å®ãããµãŒããŒãžã®æ¥ç¶ãäœæããŠãããHTTPSã®å Žåã¯SSLãã³ãã·ã§ã€ã¯ãè¡ãå¿
èŠããããŸã...ãã®åŸããµãŒããŒããHTTPå¿çãååŸã§ããŸãã ããã«ã¯ãã¹ãŠæéããããããªã¯ãšã¹ããå€ãã»ã©ãããŒãžã®èªã¿èŸŒã¿ã«æéãããããŸãã
幞ããªããšã«ãHTTPããããŒã¯éåžžã«æçšã§ããå¯èœæ§ããããã©ã€ãã©ãªã¯CSSãšJavaScriptã®èªã¿èŸŒã¿é床ãæ倧åããããã«å·§ã¿ã«ãããã調æŽããŸãã
ãã£ãã·ã¥å¶åŸ¡ïŒHTTP / 1.1ïŒ
Cache-ControlããããŒãã£ã¬ã¯ãã£ãã¯ãã ããHTTPå¿çããã£ãã·ã¥ã§ããããã©ã®ãããªæ¡ä»¶äžã§ãã©ã®ãããã®æéããã£ãã·ã¥ã§ãããã決å®ããŸãã ãªã¯ãšã¹ãããŸã£ããéä¿¡ããããã©ãŠã¶ã®ãã£ãã·ã¥ã«ã¬ã¹ãã³ã¹ã®ã³ããŒãä¿åããããããååŸããŠãµãŒããŒãšéä¿¡ããªãããã«ããã®ãæåã§ãã ããã«ããããããã¯ãŒã¯ãä»ããããŒã¿è»¢éã®è²»çšãäžèŠã«ãªããŸãã
ãããã£ãŠãmax-ageãã£ã¬ã¯ãã£ãã¯ãåä¿¡ããå¿çããã©ãŠã¶ãã£ãã·ã¥ããåå©çšã§ããæ倧æéãç§åäœã§æ±ºå®ããŸãã ã©ã€ãã©ãªã¯ããã©ã«ãã§1幎éããŒã¿ããã£ãã·ã¥ããŸãã
Cache-Control: public, s-maxage=31536000, max-age=31536000
combinatorius.properties
æ§æãå€æŽã§ããŸãã
æå¹æéïŒHTTP / 1.0ïŒ
ãã®ããããŒã¯æ¬è³ªçã«Cache-Controlã®é¡äŒŒç©ã§ãHTTP / 1.1ã«åã£ãŠä»£ãããŸããã Expiresã¯ãã¯ã©ã€ã¢ã³ãåŽã§ããŒã¿ããã£ãã·ã¥ã§ããæéã決å®ããŸãã ã©ã€ãã©ãªã¯ããã©ã«ãã§Expiresã1幎å
ã«èšå®ããŸãã
Expires: Thu, 15 Apr 2017 22:00:00 GMT
combinatorius.properties
æ§æãå€æŽã§ããŸãã
ETagïŒHTTP / 1.1ïŒ
ãã£ãã·ã¥æ€èšŒãæäŸããã¯ã©ã€ã¢ã³ããæ¡ä»¶ä»ããªã¯ãšã¹ããéä¿¡ã§ããããã«ããŸãã ããã«ãããã³ã³ãã³ããå€æŽãããŠããªãå Žåã«WebãµãŒããŒãå®å
šãªå¿çãéä¿¡ããå¿
èŠããªãããããã£ãã·ã¥ãããå¹ççã«ããããšãã§ããŸãã ã©ã€ãã©ãªã¯ãæçŽã®äœ¿çšãšåæ§ã«ETagã䜿çšããŸãã ããšãã°ãé·ããã£ãã·ã¥ã䜿çšããŠãCSSããã³JavaScriptãªãœãŒã¹ã«å€æŽãå ããåŸããããã®ååãå€æŽããå¿
èŠã¯ãããŸããã ã©ã€ãã©ãªã¯ãCSSããã³JavaScriptã«å ããããå€æŽãèªåçã«èªèããŸãã ããŒã¿ã¯å¿
èŠã«å¿ããŠèªåçã«æå°åãããå§çž®ããããã£ãã·ã¥ãããå¿
èŠãªãã¹ãŠã®ããããŒãšãšãã«ã¯ã©ã€ã¢ã³ãã«é
ä¿¡ãããŸãã
ãŠãŒã¶ãŒã¬ã€ã
ã©ã€ãã©ãªã¯äžå€®ãªããžããªããã¢ã¯ã»ã¹ã§ããŸãã
<dependency> <groupId>com.dkiriusin</groupId> <artifactId>combinatorius</artifactId> <version>1.0.60</version> </dependency> <dependency> <groupId>com.yahoo.platform.yui</groupId> <artifactId>yuicompressor</artifactId> <version>2.4.8</version> </dependency>
ãµãŒãã¬ããã
web.xml
ç»é²ããŸãã
<servlet> <servlet-name>Combinatorius</servlet-name> <servlet-class>com.dkiriusin.combinatorius.CombinatoriusServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Combinatorius</servlet-name> <url-pattern>/combo/*</url-pattern> </servlet-mapping>
ãä»åŸã
/combo/*
ãžã®ãã¹ãŠã®ãªã¯ãšã¹ãã¯ã©ã€ãã©ãªã«ãã£ãŠåŠçãããŸãã
次ã«å¿
èŠãªã®ã¯ã
combinatorius.properties
ãã¡ã€ã«ãäœæãããããã¯ã©ã¹ãã¹ã«é
眮ããããšã§ãã
TomcatãäŸãšããŠäœ¿çšãããšã
common.loader
ãå€æŽãã
combinatorius.properties
ãã¹ãè¿œå ããããšã§ãããå®çŸã§ããŸãã ç§ã®å ŽåïŒUbuntu 12.04 LTSïŒïŒ
view /etc/tomcat7/catalina.properties
å®å
ïŒ
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat7/common/classes,/var/lib/tomcat7/common/*.jar
åŸïŒ
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat7/common/classes,/var/lib/tomcat7/common/*.jar,${catalina.base}/combinatorius-conf
ãããã£ãŠããã£ã¬ã¯ããªãäœæããŸãã
mkdir /var/lib/tomcat7/combinatorius-conf
ãããŠã
combinatorius.properties.
ãã³ããŒããŸã
combinatorius.properties.
ãã®ã©ã€ãã©ãªã¯ã
prop.css.dir
ããã³
prop.js.dir
ãã£ã¬ã¯ããªã®CSSããã³JavaScriptãªãœãŒã¹ãããã³ãããã®ãµããã£ã¬ã¯ããªã§åäœããŸãã CSSããã³JavaScriptãã¡ã€ã«ã¯ã¢ã«ãã¡ãããé ã«ååž°çã«èªã¿åãããæå°åãããå§çž®ãããŠã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸãã æå°åãããããŒã¿ã¯ããµãŒããŒåŽã®
prop.css.cache.dir
ããã³
prop.js.cache.dir
ãã£ãã·ã¥ãããŸãã
æ£èŠè¡šçŸ
prop.YUI.OmitFilesFromMinificationRegEx
äžèŽãããªãœãŒã¹ã¯æå°åã
prop.YUI.OmitFilesFromMinificationRegEx
ãŸããã
CSSããŒã
CSSããŒãã®ãµããŒããæäŸãããŸãã CSSããŒãã¯ã1ã€ä»¥äžã®CSSãã¡ã€ã«ã
prop.themes.dir
ãµããã£ã¬ã¯ããªã§ãã ããšãã°ã
prop.themes.dir/green/theme.css
ã ããŒãåã¯ãµããã£ã¬ã¯ããªã®ååãšäžèŽããå¿
èŠãããã
theme
ãã©ã¡ãŒã¿ã®URLãŸãã¯Cookiesã®
combinatorius.theme
ã®å€ãšããŠã©ã€ãã©ãªã«æž¡ãããšãã§ããŸãã
è¿œå ã®ãªãœãŒã¹ãæ¥ç¶ãã
prop.css.dir
ããã³
prop.js.dir
å«ãŸããŠããªãè¿œå ã®ãªãœãŒã¹ãæ¥ç¶ããããšãå¯èœ
prop.js.dir
ã ãã®ãããªå¿
èŠæ§ã¯ãã¹ã¯ãªããããã£ãã«äœ¿çšãããïŒãããžã§ã¯ãã®1ã€ãŸãã¯2ã€ã®ããŒãžã§ïŒãããã©ã«ãã§ãã¢ã»ã³ããªãã«å«ãŸããã¹ãã§ã¯ãªãå Žåã«çºçããå¯èœæ§ããããŸãã
resources
ãã©ã¡ãŒã¿URLã䜿çšããŠãè¿œå ã®ãªãœãŒã¹ã転éã§ããŸãã
/combinatorius/combo/&type=js&resources=extra_js/extra1.js,extra_js/extra2.js&theme=blue
JSPã¿ã°
åçŽããšä¿¡é Œæ§ã®ããã«ãJSPã¿ã°ã䜿çšããŠURLãçæããããšããå§ãããŸãã ããããCSSããã³JavaScriptããšã«1ã€ã®ã¿ã°ã å¿
é ã®å±æ§ã¯
type
ãš
path
ã§ãã
<
JSPã¿ã°ã䜿çšãããšã1ã€ã®éèŠãªå©ç¹ããããŸãã ã¿ã°ã¯ãURLã®æåŸã«ããŒãžã§ã³ãè¿œå ããŠãªãœãŒã¹ãèªåçã«ãµãã¹ã¯ã©ã€ããããã£ãã·ã¥ãã£ãã·ã¥ã®ç¡å¹åã®åé¡ã解決ããŸãã
/combinatorius/combo/&type=js&v=1465737376000
ãªã³ã¯ãèªãïŒ
developer.yahoo.com/performance/rules.htmldevelopers.google.com/web/fundamentals/performance/optimizing-content-efficiency/?hl=en