日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在你的 Rails App 中开启 ETag 加速页面载入同时节省资源

發布時間:2025/7/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在你的 Rails App 中开启 ETag 加速页面载入同时节省资源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自http://huacnlee.com/blog/use-etag-in-your-rails-app-to-speed-up-loading/

?

什么是 ETag

網上關于 ETag 的解釋有很多,我這里簡單的說明一下我的理解:

ETag 是 HTTP 協議的標準參數,一般是這樣的:”686897696a7c876b7e” 一段字符,它能通過一段字符來判斷瀏覽器 cache 的內容是否和服務端返回的內容是否相同,從而來決定是否要重新從服務器下載東西 (HTTP 狀態 200 - 重新下載 / 304 - 沒有更新)。

ETag 使用場景舉例

這個東西非常適合用于動態內容上面,以減少不必要的 HTML 下載,達到加速的目的。

比如下面這個場景的例子:

  • 用戶訪問 /topics/11 頁面,TopicsController#show 加載 @topic,并通過 View 生成內容返回
  • 用戶來回訪問 10 次 /topics/11,可此頁面內容無任何變化
  • 過了1天以后,@topic 有了新的回復,用戶再次訪問的時候,內容變了
  • 上面的場景用戶一共訪問了 12 次 /topics/11 這個頁面,但只有第一次和最后一次才有實質性的內容需要下載的,可在沒有 ETag 的情況下面,服務器執行和瀏覽器下載都是有 12 次,其中的 10 次是多余的。

    如果加上 ETag 以后,將會是這樣:

  • 用戶訪問 /topics/11 頁面,TopicsController#show 加載 @topic,并通過 View 生成內容返回,并給出目前內容的 ETag: 89vbsn28716
  • 用戶帶著 ETag: 89vbsn28716 再次訪問 /topics/11 ,服務器檢查 ETag 與執行結果,發現無變化,返回 304,瀏覽器直接使用 Cache 的內容渲染頁面
  • 過了一天以后,@topic 有了新回復,用戶再次帶著 ETag: 89vbsn28716 /topics/11,服務器檢查 ETag 發現不對了,生成新內容,并返回 200
  • 這個過程中,服務端執行了 12 次頁面,而下載 HTML 內容到本地卻只有兩次。

    Rails 里面開啟 ETag

    Rails 的 ActionController 里面已經為我們提供了 fresh_when 和 stale? 這兩個方法用于處理 ETag,可以點擊連接稍微看一下說明。

    我下面以 Ruby China 的 查看 Wiki 頁面 為例子演示如何在 Rails 里面合理的使用 ETag

    pages_controller.rb:

    1 2 3 4 5 6 7 class PagesController < ApplicationController def show @page = Page.find_by_slug(params[:id]) @comments = @page.comments.paginate(:page => params[:page], :per_page => 50) fresh_when(:etag => [@page, @comments]) end end

    加上 fresh_when 方法以后,Rails 將會用 @page 和 @comments 內容的組合的 MD5 hash 值作為 ETag 并與 HTTP Headers 里面的 ETag 進行比較來決定是否需要執行后面的 Views 渲染,并返回 200 或 304。

    在瀏覽器上面顯示將會是這樣:

    沒有 ETag 的情況 (72 ms):

    有 ETag 的情況 (40 ms):

    OMG! 頁面加載速度直接提升了 46%,并且 ETag 命中的情況下,Views 上面的一系列代碼都不用執行了,節省了不少資源。

    但是實際的場景,往往沒有上面這個例子這么簡單……

    比如,頁面上有 current_user 的狀態,頁腳的 HTML 代碼是通過 Setting.footer_html 出來的,Head 里面還有 Setting.custom_heads 出來的代碼。

    以上這些東西都是需要影響頁面更新的。

    實際上我們只需要將 fresh_when 方法在 ApplicationController 里面覆蓋一下,把頁面上需要調用而影響結果的東西加入到 fresh_when 的 :etag 參數里面就好了:

    application_controller.rb:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def fresh_when(opts = {}) opts[:etag] ||= [] # 保證 etag 參數是 Array 類型 opts[:etag] = [opts[:etag]] if !opts[:etag].is_a?(Array) # 加入頁面上直接調用的信息用于組合 etag opts[:etag] << current_user # Config 的某些信息 opts[:etag] << SiteConfig.app_name opts[:etag] << SiteConfig.custom_head_html opts[:etag] << SiteConfig.footer_html opts[:etag] << SiteConfig.google_analytics_key # 所有 etag 保持一天 opts[:etag] << Date.current super(opts) end

    這樣一來,每個用戶的 ETag 都是不同的,當用戶登出和登錄以后,頁面的內容將會呈現不同的 ETag,同時當你修改 SiteConfig 的某些內容是,ETag 也會隨著改變,這樣一來 ETag 的引入就不會影響到頁面更新了。

    實際上你可以大量的使用 fresh_when 方法在你的動態頁面上面,來減少 Rails View 的執行與 HTML 下載,只要好好分析,將頁面上需要的內容加入到 :etag 參數里面就好了。

    比如:

    1 2 3 4 5 6 7 def index @hot_topics = Topic.hot.limit(10) @hot_users = User.hot.limit(10) @hot_nodes = Node.hot.limit(10) @recent_topics = Topic.recent.limit(10) fresh_when(:etag => [@hot_topics,@hot_users,@hot_nodes,@recent_topics]) end

    轉載于:https://www.cnblogs.com/wangyuyu/p/3545978.html

    總結

    以上是生活随笔為你收集整理的在你的 Rails App 中开启 ETag 加速页面载入同时节省资源的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 中国a一片一级一片 | 亚洲人一区二区三区 | 日韩在线观看免费高清 | 日本大乳美女 | 亚洲精品久久夜色撩人男男小说 | 丝袜黄色片 | 女人下部全棵看视频 | 国产无遮挡免费视频 | 三级黄色在线视频 | 日韩中文欧美 | 亚洲综合色成人 | 污污的视频在线免费观看 | 国产黄色大片视频 | 久久久www成人免费毛片 | 成人两性视频 | 日本韩国欧美中文字幕 | 久久国产激情 | 日韩av一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 亚洲欧洲av | 麻豆污视频 | 91丝袜一区二区三区 | 天天躁日日躁bbbbb | 亚洲av无码一区二区乱子伦as | 中文字幕一区二区三区门四区五区 | 亚洲最大网 | 久久爱一区 | 国产成人一区二区三区影院在线 | 国产精品国产三级国产在线观看 | 亚洲蜜臀av乱码久久精品蜜桃 | 麻豆av剧情 | 夜夜操影院| 亚洲一级电影 | 成人手机视频在线观看 | 国产精品女人精品久久久天天 | 午夜精品久久久久久久久久久久久蜜桃 | 69亚洲精品久久久蜜桃小说 | 太久av| 黄色a级片网站 | 91色爱 | 天天爽夜夜爽夜夜爽精品 | 亚洲成人不卡 | 男女被到爽流尿 | 亚洲综合一 | 极品人妻videosss人妻 | 久久99热这里只有精品 | 国产毛片91 | 国产污视频在线看 | 欧美日韩资源 | 日韩 中文字幕 | 日韩在线一卡 | 91精品又粗又猛又爽 | 在线成人毛片 | 裸体裸乳免费看 | 精品国产久| 一二三在线视频 | 中文字幕色网 | 天天综合天天做天天综合 | 亚洲国产成人精品女人久久 | 天天干视频在线 | www.操com| 欧美一区二区三区影视 | 性欢交69国产精品 | 午夜试看120秒 | 国产精品日韩在线观看 | 精品人妻无码一区二区三区蜜桃一 | 免费在线黄色网 | 国产精品久久久久久久久久久久久久久久 | 伊人9 | 日本免费黄色网址 | 久久伊人精品 | 男女毛片视频 | 欧洲成人av | 波多野结衣av在线播放 | 亚洲九九夜夜 | 暖暖成人免费视频 | 精品人人妻人人澡人人爽牛牛 | 狠狠撸在线| 都市激情 自拍偷拍 | 极品女神无套呻吟啪啪 | 国产xxxx做受视频 | 四虎网站最新网址 | 欧美精品日韩 | 日韩特黄 | 精品无人区无码乱码毛片国产 | 妺妺窝人体色www聚色窝仙踪 | 18视频在线观看男男 | 午夜视频91| 免费人妻精品一区二区三区 | av免费观看在线 | 日本a在线 | 色哟哟黄色| 森泽佳奈在线播放 | 中文字幕久久精品 | 成人精品电影 | 国产a级片视频 | 动漫一区二区 | 天天看片天天干 | 青青在线观看视频 |