<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/front-end-optimization/</link>
<title><![CDATA[Web前端优化总结]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 10:26:01 +0000</pubDate> 
<guid>https://www.heckjj.com/front-end-optimization/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关于Web前端优化的一些方法总结，面向内容的优化规则目前有10条，同时如果你有什么好的方法的话也希望你和大家一起来分享下<img src="images/emot/thumbnail/81.gif" border="0" alt="81" />。<br /><strong>1. 尽量减少 HTTP 请求 (Make Fewer HTTP Requests)</strong><br />作为第一条，可能也是最重要的一条。根据 Yahoo! 研究团队的数据分析，有很大一部分用户访问会因为这一条而取得最大受益。有几种常见的方法能切实减少 HTTP 请求：<br /><blockquote>&nbsp;&nbsp;&nbsp;&nbsp;1) <strong>合并文件，</strong>比如把多个 CSS 文件合成一个； <br />&nbsp;&nbsp;&nbsp;&nbsp;2) <strong>CSS Sprites</strong> 利用 CSS background 相关元素进行背景图绝对定位；参见：<a href="http://alistapart.com/articles/sprites" target="_blank">CSS Sprites: Image Slicing&rsquo;s Kiss of </a>Death <br />&nbsp;&nbsp;&nbsp;&nbsp;3) <strong>图像地图 </strong><br />&nbsp;&nbsp;&nbsp;&nbsp;4) <strong>内联图象 </strong>使用 <a href="http://tools.ietf.org/html/rfc2397" target="_blank">data: URL scheme </a>在实际的页面嵌入图像数据. </blockquote>&nbsp;&nbsp; <br />&nbsp;&nbsp;<strong>2. 减少 DNS 查找 (Reduce DNS Lookups)</strong><br />必须明确的一点，DNS 查找的开销是很大的。另外，我倒是觉得这是 Yahoo! 所有站点的通病，Yahoo！主站点可能还不够明显，一些分站点，存在明显的类似问题。对于国内站点来说，如果过多的使用了站外的 Widget ，也很容易引起过多的 DNS 查找问题。<br /><br /><strong>3. 避免重定向 (Avoid Redirects)</strong><br />不是绝对的避免，尽量减少。另外，应该注意一些不必要的重定向。比如对 Web 站点子目录的后面添加个 / (Slash) ，就能有效避免一次重定向。http://www.dbanotes.net/arch 与 http://www.dbanotes.net/arch/ 二者之间是有差异的。如果是 Apache 服务器，通过配置 Alias 或mod_rewrite 或是 DirectorySlash 能够消除这个问题。<br /><strong><br />4. 使得 Ajax 可缓存 (Make Ajax Cacheable)</strong><br />响应时间对 Ajax 来说至关重要，否则用户体验绝对好不到哪里去。提高响应时间的有效手段就是 Cache 。其它的一些优化规则对这一条也是有效的。<br /><br /><strong>5. 延迟载入组件 (Post-load Components)<br /></strong><br /><strong>6. 预载入组件 (Preload Components)</strong><br />上面两条严格说来，都是属于异步这个思想灵活运用的事儿。<br /><br /><strong>7. 减少 DOM 元素数量 (Reduce the Number of DOM Elements)</strong><br /><br /><strong>8. 切分组件到多个域 (Split Components Across Domains)</strong><br />主要的目的是提高页面组件并行下载能力。但不要跨太多域名，否则就和第二条有些冲突了。<br /><br /><strong>9. 最小化 iframe 的数量 (Minimize the Number of iframes)</strong><br />熟悉 SEO 的朋友知道 iframe 是 SEO 的大忌。针对前端优化来说 iframe 有其好处，也有其弊端，一分为二看问题吧。<br /><strong><br />10. 杜绝 http 404 错误 (No 404s)</strong><br />对页面链接的充分测试加上对 Web 服务器 error 日志的不断跟踪能有效减少 404 错误，亦能提升用户体验。值得一提的是，CSS 与 Java Script 引起的 404 错误因为定位稍稍&rdquo;难&rdquo;一点而往往容易被忽略。<br /><br />Web 前端优化最佳实践第二部分面向 Server 。目前共计有 6 条实践规则。【注，这最多算技术笔记，查看最原始内容，还请访问：<a href="http://developer.yahoo.com/performance/rules.html" target="_blank">Exceptional Performance : Best Practices for Speeding Up Your Web Site </a>】<br /><strong><br />1. 使用 CDN (Use a Content Delivery Network)</strong><br />国内 CDN 的普及还不够。不过我们有独特的电信、网通之间的问题，如果针对这个作优化，基本上也算能收到 CDN 或类似的效果吧(假装如此)。【Tin 说国内 CDN 用的挺多，看看 CDN 厂商的市场就知道了，还没走入寻常百姓家】<br /><br /><strong>2. 添加 Expires 或 Cache-Control 信息头 (Add an Expires or a Cache-Control Header)</strong><br />各个浏览器都有针对的方案, Apache 例子【注意：下面的说明例子还不够精细，具体的环境上还要加一些调整】:<br />ExpiresActive On ExpiresByType image/gif &ldquo;modification plus 1 weeks&rdquo;<br />Lighttpd 启用 mod_expire 模块 后：<br />$HTTP[&quot;url&quot;] =~ &ldquo;&quot;.(jpg&#124;gif&#124;png)$&rdquo; &#123; expire.url = ( &ldquo;&rdquo; =&gt; &ldquo;access 1 years&rdquo; ) &#125;<br />Nginx 例子参考:<br />location ~* &quot;.(jpg&#124;gif&#124;png)$ &#123; if (-f $request_filename) &#123; expires max; break; &#125; &#125;<br /><br /><strong>3. 压缩内容 (Gzip Components)</strong><br />对于绝大多数站点，这都是必要的一步，能有效减轻网络流量压力。或许有人担心对 CPU 压缩对于 CPU 的影响，放心大胆的整吧，没事儿。Nginx 例子：<br />gzip on; gzip_types text/plain text/html text/css ext/javascript;<br />另外参见：<br /><a href="http://www.dbanotes.net/web/iis_gzip_compression.html" target="_blank">IIS 如何启用 Gzip 压缩? </a><br /><br /><strong>4. 设置 Etags (Configure ETags)</strong><br />对于 <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html" target="_blank">Etag</a>，可能是多数网站维护者都会忽略的地方。在这一系列优化规则出现之前，可能互联网上绝大多数站点都对这个问题忽略了。当然，Etag 对多数站点性能的影响并不是很大。除非是面向 RSS 的网站。【看到有朋友批评说写的简略，并且说 IE 不支持 ETag。明确说一下：IE 支持 ETag，倒是使用 IIS 要注意相关 Etag Bug。】<br />补充：我的意思是&rdquo;很多网站在不注意的情况下都是打开 Etag 的，而没有网站关心如何用，消耗资源而不知。并不是说 Etag 不好，合理利用 Etag ，绝对能取得很好的收益.<br /><br /><strong>5. 尽早刷新 Buffer (Flush the Buffer Early)</strong><br />对这一条，琢磨了半天，貌似还是异步的思路。能更好的提升用户体验?<br /><strong><br />6. 对 AJAX 请求使用 GET 方法 (Use GET for AJAX Requests)</strong><br />XMLHttpRequest POST 要两步，而 GET 只需要一步。但要注意的是在 IE 上 GET 最大能处理的 URL 长度是 2K。<br /><br />Web 前端优化最佳实践第三部分面向 Cookie 。目前只有 2 条实践规则。<br /><br /><strong>1. 缩小 Cookie (Reduce Cookie Size)</strong><br />Cookie 是个很有趣的话题。根据 <a href="http://www.ietf.org/rfc/rfc2109.txt" target="_blank">RFC 2109</a> 的描述，每个客户端最多保持 300 个 Cookie，针对每个域名最多 20 个 Cookie (实际上多数浏览器现在都比这个多，比如 Firefox 是 50 个) ，每个 Cookie 最多 4K，注意这里的 4K 根据不同的浏览器可能不是严格的 4096 。别扯远了，对于 Cookie 最重要的就是，尽量控制 Cookie 的大小，不要塞入一些无用的信息。<br /><br /><strong>2. 针对 Web 组件使用域名无关性的 Cookie (Use Cookie-free Domains for Components)</strong><br />这个话题在此前针对<a href="http://www.dbanotes.net/web/web_image_server.html" target="_blank"> Web 图片服务器</a>的讨论中曾经提及。这里说的 Web 组件(Component)，多指静态文件，比如图片 CSS 等，Yahoo! 的静态文件都在 yimg.com 上，客户端请求静态文件的时候，减少了 Cookie 的反复传输对主域名 (yahoo.com) 的影响。<br />从这篇 <a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/" target="_blank">When the Cookie Crumbles</a> 能看出，MySpace 和 eBay 的 Cookie 都不小的，想必是对用户行为比较关心。<a href="http://www.dbanotes.net/database/ebay_personalization_platform_mysql.html" target="_blank">eBay 前不久构造了 Personalization Platform </a>，就是从 Cookie 的限制中跳出来。<br /><br />Web 前端优化最佳实践第四部分面向 CSS。目前共计有 6 条实践规则。另请参见 Mozilla 开发者中心的文章：<a href="http://developer.mozilla.org/en/docs/Writing_Efficient_CSS">Writing Efficient CSS</a><br /><br /><strong>1. 把 CSS 放到代码页上端 (Put Stylesheets at the Top)</strong><br />官方的解释我觉得多少有点语焉不详。这一条其实和用户访问期望有关。CSS 放到最顶部，浏览器能够有针对性的对 HTML 页面从顶到下进行解析和渲染。没有人喜欢等待，而浏览器已经考虑到了这一点。<br /><br /><strong>2. 避免 CSS 表达式 (Avoid CSS Expressions)</strong><br />个人认为通过 CSS 表达式能做到的事情，通过其它手段也同样能做到而且风险更小一些。<br /><strong><br />3. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)</strong><br />剥离后，能够有针对性的对其进行单独的处理策略，比如压缩或者缓存策略。<br /><strong><br />4. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)</strong><br />如果没有 JavaScript 与 CSS 可能更好。但，这是不可能的，SO，尽量小点吧。语法能简写的简写。<br /><br /><strong>5. 使用 &lt;link&gt; 而不是@importChoose &lt;link&gt; over @import</strong><br />在 IE 中 @import 指令等同于把 link 标记写在 HTML 的底部。而这与第一条相违背。<br /><br /><strong>6. 避免使用Filter (Avoid Filters)</strong><br /> <br /><br />Web 前端优化最佳实践之 JavaScript 篇，这部分有 6 条规则，和 CSS 篇 重复的有几条。前端优化最佳实践，最重要的还是&rdquo;实践&rdquo;，要理解这东西容易得很，关键是要去&rdquo;实践&rdquo;，去&rdquo;执行&rdquo;，去&rdquo;反馈&rdquo;，去获取受益。<br /><strong><br />1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)</strong><br />当一个脚本在下载的时候，浏览器干不了其它的事儿(串行了)。所以，把它扔到最后面去处理。对于一些功能性的脚本，可能实现起来有些两难。不过对于 国内网站来说，有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说，绝对可行的建议，放到页面最底下。<br /><br /><strong>2. Make JavaScript and CSS External</strong><br />参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html" target="_blank">CSS </a>篇的描述<br /><strong><br />3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)</strong><br />参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html" target="_blank">CSS </a>篇的描述<br /><strong><br />4. 移除重复脚本 (Remove Duplicate Scripts)</strong><br />对于一些历史遗留站点或是论坛类的网站来说，这倒是比较常见的。接手维护人前后变化过多，每个人都有自己的一套。这就会带来一些潜在的麻烦。<br /><br /><strong>5. 减少 DOM 访问 (Minimize DOM Access)</strong><br />有三条指导建议:<br /><br />缓存已经访问过的元素 (Cache references to accessed elements) <br />&ldquo;离线&rdquo;更新节点, 再将它们添加到树中 (Update nodes &ldquo;offline&rdquo; and then add them to the tree) <br />避免使用 JavaScript 输出页面布局&ndash;应该是 CSS 的事儿 (Avoid fixing layout with JavaScript) <br /><strong>6. Develop Smart Event Handlers</strong><br />除了英文解释外，这里也提醒一下注意关于 Java Script 内存泄漏的问题。<br /> <br />Web 前端优化最佳实践第六部分面向 图片(Image)，这部分目前有 4 条规则。在最近的 Velocity 2008 技术大会上，Yahoo! 的 Stoyan Stefanov 做的 <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/2405">Image Optimization: How Many of These 7 Mistakes Are You Making </a>也非常有参考价值。结合一起说一下。<br /><br /><strong>1. 优化图片 (Optimize Images)</strong><br />使用 GIF 、JPG 还是 PNG 格式的图片? 尽可能的使用 PNG 格式的图片，更多的功能，更小的尺寸(与 GIF 相比)。<br />对于 PNG 图片，考虑用 <a href="http://pmt.sourceforge.net/pngcrush/">Pngcrush </a>或类似的工具进行优化。常见的工具如下表:<br /><blockquote><a href="http://pmt.sourceforge.net/pngcrush/" target="_blank">pngcrush </a>http://pmt.sourceforge.net/pngcrush/ <br /><a href="http://www.pobox.com/~jason1/pngrewrite/" target="_blank">pngrewrite </a>http://www.pobox.com/~jason1/pngrewrite/ <br /><a href="http://www.cs.toronto.edu/~cosmin/pngtech/optipng/" target="_blank">OptiPNG </a>http://www.cs.toronto.edu/~cosmin/pngtech/optipng/ (refer: <a href="http://linuxtoy.org/archives/optipng.html" target="_blank">教程</a>) <br /><a href="http://advsys.net/ken/utils.htm" target="_blank">PNGOut </a>http://advsys.net/ken/utils.htm <br /></blockquote>对 JPEG 图片的优化工具：<br /><a href="http://jpegclub.org/" target="_blank">jpegtran </a>(http://jpegclub.org/) <br />必需要强调的是，图片设计的同学啊，请考虑设计面向 Web 的图片，不要动不动就设计超过可接受尺寸之外大家伙，这应该是一种习惯，而不是什么高超的技能，只需要记住就成了。<br /><br />2. 使用 CSS Sprites 技巧对图片优化 (Optimize CSS Sprites)<br />之前提到过，简单的说就是&rdquo;利用 CSS background 相关元素进行背景图绝对定位&rdquo;，把多次 HTTP 调用变为一次调用，更多参考：<a href="http://alistapart.com/articles/sprites" target="_blank">CSS Sprites: Image Slicing&rsquo;s Kiss of Death</a><br />补充一下：对于这个技巧我曾经见到有人滥用的。把多个背景图片揉成一个，减少　HTTP 调用，这是一个很好的思路。但一定要记住这个大图片不能太&rdquo;重&rdquo;，我看到过 100 多K 的背景图。一个图片就把整个网站拖得很慢。比较好的例子可以参考<a href="http://cn.yimg.com/i/sns/img/ysred_1_0_6.png" target="_blank">雅虎关系的这个图</a>.<br /><br />3. 不要在 HTML 中使用缩放图片 (Don&rsquo;t Scale Images in HTML)<br />更多的时候，可能是因为偷懒而没有制作合适大小的图片，如果是批量处理图片的话，可能一条 <a href="http://www.imagemagick.org/" target="_blank">ImageMagic </a>命令（convert ）就能搞定 。必须提及的是，看到太多的对图片拉伸很难看的页面，救救这些页面!<br /><br />4. 用更小的并且可缓存的 favicon.ico (Make favicon.ico Small and Cacheable)<br />更小，可缓存，这两条可能都不是问题。问题是，太多站点根本没有 favicon.ico 。有的时候，判断独立域名的 Blog 是否专业，基本看一下是否有 favicon.ico 就差不多了。<br /><br />Web 前端优化最佳实践最后一部分是针对移动应用的，其实只是针对 iPhone 的，目前只有两条规则。<br /><br />1. 单个数据对象小于 25K (Keep Components under 25K)<br />这个似乎只是针对<a href="http://yuiblog.com/blog/2008/02/06/iphone-cacheability/" target="_blank"> iPhone 研究</a>的。建议保持单个 Web 数据对象在 25 K 以下。为什么是 25K? Apple 官方信息指出可缓存到内存中的 Web 对象最大支持到 10M，但经过测试，发现也就是 25K 左右。<br />iPhone 在市场上的优异表现，让 Web 人员不得不考虑如何针对其进行优化。相信这部分内容也在不断变化中。<br /><br />2. Pack Components into a Multipart Document<br />把Web 页面组件打包成一个多部分组成的文档。其目的是减少 HTTP 请求。对这部分语焉不详，等待后续更新吧。<br /><br/>Tags - <a href="https://www.heckjj.com/tags/%25E5%2589%258D%25E7%25AB%25AF%25E4%25BC%2598%25E5%258C%2596/" rel="tag">前端优化</a> , <a href="https://www.heckjj.com/tags/%25E7%25BD%2591%25E7%25AB%2599%25E4%25BC%2598%25E5%258C%2596/" rel="tag">网站优化</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/front-end-optimization/#blogcomment</link>
<title><![CDATA[[评论] Web前端优化总结]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/front-end-optimization/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>