{"id":1707,"date":"2008-02-25T23:09:28","date_gmt":"2008-02-25T15:09:28","guid":{"rendered":"http:\/\/ihower.idv.tw\/blog\/archives\/1707"},"modified":"2015-09-05T10:47:44","modified_gmt":"2015-09-05T02:47:44","slug":"optimize-rails-frontend","status":"publish","type":"post","link":"https:\/\/ihower.tw\/blog\/1707-optimize-rails-frontend","title":{"rendered":"Rails Front-End \u512a\u5316"},"content":{"rendered":"<p>Update(2008\/3\/24): Yahoo \u6709\u4efd\u6295\u5f71\u7247\u503c\u5f97\u4e00\u770b:<\/p>\n<div style=\"width:425px;text-align:left\" id=\"__ss_310612\"><object style=\"margin:0px\" height=\"355\" width=\"425\"><param name=\"movie\" value=\"http:\/\/static.slideshare.net\/swf\/ssplayer2.swf?doc=high-performance-web-pages-20-new-best-practices-120577522992998-3\"\/><param name=\"allowFullScreen\" value=\"true\"\/><param name=\"allowScriptAccess\" value=\"always\"\/><\/object><\/p>\n<div style=\"font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;\"><a href=\"http:\/\/www.slideshare.net\/?src=embed\"><img decoding=\"async\" src=\"http:\/\/static.slideshare.net\/swf\/logo_embd.png\" style=\"border:0px none;margin-bottom:-5px\" alt=\"SlideShare\"\/><\/a> | <a href=\"http:\/\/www.slideshare.net\/stoyan\/high-performance-web-pages-20-new-best-practices\" title=\"View this slideshow on SlideShare\">View<\/a> | <a href=\"http:\/\/www.slideshare.net\/upload\">Upload your own<\/a><\/div>\n<\/div>\n<p><img decoding=\"async\" style=\"visibility:hidden;width:0px;height:0px;\" border=0 width=0 height=0 src=\"http:\/\/counters.gigya.com\/wildfire\/CIMP\/Jmx*PTEyMDYzNTkxMzk2OTMmcHQ9MTIwNjM1OTE*MjU5OSZwPTEwMTkxJmQ9Jm49.jpg\" \/><\/p>\n<p>\u56e0\u70ba <a href=\"http:\/\/registrano.com\">Registrano<\/a> hosting \u5728\u570b\u5916\u7684\u95dc\u4fc2\uff0c\u5148\u5929\u901f\u5ea6\u5c31\u6162\u4e86\u4e00\u500b\u592a\u5e73\u6d0b\u3002\u6240\u4ee5\u5982\u4f55\u8b93\u7db2\u9801\u80fd\u5920\u5feb\u9ede loading \u5b8c\u4e26\u4e14 display \u51fa\u4f86\u8b8a\u5f97\u975e\u5e38\u91cd\u8981\u4e14\u611f\u53d7\u660e\u986f\u3002\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 Firefox \u7684 <a href=\"http:\/\/developer.yahoo.com\/yslow\/\">YSlow<\/a> \u6216 safari web inspector \u4f86\u6aa2\u6e2c\u5be6\u969b\u4e0b\u8f09\u7684\u74f6\u9838\u5728\u54ea\u88e1\u3002\u6559\u6750\u5247\u6709 O&#8217;Reilly <a href=\"http:\/\/www.oreilly.com\/catalog\/9780596529307\/\">High Performance Web Sites<\/a> \u4e00\u66f8\u503c\u5f97\u4e00\u8b80\uff0c\u88e1\u9762\u7684 guideline \u6709\u5341\u56db\u9ede\u5982\u4e0b:<\/p>\n<ol>\n<li>Make Fewer HTTP Requests<\/li>\n<li>Use a Content Delivery Network<\/li>\n<li> Add an Expires Header<\/li>\n<li>Gzip Components<\/li>\n<li>Put Stylesheets at the Top<\/li>\n<li>Put Scripts at the Bottom<\/li>\n<li>Avoid CSS Expressions<\/li>\n<li>Make JavaScript and CSS External<\/li>\n<li>Reduce DNS Lookups<\/li>\n<li>Minify JavaScript<\/li>\n<li>Avoid Redirects<\/li>\n<li>Remove Duplicates Scripts<\/li>\n<li>Configure ETags<\/li>\n<li>Make Ajax Cacheable<\/li>\n<\/ol>\n<p><!--more--><br \/>\n\u7b2c2\u9ede\u5728\u53f0\u7063\u53ef\u4ee5\u8a66\u8a66 <a href=\"http:\/\/webamp.giga.net.tw\/\">WebAMP<\/a> \u7684 reverse proxy \u670d\u52d9\u3002<\/p>\n<p>\u7b2c4\u9ede Gzip \u5f37\u70c8\u5efa\u8b70\u52d9\u5fc5\u88dd\u4e0a (CPU\u6bd4\u7db2\u8def\u901f\u5ea6\u5feb\u591a\u4e86XD)\uff0c\u8a2d\u5b9a\u5982\u4e0b:<\/p>\n<pre>\n# For Apache, add this to your VirtualHost section:\n# Deflate\nAddOutputFilterByType DEFLATE text\/html text\/xml text\/plain text\/css application\/x-javascript text\/javascript;\nBrowserMatch ^Mozilla\/4 gzip-only-text\/html\nBrowserMatch ^Mozilla\/4\\.0[678] no-gzip\nBrowserMatch \\bMSIE !no-gzip !gzip-only-text\/html\n\n#You may also need to load the deflate_module if it wasn't already included with your server.\n<\/pre>\n<p>\u7b2c8\u9ede\u5f37\u70c8\u5efa\u8b70\u58d3\u7e2e\u4f60\u7684 JavasScript \u6a94\u6848\uff0c\u5728 Rails \u4e2d\u53ef\u4ee5\u4f7f\u7528 <a href=\"http:\/\/code.google.com\/p\/bundle-fu\/\">bundle_fu plugin<\/a>\u3002 (\u5df2\u77e5\u4e00\u500b\u5730\u96f7\u662f bundle_fu \u8ddf\u5e95\u4e0b\u7684 asset_host \u885d\u7a81\uff0c\u8acb\u4f9d\u7167\u9019\u500b <a href=\"http:\/\/code.google.com\/p\/bundle-fu\/issues\/detail?id=2\"> comment <\/a> \u81ea\u5df1 patch \u4e00\u4e0b)<\/p>\n<p>\u7b2c3\u9ede\u8ddf\u7b2c13\u9ede\u7684\u8a2d\u5b9a\u5247\u662f:<\/p>\n<pre>\n&lt;Directory \"\/your_rails\/public\">\n  FileETag none\n  ExpiresActive On\n  ExpiresDefault \"access plus 1 year\"\n&lt;\/Directory>\n<\/pre>\n<p>Rails \u9084\u6709\u500b\u529f\u80fd\u662f\u53ef\u4ee5\u8a2d\u5b9a asset_host\uff0c\u65b9\u4fbf\u4f60\u628a\u975c\u614b\u6a94\u6848(\u5373 \/public \u76ee\u9304)\u7528\u66f4\u5feb\u901f\u4fbf\u5b9c\u7684 web server \u63d0\u4f9b (\u5225\u8b93 mongrel \u76f4\u63a5\u63d0\u4f9b\u9019\u4e9b\u975c\u614b\u6a94\u6848\u554a)\uff0c\u50cf Registrano \u5c31\u4e7e\u8106\u628a\u6240\u6709\u975c\u614b\u6a94\u6848\u653e\u5728\u53e6\u4e00\u53f0\u7db2\u8def\u7a0d\u5feb\u7684 server \u4e0a:<\/p>\n<pre>\n# \/config\/environments\/production.rb\nconfig.action_controller.asset_host  = 'http:\/\/asset.example.org\"  \n<\/pre>\n<p>Rails2 \u66f4\u652f\u63f4\u53ef\u4ee5\u540c\u6642\u5206\u6563\u5230\u56db\u53f0 asset0~asset3\uff0c\u53ea\u8981\u52a0%d (\u7576\u7136\u4f60\u7684 DNS \u4e5f\u8981\u8a2d\u597d\uff0c\u6700\u7c21\u55ae\u7684\u4f5c\u6cd5\u53ef\u4ee5\u6307\u5230\u540c\u4e00\u53f0 server)<\/p>\n<pre>\n# \/config\/environments\/production.rb\nconfig.action_controller.asset_host  = 'http:\/\/asset%d.example.org\"  \n<\/pre>\n<p>\u597d\u8655\u662f\u53ef\u4ee5\u8b93 browser \u540c\u6642\u5e73\u884c\u4e0b\u8f09 (\u55ae\u4e00 domain \u7684\u4e0b\u8f09\u6700\u591a\u540c\u6642\u5169\u500b persistent connections, see <a href=\"\/blog\/archives\/1517#\">HTTP\u9023\u7dda\u7ba1\u7406<\/a>\u4e00\u6587)\uff0c\u56e0\u6b64\u5982\u679c\u4f60\u7684\u7db2\u7ad9\u975c\u614b\u6a94\u6848(\u5982\u5716\u6a94)\u5f88\u591a\u7684\u8a71\uff0c\u61c9\u8a72\u6703\u6709\u4e0d\u932f\u7684\u6548\u679c\u3002\u4e0d\u904e\u5728 Registrano \u5be6\u6e2c\u6548\u679c\u4e26\u6c92\u6709\u5f88\u597d\uff0c\u9019\u662f\u56e0\u70ba DNS Lookup \u4e5f\u8981\u82b1\u6642\u9593(\u5373\u4e0a\u8ff0\u7b2c9\u9ede)<\/p>\n<p>P.S. \u4f7f\u7528 asset host \u7684\u4e00\u500b\u526f\u4f5c\u7528\u662f cross domain \u554f\u984c\uff0c\u56e0\u6b64\u5403\u4e86\u4e0d\u5c11 Javascript library \u82e6\u982d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Update(2008\/3\/24): Yahoo \u6709\u4efd\u6295\u5f71\u7247\u503c\u5f97\u4e00\u770b: | View | Upload you &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ihower.tw\/blog\/1707-optimize-rails-frontend\" class=\"more-link\">\u95b1\u8b80\u5168\u6587<span class=\"screen-reader-text\">\u3008Rails Front-End \u512a\u5316\u3009<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[34,50,53],"tags":[],"class_list":["post-1707","post","type-post","status-publish","format-standard","hentry","category-http","category-performance","category-rails","entry"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1q6tG-rx","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/comments?post=1707"}],"version-history":[{"count":4,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1707\/revisions"}],"predecessor-version":[{"id":8279,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1707\/revisions\/8279"}],"wp:attachment":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/media?parent=1707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/categories?post=1707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/tags?post=1707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}