効率的なCSSおよびJavaScriptレンダリングのためのJavaラむブラリ

この蚘事では、小さなCombinatorius Javaラむブラリヌを䜿甚しお、リ゜ヌスずそれに続く最小化ず圧瞮を組み合わせおJavaScriptずCSSを転送する方法に぀いお説明したす。これにより、コンテンツの転送を高速化および単玔化できたす。



デモ combinatorius.dkiriusin.com

GitHub github.com/deniskiriusin/combinatorius



䞻なラむブラリ機胜



  1. JavaScriptずCSSをそれぞれ1぀のJavaScriptずCSSリ゜ヌスに組み合わせお、HTTP芁求の数を枛らしたす。
  2. 応答時間を改善するために生成されたデヌタのロヌカルキャッシュ。
  3. ブラりザヌの条件付きリク゚ストを支揎する正しいExpiresおよびCache-Control HTTPヘッダヌ。
  4. ブラりザのキャッシュずサヌバヌ䞊のデヌタ間の察応を決定するためのETagサポヌト。
  5. HTTP応答のサむズを瞮小するGzip圧瞮。
  6. YUI Compressorのサポヌト。
  7. 転送されたリ゜ヌスのバヌゞョンのサポヌト指王ず静的リ゜ヌスのバヌゞョン管理。
  8. URLたたはCookieオプションを介したCSSテヌマのサポヌト。
  9. シンプルな構成。


簡単な分析



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.







combinatorius.properties
 #---------------------# # required properties # #---------------------# # root CSS directory prop.css.dir = /var/lib/tomcat7/webapps/my_project/css # cached CSS directory prop.css.cache.dir = /var/lib/tomcat7/webapps/my_project/css_cache # root JS directory prop.js.dir = /var/lib/tomcat7/webapps/my_project/js # cached JS directory prop.js.cache.dir = /var/lib/tomcat7/webapps/my_project/js_cache #---------------------# # optional properties # #---------------------# # themes root directory prop.themes.dir = /var/lib/tomcat7/webapps/my_project/themes # Cache-Control: s-maxage directive (31536000 by default) prop.s-maxage = 31536000 # Cache-Control: max-age directive (31536000 by default) prop.max-age = 31536000 # Enables gzip compression (true by default) prop.isCompressionEnabled = true # Enables YUI compressor (true by default) prop.isYUICompressorEnabled = true # Insert line breaks in output after the specified column number (-1 by default) prop.YUI.CSSCompressor.linebreakpos = -1 # Splits long lines after a specific column (100 by default) prop.YUI.JavaScriptCompressor.linebreak = 100 # Minify only, do not obfuscate (false by default) prop.YUI.JavaScriptCompressor.nomunge = false # verbose output (false by default) prop.YUI.JavaScriptCompressor.verbose = false # Preserve unnecessary semicolons (such as right before a '}') (false by default) prop.YUI.JavaScriptCompressor.preserveAllSemiColons = true # Disable all the built-in micro optimizations (true by default) prop.YUI.JavaScriptCompressor.disableOptimisations = true # Define files to be omitted of minification ('.*\.min\.(js|css)$' by default) prop.YUI.OmitFilesFromMinificationRegEx = .*\.min\.(js|css)$
      
      





このラむブラリは、 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



です。



 <%@ taglib uri="https://github.com/deniskiriusin/combinatorius" prefix="cb" %> <cb:combo type="css" path="/combo"> <jsp:attribute name="theme">blue</jsp:attribute> <jsp:attribute name="csv_resources">extra_css/extra1.css,extra_css/extra2.css</jsp:attribute> </cb:combo> <cb:combo type="js" path="${path}"></cb:combo>
      
      





JSPタグを䜿甚するず、1぀の重芁な利点がありたす。 タグは、URLの最埌にバヌゞョンを远加しおリ゜ヌスを自動的にサブスクラむブし、キャッシュキャッシュの無効化の問題を解決したす。



 /combinatorius/combo/&type=js&v=1465737376000
      
      







リンクを読む



developer.yahoo.com/performance/rules.html

developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/?hl=en



All Articles