整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          雅虎前端優化的35條軍規(干貨分享速速收藏)

          讀目錄

          • 內容部分
          • css部分
          • js部分
          • javascript, css
          • 圖片
          • cookie
          • 移動端
          • 服務器

          摘要:無論是在工作中,還是在面試中,web前端性能的優化都是很重要的,那么我們進行優化需要從哪些方面入手呢?可以遵循雅虎的前端優化34條軍規,不過現在已經是35條了,所以可以說是雅虎前端優化的35條軍規。已分類,挺好的,這樣對于優化有一個比較清晰的方向

          內容部分

          1.盡量減少HTTP請求數

            80%的終端用戶響應時間都花在了前端上,其中大部分時間都在下載頁面上的各種組件:圖片,樣式表,腳本,Flash等等。減少組件數必然能夠減少頁面提交的HTTP請求數。這是讓頁面更快的關鍵。

            減少頁面組件數的一種方式是簡化頁面設計。但有沒有一種方法可以在構建復雜的頁面同時加快響應時間呢?嗯,確實有魚和熊掌兼得的辦法。

            合并文件是通過把所有腳本放在一個文件中的方式來減少請求數的,當然,也可以合并所有的CSS。如果各個頁面的腳本和樣式不一樣的話,合并文件就是一項比較麻煩的工作了,但把這個作為站點發布過程的一部分確實可以提高響應時間。

            CSS Sprites是減少圖片請求數量的首選方式。把背景圖片都整合到一張圖片中,然后用CSS的background-image和background-position屬性來定位要顯示的部分。

            圖像映射可以把多張圖片合并成單張圖片,總大小是一樣的,但減少了請求數并加速了頁面加載。圖片映射只有在圖像在頁面中連續的時候才有用,比如導航條。給image map設置坐標的過程既無聊又容易出錯,用image map來做導航也不容易,所以不推薦用這種方式。

            行內圖片(Base64編碼)用data: URL模式來把圖片嵌入頁面。這樣會增加HTML文件的大小,把行內圖片放在(緩存的)樣式表中是個好辦法,而且成功避免了頁面變“重”。但目前主流瀏覽器并不能很好地支持行內圖片。

            減少頁面的HTTP請求數是個起點,這是提升站點首次訪問速度的重要指導原則。

          2.減少DNS查找

            域名系統建立了主機名和IP地址間的映射,就像電話簿上人名和號碼的映射一樣。當你在瀏覽器輸入www.yahoo.com的時候,瀏覽器就會聯系DNS解析器返回服務器的IP地址。DNS是有成本的,它需要20到120毫秒去查找給定主機名的IP地址。在DNS查找完成之前,瀏覽器無法從主機名下載任何東西。

            DNS查找被緩存起來更高效,由用戶的ISP(網絡服務提供商)或者本地網絡存在一個特殊的緩存服務器上,但還可以緩存在個人用戶的計算機上。DNS信息被保存在操作系統的DNS cache(微軟Windows上的”DNS客戶端服務”)里。大多數瀏覽器有獨立于操作系統的自己的cache。只要瀏覽器在自己的cache里還保留著這條記錄,它就不會向操作系統查詢DNS。

            IE默認緩存DNS查找30分鐘,寫在DnsCacheTimeout注冊表設置中。Firefox緩存1分鐘,可以用network.dnsCacheExpiration配置項設置。(Fasterfox把緩存時間改成了1小時 P.S. Fasterfox是FF的一個提速插件)

            如果客戶端的DNS cache是空的(包括瀏覽器的和操作系統的),DNS查找數等于頁面上不同的主機名數,包括頁面URL,圖片,腳本文件,樣式表,Flash對象等等組件中的主機名,減少不同的主機名就可以減少DNS查找。

            減少不同主機名的數量同時也減少了頁面能夠并行下載的組件數量,避免DNS查找削減了響應時間,而減少并行下載數量卻增加了響應時間。我的原則是把組件分散在2到4個主機名下,這是同時減少DNS查找和允許高并發下載的折中方案。

          3.避免重定向

          重定向用301和302狀態碼,下面是一個有301狀態碼的HTTP頭:

          HTTP/1.1 301 Moved Permanently
                Location: http://example.com/newuri
                Content-Type: text/html

            瀏覽器會自動跳轉到Location域指明的URL。重定向需要的所有信息都在HTTP頭部,而響應體一般是空的。其實額外的HTTP頭,比如Expires和Cache-Control也表示重定向。除此之外還有別的跳轉方式:refresh元標簽和JavaScript,但如果你必須得做重定向,最好用標準的3xxHTTP狀態碼,主要是為了讓返回按鈕能正常使用。

            牢記重定向會拖慢用戶體驗,在用戶和HTML文檔之間插入重定向會延遲頁面上的所有東西,頁面無法渲染,組件也無法開始下載,直到HTML文檔被送達瀏覽器。

            有一種常見的極其浪費資源的重定向,而且web開發人員一般都意識不到這一點,就是URL尾部缺少一個斜線的時候。例如,跳轉到http://astrology.yahoo.com/astrology會返回一個重定向到http://astrology.yahoo.com/astrology/的301響應(注意添在尾部的斜線)。在Apache中可以用Alias,mod_rewrite或者DirectorySlash指令來取消不必要的重定向。

            重定向最常見的用途是把舊站點連接到新的站點,還可以連接同一站點的不同部分,針對用戶的不同情況(瀏覽器類型,用戶帳號類型等等)做一些處理。用重定向來連接兩個網站是最簡單的,只需要少量的額外代碼。雖然在這些時候使用重定向減少了開發人員的開發復雜度,但降低了用戶體驗。一種替代方案是用Alias和mod_rewrite,前提是兩個代碼路徑都在相同的服務器上。如果是因為域名變化而使用了重定向,就可以創建一條CNAME(創建一個指向另一個域名的DNS記錄作為別名)結合Alias或者mod_rewrite指令。

          4.讓Ajax可緩存

            Ajax的一個好處是可以給用戶提供即時反饋,因為它能夠從后臺服務器異步請求信息。然而,用了Ajax就無法保證用戶在等待異步JavaScript和XML響應返回期間不會非常無聊。在很多應用程序中,用戶能夠一直等待取決于如何使用Ajax。例如,在基于web的電子郵件客戶端中,用戶為了尋找符合他們搜索標準的郵件消息,將會保持對Ajax請求返回結果的關注。重要的是,要記得“異步”并不意味著“即時”。

            要提高性能,優化這些Ajax響應至關重要。最重要的提高Ajax性能的方法就是讓響應變得可緩存,就像在添上Expires或者Cache-Control HTTP頭中討論的一樣。下面適用于Ajax的其它規則:

          • Gzip組件
          • 減少DNS查找
          • 壓縮JavaScript
          • 避免重定向
          • 配置ETags

            我們一起看看例子,一個Web 2.0的電子郵件客戶端用了Ajax來下載用戶的通訊錄,以便實現自動完成功能。如果用戶從上一次使用之后再沒有修改過她的通訊錄,而且Ajax響應是可緩存的,有尚未過期的Expires或者Cache-Control HTTP頭,那么之前的通訊錄就可以從緩存中讀出。必須通知瀏覽器,應該繼續使用之前緩存的通訊錄響應,還是去請求一個新的。可以通過給通訊錄的Ajax URL里添加一個表明用戶通訊錄最后修改時間的時間戳來實現,例如&t=1190241612。如果通訊錄從上一次下載之后再沒有被修改過,時間戳不變,通訊錄就將從瀏覽器緩存中直接讀出,從而避免一次額外的HTTP往返消耗。如果用戶已經修改了通訊錄,時間戳也可以確保新的URL不會匹配緩存的響應,瀏覽器將請求新的通訊錄條目。

            即使Ajax響應是動態創建的,而且可能只適用于單用戶,它們也可以被緩存,而這樣會讓你的Web 2.0應用更快。

          5.延遲加載組件

            可以湊近看看頁面并問自己:什么才是一開始渲染頁面所必須的?其余內容都可以等會兒。

            JavaScript是分隔onload事件之前和之后的一個理想選擇。例如,如果有JavaScript代碼和支持拖放以及動畫的庫,這些都可以先等會兒,因為拖放元素是在頁面最初渲染之后的。其它可以延遲加載的部分包括隱藏內容(在某個交互動作之后才出現的內容)和折疊的圖片。

            工具可幫你減輕工作量:YUI Image Loader可以延遲加載折疊的圖片,還有YUI Get utility是一種引入JS和CSS的簡單方法。Yahoo!主頁就是一個例子,可以打開Firebug的網絡面板仔細看看。

            最好讓性能目標符合其它web開發最佳實踐,比如“漸進增強”。如果客戶端支持JavaScript,可以提高用戶體驗,但必須確保頁面在不支持JavaScript時也能正常工作。所以,在確定頁面運行正常之后,可以用一些延遲加載腳本增強它,以支持一些拖放和動畫之類的華麗效果。

          6.預加載組件

            預加載可能看起來和延遲加載是相反的,但它其實有不同的目標。通過預加載組件可以充分利用瀏覽器空閑的時間來請求將來會用到的組件(圖片,樣式和腳本)。用戶訪問下一頁的時候,大部分組件都已經在緩存里了,所以在用戶看來頁面會加載得更快。

          實際應用中有以下幾種預加載的類型:

          • 無條件預加載——盡快開始加載,獲取一些額外的組件。google.com就是一個sprite圖片預加載的好例子,這個sprite圖片并不是google.com主頁需要的,而是搜索結果頁面上的內容。
          • 條件性預加載——根據用戶操作猜測用戶將要跳轉到哪里并據此預加載。在search.yahoo.com的輸入框里鍵入內容后,可以看到那些額外組件是怎樣請求加載的。
          • 提前預加載——在推出新設計之前預加載。經常在重新設計之后會聽到:“這個新網站不錯,但比以前更慢了”,一部分原因是用戶訪問先前的頁面都是有舊緩存的,但新的卻是一種空緩存狀態下的體驗??梢酝ㄟ^在將要推出新設計之前預加載一些組件來減輕這種負面影響,老站可以利用瀏覽器空閑的時間來請求那些新站需要的圖片和腳本。

          7.減少DOM元素的數量

            一個復雜的頁面意味著要下載更多的字節,而且用JavaScript訪問DOM也會更慢。舉個例子,想要添加一個事件處理器的時候,循環遍歷頁面上的500個DOM元素和5000個DOM元素是有區別的。

            大量的DOM元素是一種征兆——頁面上有些內容無關的標記需要清理。正在用嵌套表格來布局嗎?還是為了修復布局問題而添了一堆的<div>s?或許應該用更好的語義化標記。

          YUI CSS utilities對布局有很大幫助:grids.css針對整體布局,fonts.css和reset.css可以用來去除瀏覽器的默認格式。這是個開始清理和思考標記的好機會,例如只在語義上有意義的時候使用<div>,而不是因為它能夠渲染一個新行。

            DOM元素的數量很容易測試,只需要在Firebug的控制臺里輸入:


          document.getElementsByTagName('*').length

            那么多少DOM元素才算是太多呢?可以參考其它類似的標記良好的頁面,例如Yahoo!主頁是一個相當繁忙的頁面,但只有不到700個元素(HTML標簽)。

          8.跨域分離組件

            分離組件可以最大化并行下載,但要確保只用不超過2-4個域,因為存在DNS查找的代價。例如,可以把HTML和動態內容部署在www.example.org,而把靜態組件分離到static1.example.org和static2.example.org。

          9.盡量少用iframe

            用iframe可以把一個HTML文檔插入到父文檔里,重要的是明白iframe是如何工作的并高效地使用它。

          <iframe>的優點:

          • 引入緩慢的第三方內容,比如標志和廣告
          • 安全沙箱
          • 并行下載腳本

          <iframe>的缺點:

          • 代價高昂,即使是空白的iframe
          • 阻塞頁面加載
          • 非語義

          10.杜絕404

            HTTP請求代價高昂,完全沒有必要用一個HTTP請求去獲取一個無用的響應(比如404 Not Found),只會拖慢用戶體驗而沒有任何好處。

            有些站點用的是有幫助的404——“你的意思是xxx?”,這樣做有利于用戶體驗,,但也浪費了服務器資源(比如數據庫等等)。最糟糕的是鏈接到的外部JavaScript有錯誤而且結果是404。首先,這種下載將阻塞并行下載。其次,瀏覽器會試圖解析404響應體,因為它是JavaScript代碼,需要找出其中可用的部分。

          css部分

          11.避免使用CSS表達式

          用CSS表達式動態設置CSS屬性,是一種強大又危險的方式。從IE5開始支持,但從IE8起就不推薦使用了。例如,可以用CSS表達式把背景顏色設置成按小時交替的:

          1

          background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

          12.選擇<link>舍棄@import

            前面提到了一個最佳實踐:為了實現逐步渲染,CSS應該放在頂部。

          在IE中用@import與在底部用<link>效果一樣,所以最好不要用它。

          13.避免使用濾鏡

            IE專有的AlphaImageLoader濾鏡可以用來修復IE7之前的版本中半透明PNG圖片的問題。在圖片加載過程中,這個濾鏡會阻塞渲染,卡住瀏覽器,還會增加內存消耗而且是被應用到每個元素的,而不是每個圖片,所以會存在一大堆問題。

          最好的方法是干脆不要用AlphaImageLoader,而優雅地降級到用在IE中支持性很好的PNG8圖片來代替。如果非要用AlphaImageLoader,應該用下劃線hack:_filter來避免影響IE7及更高版本的用戶。

          14.把樣式表放在頂部

            在Yahoo!研究性能的時候,我們發現把樣式表放到文檔的HEAD部分能讓頁面看起來加載地更快。這是因為把樣式表放在head里能讓頁面逐步渲染。

            關注性能的前端工程師想讓頁面逐步渲染。也就是說,我們想讓瀏覽器盡快顯示已有內容,這在頁面上有一大堆內容或者用戶網速很慢時顯得尤為重要。給用戶顯示反饋(比如進度指標)的重要性已經被廣泛研究過,并且被記錄下來了。在我們的例子中,HTML頁面就是進度指標!當瀏覽器逐漸加載頁面頭部,導航條,頂部logo等等內容的時候,這些都被正在等待頁面加載的用戶當作反饋,能夠提高整體用戶體驗。

          js部分

          15.去除重復腳本

            頁面含有重復的腳本文件會影響性能,這可能和你想象的不一樣。在對美國前10大web站點的評審中,發現只有2個站點含有重復腳本。兩個主要原因增加了在單一頁面中出現重復腳本的幾率:團隊大小和腳本數量。在這種情況下,重復腳本會創建不必要的HTTP請求,執行無用的JavaScript代碼,而影響頁面性能。

            IE會產生不必要的HTTP請求,而Firefox不會。在IE中,如果一個不可緩存的外部腳本被頁面引入了兩次,它會在頁面加載時產生兩個HTTP請求。即使腳本是可緩存的,在用戶重新加載頁面時也會產生額外的HTTP請求。

            除了產生沒有意義的HTTP請求之外,多次對腳本求值也會浪費時間。因為無論腳本是否可緩存,在Firefox和IE中都會執行冗余的JavaScript代碼。

            避免不小心把相同腳本引入兩次的一種方法就是在模版系統中實現腳本管理模塊。典型的腳本引入方法就是在HTML頁面中用SCRIPT標簽:

          1

          <script type="text/javascript" src="menu_1.0.17.js"></script>

          16.盡量減少DOM訪問

          用JavaScript訪問DOM元素是很慢的,所以,為了讓頁面反應更迅速,應該:

          • 緩存已訪問過的元素的索引
          • 先“離線”更新節點,再把它們添到DOM樹上
          • 避免用JavaScript修復布局問題

          17.用智能的事件處理器

            有時候感覺頁面反映不夠靈敏,是因為有太多頻繁執行的事件處理器被添加到了DOM樹的不同元素上,這就是推薦使用事件委托的原因。如果一個div里面有10個按鈕,應該只給div容器添加一個事件處理器,而不是給每個按鈕都添加一個。事件能夠冒泡,所以可以捕獲事件并得知哪個按鈕是事件源。

          18.把腳本放在底部

            腳本會阻塞并行下載,HTTP/1.1官方文檔建議瀏覽器每個主機名下并行下載的組件數不要超過兩個,如果圖片來自多個主機名,并行下載的數量就可以超過兩個。如果腳本正在下載,瀏覽器就不開始任何其它下載任務,即使是在不同主機名下的。

            有時候,并不容易把腳本移動到底部。舉個例子,如果腳本是用document.write插入到頁面內容中的,就沒辦法再往下移了。還可能存在作用域問題,在多數情況下,這些問題都是可以解決的。

            一個常見的建議是用推遲(deferred)腳本,有DEFER屬性的腳本意味著不能含有document.write,并且提示瀏覽器告訴他們可以繼續渲染。不幸的是,Firefox不支持DEFER屬性。在IE中,腳本可能被推遲,但不盡如人意。如果腳本可以推遲,我們就可以把它放到頁面底部,頁面就可以更快地載入。


          javascript, css

          19.把JavaScript和CSS放到外面

            很多性能原則都是關于如何管理外部組件的,然而,在這些顧慮出現之前你應該問一個更基礎的問題:應該把JavaScript和CSS放到外部文件中還是直接寫在頁面里?

          實際上,用外部文件可以讓頁面更快,因為JavaScript和CSS文件會被緩存在瀏覽器。HTML文檔中的行內JavaScript和CSS在每次請求該HTML文檔的時候都會重新下載。這樣做減少了所需的HTTP請求數,但增加了HTML文檔的大小。另一方面,如果JavaScript和CSS在外部文件中,并且已經被瀏覽器緩存起來了,那么我們就成功地把HTML文檔變小了,而且還沒有增加HTTP請求數。

            

          20.壓縮JavaScript和CSS

            壓縮具體來說就是從代碼中去除不必要的字符以減少大小,從而提升加載速度。代碼最小化就是去掉所有注釋和不必要的空白字符(空格,換行和tab)。在JavaScript中這樣做能夠提高響應性能,因為要下載的文件變小了。兩個最常用的JavaScript代碼壓縮工具是JSMin和YUI Compressor,YUI compressor還可以壓縮CSS。

            混淆是一種可選的源碼優化措施,要比壓縮更復雜,所以混淆過程也更容易產生bug。在對美國前十的網站調查中,壓縮可以縮小21%,而混淆能縮小25%。雖然混淆的縮小程度更高,但比壓縮風險更大。

            除了壓縮外部腳本和樣式,行內的<script>和<style>塊也可以壓縮。即使啟用了gzip模塊,先進行壓縮也能夠縮小5%或者更多的大小。JavaScript和CSS的用處越來越多,所以壓縮代碼會有不錯的效果。

          圖片

          21.優化圖片

          • 嘗試把GIF格式轉換成PNG格式,看看是否節省空間。在所有的PNG圖片上運行pngcrush(或者其它PNG優化工具)

          22.優化CSS Sprite

          • 在Sprite圖片中橫向排列一般都比縱向排列的最終文件小
          • 組合Sprite圖片中的相似顏色可以保持低色數,最理想的是256色以下PNG8格式
          • “對移動端友好”,不要在Sprite圖片中留下太大的空隙。雖然不會在很大程度上影響圖片文件的大小,但這樣做可以節省用戶代理把圖片解壓成像素映射時消耗的內存。100×100的圖片是1萬個像素,而1000×1000的圖片就是100萬個像素了。

          23.不要用HTML縮放圖片

            不要因為在HTML中可以設置寬高而使用本不需要的大圖。如果需要


          1

          <img width="100" height="100" src="mycat.jpg" alt="My Cat" />

            那么圖片本身(mycat.jpg)應該是100x100px的,而不是去縮小500x500px的圖片。

          24.用小的可緩存的favicon.ico(P.S. 收藏夾圖標)

            favicon.ico是放在服務器根目錄的圖片,它會帶來一堆麻煩,因為即便你不管它,瀏覽器也會自動請求它,所以最好不要給一個404 Not Found響應。而且只要在同一個服務器上,每次請求它時都會發送cookie,此外這個圖片還會干擾下載順序,例如在IE中,當你在onload中請求額外組件時,將會先下載favicon。

          所以為了緩解favicon.ico的缺點,應該確保:

          • 足夠小,最好在1K以下
          • 設置合適的有效期HTTP頭(以后如果想換的話就不能重命名了),把有效期設置為幾個月后一般比較安全,可以通過檢查當前favicon.ico的最后修改日期來確保變更能讓瀏覽器知道。


          cookie

          25.給Cookie減肥

            使用cookie的原因有很多,比如授權和個性化。HTTP頭中cookie信息在web服務器和瀏覽器之間交換。重要的是保證cookie盡可能的小,以最小化對用戶響應時間的影響。

          • 清除不必要的cookie
          • 保證cookie盡可能小,以最小化對用戶響應時間的影響
          • 注意給cookie設置合適的域級別,以免影響其它子域
          • 設置合適的有效期,更早的有效期或者none可以更快的刪除cookie,提高用戶響應時間

          26.把組件放在不含cookie的域下

            當瀏覽器發送對靜態圖像的請求時,cookie也會一起發送,而服務器根本不需要這些cookie。所以它們只會造成沒有意義的網絡通信量,應該確保對靜態組件的請求不含cookie??梢詣摻ㄒ粋€子域,把所有的靜態組件都部署在那兒。

            如果域名是www.example.org,可以把靜態組件部署到static.example.org。然而,如果已經在頂級域example.org或者www.example.org設置了cookie,那么所有對static.example.org的請求都會含有這些cookie。這時候可以再買一個新域名,把所有的靜態組件部署上去,并保持這個新域名不含cookie。Yahoo!用的是yimg.com,YouTube是ytimg.com,Amazon是images-amazon.com等等。

            把靜態組件部署在不含cookie的域下還有一個好處是有些代理可能會拒絕緩存帶cookie的組件。有一點需要注意:如果不知道應該用example.org還是www.example.org作為主頁,可以考慮一下cookie的影響。省略www的話,就只能把cookie寫到*.example.org,所以因為性能原因最好用www子域,并且把cookie寫到這個子域下。

          移動端

          27.保證所有組件都小于25K

            這個限制是因為iPhone不能緩存大于25K的組件,注意這里指的是未壓縮的大小。這就是為什么縮減內容本身也很重要,因為單純的gzip可能不夠。

          28.把組件打包到一個復合文檔里

            把各個組件打包成一個像有附件的電子郵件一樣的復合文檔里,可以用一個HTTP請求獲取多個組件(記住一點:HTTP請求是代價高昂的)。用這種方式的時候,要先檢查用戶代理是否支持(iPhone就不支持)。

          服務器

          29.Gzip組件

            前端工程師可以想辦法明顯地縮短通過網絡傳輸HTTP請求和響應的時間。毫無疑問,終端用戶的帶寬速度,網絡服務商,對等交換點的距離等等,都是開發團隊所無法控制的。但還有別的能夠影響響應時間的因素,壓縮可以通過減少HTTP響應的大小來縮短響應時間。

          從HTTP/1.1開始,web客戶端就有了支持壓縮的Accept-Encoding HTTP請求頭。

          1

          Accept-Encoding: gzip, deflate

            如果web服務器看到這個請求頭,它就會用客戶端列出的一種方式來壓縮響應。web服務器通過Content-Encoding相應頭來通知客戶端。

          1

          Content-Encoding: gzip

            盡可能多地用gzip壓縮能夠給頁面減肥,這也是提升用戶體驗最簡單的方法。


          30.避免圖片src屬性為空

          Image with empty string src屬性是空字符串的圖片很常見,主要以兩種形式出現:

          1. straight HTML
            <img src=””>
          2. JavaScript
            var img = new Image();
            img.src = “”;

          這兩種形式都會引起相同的問題:瀏覽器會向服務器發送另一個請求。

           

          31.配置ETags

            實體標簽(ETags),是服務器和瀏覽器用來決定瀏覽器緩存中組件與源服務器中的組件是否匹配的一種機制(“實體”也就是組件:圖片,腳本,樣式表等等)。添加ETags可以提供一種實體驗證機制,比最后修改日期更加靈活。一個ETag是一個字符串,作為一個組件某一具體版本的唯一標識符。唯一的格式約束是字符串必須用引號括起來,源服務器用相應頭中的ETag來指定組件的ETag:

          1

          2

          3

          4

          HTTP/1.1 200 OK

          Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT

          ETag: "10c24bc-4ab-457e1c1f"

          Content-Length: 12195

            然后,如果瀏覽器必須驗證一個組件,它用If-None-Match請求頭來把ETag傳回源服務器。如果ETags匹配成功,會返回一個304狀態碼,這樣就減少了12195個字節的響應體。

          GET /i/yahoo.gif HTTP/1.1
                Host: us.yimg.com
                If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
                If-None-Match: "10c24bc-4ab-457e1c1f"
                HTTP/1.1 304 Not Modified

           

          32.對Ajax用GET請求

            Yahoo!郵箱團隊發現使用XMLHttpRequest時,瀏覽器的POST請求是通過一個兩步的過程來實現的:先發送HTTP頭,在發送數據。所以最好用GET請求,它只需要發送一個TCP報文(除非cookie特別多)。IE的URL長度最大值是2K,所以如果要發送的數據超過2K就無法使用GET了。

          POST請求的一個有趣的副作用是實際上沒有發送任何數據,就像GET請求一樣。正如HTTP說明文檔中描述的,GET請求是用來檢索信息的。所以它的語義只是用GET請求來請求數據,而不是用來發送需要存儲到服務器的數據。


          33.盡早清空緩沖區

           當用戶請求一個頁面時,服務器需要用大約200到500毫秒來組裝HTML頁面,在這期間,瀏覽器閑等著數據到達。PHP中有一個flush()函數,允許給瀏覽器發送一部分已經準備完畢的HTML響應,以便瀏覽器可以在后臺準備剩余部分的同時開始獲取組件,好處主要體現在很忙的后臺或者很“輕”的前端頁面上(P.S. 也就是說,響應時耗主要在后臺方面時最能體現優勢)。

            較理想的清空緩沖區的位置是HEAD后面,因為HTML的HEAD部分通常更容易生成,并且允許引入任何CSS和JavaScript文件,這樣就可以讓瀏覽器在后臺還在處理的時候就開始并行獲取組件。

          例如:

           ... <!-- css, js -->
              </head>
              <?php flush(); ?>
              <body>
                ... <!-- content -->

          34.使用CDN(內容分發網絡

            用戶與服務器的物理距離對響應時間也有影響。把內容部署在多個地理位置分散的服務器上能讓用戶更快地載入頁面。但具體要怎么做呢?

            實現內容在地理位置上分散的第一步是:不要嘗試去重新設計你的web應用程序來適應分布式結構。這取決于應用程序,改變結構可能包括一些讓人望而生畏的任務,比如同步會話狀態和跨服務器復制數據庫事務(翻譯可能不準確)。縮短用戶和內容之間距離的提議可能被推遲,或者根本不可能通過,就是因為這個難題。

            記住終端用戶80%到90%的響應時間都花在下載頁面組件上了:圖片,樣式,腳本,Flash等等,這是業績黃金法則。最好先分散靜態內容,而不是一開始就重新設計應用程序結構。這不僅能夠大大減少響應時間,還更容易表現出CDN的功勞。

            內容分發網絡(CDN)是一組分散在不同地理位置的web服務器,用來給用戶更高效地發送內容。典型地,選擇用來發送內容的服務器是基于網絡距離的衡量標準的。例如:選跳數(hop)最少的或者響應時間最快的服務器。

          35.添上Expires或者Cache-Control HTTP頭

          這條規則有兩個方面:

          • 對于靜態組件:通過設置一個遙遠的將來時間作為Expires來實現永不失效
          • 多余動態組件:用合適的Cache-ControlHTTP頭來讓瀏覽器進行條件性的請求

            網頁設計越來越豐富,這意味著頁面里有更多的腳本,圖片和Flash。站點的新訪客可能還是不得不提交幾個HTTP請求,但通過使用有效期能讓組件變得可緩存,這避免了在接下來的瀏覽過程中不必要的HTTP請求。有效期HTTP頭通常被用在圖片上,但它們應該用在所有組件上,包括腳本、樣式和Flash組件。

            瀏覽器(和代理)用緩存來減少HTTP請求的數目和大小,讓頁面能夠更快加載。web服務器通過有效期HTTP響應頭來告訴客戶端,頁面的各個組件應該被緩存多久。用一個遙遠的將來時間做有效期,告訴瀏覽器這個響應在2010年4月15日前不會改變。

          1

          Expires: Thu, 15 Apr 2010 20:00:00 GMT

            

          如果你用的是Apache服務器,用ExpiresDefault指令來設置相對于當前日期的有效期。下面的例子設置了從請求時間起10年的有效期:

          ExpiresDefault "access plus 10 years"

          ---------------轉自咸魚老弟

          HTML文件中,有些標簽會被經常用到,可能有人覺得太基礎,就不認真對待,但是我可以負責任的告訴你,越基礎的往往越重要。這次重點學一學標題、段落和鏈接等基礎標簽。

          為了不重復粘貼HTML代碼,咱們來個約定,除了第一次出現完整的HTML文件的頁面結構之外,之后只現新增的標簽內容,你自己將新的內容,添加到HTML文件中,進行效果驗證。

          <!DOCTYPE html>
          <html>
          <head>
              <meta charset="UTF-8">
              <title>第3個HTML文件</title>
          </head>
          <body>
          <!--這是一個完整的HTML頁面結構,常用標簽放在這個注釋后面即可-->
          </body>
          </html>

          3.1 標題<h1>~

          在HTML中,標題從一級到六級,對應標簽為<h1>到<h6>,字體逐步變小。屬性為align(對齊方式),屬性值為left(左對齊,默認)、right(右對齊)和center(居中對齊)。

          <h1 align="center">一級標題</h1>
          <h2 align="center">二級標題</h2>
          <h3>三級標題</h3>
          <h4 align="left">四級標題</h4>
          <h5 align="right">五級標題</h5>
          <h6 align="right">六級標題</h6>

          輸出結果


          3.2 段落<p>

          <p> 標簽定義段落。瀏覽器解析到<p>標簽時,會自動在其前后創建一些空白。<p>標簽的屬性也是align。其實為了HTML文件統一布局,很少會用align來指定位置,大多數是用CSS統一指定。

          <p>老陳說編程,除了說編程,</p>
          <p>還有程序員的愛情與友情,</p>
          <p>那是不可能的。</p>

          輸出結果


          3.3 水平線和換行

          在網頁發的文字多時,好多人習慣性會使用分割線。在HTML,用<hr/>單標簽就可以實現分割線。而換行,則用<br/>標簽。<hr>標簽屬性有表示位置的align、高度的的size和寬度width三個屬性,其中size和width的單位是像素,但如果用到這些屬性的話,推薦用CSS。

          <hr size="1"/>
          小舅子要結婚了,丈母娘跟我借了10萬塊錢做彩禮,結果婚事談崩了。<br/>
          今天公司急用錢,我向丈母娘要那10萬塊錢。<br/>
          丈母娘說:借你這10萬塊錢是干啥用的?<br/>
          我說:給小舅子結婚用啊!<br/>
          丈母娘說:那婚結成了嗎?<br/>
          我說:沒結成。<br/>
          丈母娘大聲罵道:婚都沒結成你還有臉來要錢!<br/>
          突然感覺丈母娘這話說的沒什么毛病啊!
          <hr size="1"/>

          輸出結果

          3.4 列表<ul>和<ol>

          無序列表<ul>標簽,可用粗體圓點標記一個項目的列表;有序列表<ol>標簽使用數字進行標記,而列表項用<li>標簽實現。有關列表的屬性,不是被H5拋棄,就是不被推薦,所以......。

          <p>
              程序員最喜歡做的三件事
          <ul>
              <li>編程</li>
              <li>開發</li>
              <li>敲代碼</li>
          </ul>
          程序員最喜歡的三個美女
          <ol>
              <li>潘金蓮</li>
              <li>楊貴妃</li>
              <li>楊八妹</li>
          </ol>
          </p>

          輸出結果

          3.5 超鏈接<a>

          <a>標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。最重要的屬性是 href和target, href指定鏈接的目標(網頁地址),target指定打開窗口的模式,_blank:打開新窗口,_parent:在父窗口中打開,_self:默認,當前頁面跳轉,_top:在當前窗體打開鏈接,并替換當前的整個窗體。

          在沒點擊鏈接之前,你先看一下鏈接內容的字體顏色,點擊鏈接之后,你再看一下,你就會發現,鏈接內容的顏色會有所變化。

          (1) 未被訪問的鏈接帶有下劃線而且是藍色的;

          (2) 已被訪問的鏈接帶有下劃線而且是紫色的;

          (3) 活動鏈接帶有下劃線而且是紅色的。

          <a href="demo1.html">去到老陳說HTML的第1個Demo中</a>

          輸出結果


          好了,有關html基礎標簽的內容,老陳講完了,如果覺得對你有所幫助,希望老鐵能轉發點贊,讓更多的人看到這篇文章。你的轉發和點贊,就是對老陳繼續創作和分享最大的鼓勵。

          一個當了10年技術總監的老家伙,分享多年的編程經驗。想學編程的朋友,可關注:老陳說編程。分享Python,前端(小程序)、App和嵌入式方面的干貨。關注我,沒錯的。

          #前端##HTML##程序員##編程##CSS#

          端網頁的開發中總是不可避免會使用到超鏈接,但是使用超鏈接時下面都會有一條下劃線,這在網頁中有時會顯得很突兀,不合適也不美觀,所以我們就需要將超鏈接下的這條下劃線給去掉.接下來給大家介紹Html下超鏈接去掉下劃線的方

          您可以使用CSS的text-decoration屬性來去掉超鏈接下劃線。只需將其設置為none即可,示例代碼如下:

          a{

          text-decoration: none;

          }

          這會將頁面中所有超錐接下劃線都去,如果您只想去掉某些超鏈接的下劃線,可以為這些鏈接添加一個特定的class,并針對該CIass設置上述CSS屬性。

          例子:

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title>css超鏈接去掉下劃線示例</title>

          <style>

          a{

          text-decoration: none;

          }

          </style>

          </head>

          <body>

          <a href="">大家再看我還有沒有下劃線了!</a>

          </body>

          </html>

          可以發現,此時文本超鏈接下劃線是不是已經去掉了?這個效果實現是不是非常簡單呢?大家主要掌握一個樣式屬性就是text-decoration: none;這個屬性。給對應的a標簽文本添加這個屬性就可以去除文本超鏈接下劃線了。


          擴展資料:

          HTML 超鏈接(鏈接)的屬性:

          超鏈接可以是一個字,一個詞,或者一組詞,也可以是一幅圖像,您可以點擊這些內容來跳轉到新的文檔或者當前文檔中的某個部分。

          當您把鼠標指針移動到網頁中的某個鏈接上時,箭頭會變為一只小手。

          我們通過使用 標簽在 HTML 中創建鏈接。

          有兩種使用 標簽的方式:

          1、通過使用 href 屬性 - 創建指向另一個文檔的鏈接;

          2、通過使用 name 屬性 - 創建文檔內的書簽。


          主站蜘蛛池模板: 国产一区麻豆剧传媒果冻精品| 在线|一区二区三区| 亚洲一区二区三区深夜天堂| 亚洲国产精品一区二区第一页| 亚洲一区二区三区乱码A| 国产一区二区三区高清视频| 亚洲色无码一区二区三区| 亚洲AV无码一区二区二三区软件| 亚洲AV无一区二区三区久久| 亚洲一区在线观看视频| 精品国产AV无码一区二区三区| 亚洲一区二区三区乱码A| 麻豆AV一区二区三区久久| 久久一区二区三区精华液使用方法 | 天堂Aⅴ无码一区二区三区| 成人精品一区二区户外勾搭野战| 国产人妖视频一区在线观看| 国产精品区一区二区三在线播放 | 无码人妻av一区二区三区蜜臀| 丰满人妻一区二区三区免费视频| 亚洲国产情侣一区二区三区| 日本精品一区二区三区在线视频| 熟女少妇丰满一区二区| 日韩有码一区二区| 日韩成人一区ftp在线播放| 久热国产精品视频一区二区三区| 波多野结衣AV无码久久一区| 精品视频一区二区观看| 亚洲色精品三区二区一区| 91香蕉福利一区二区三区| 无码少妇一区二区三区浪潮AV | 麻豆一区二区三区精品视频| 中文字幕日本一区| 一区二区三区免费视频观看| 国产91精品一区| 一区二区三区在线观看中文字幕| 日韩精品一区二区三区老鸦窝| 亚洲AV无码一区二区乱子仑 | 多人伦精品一区二区三区视频| 欧美av色香蕉一区二区蜜桃小说 | 国产成人精品一区二区A片带套|