成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rails 3:提高Ajax應(yīng)用速度

原創(chuàng)
開發(fā) 后端 新聞
我建立了一個(gè)列表網(wǎng)站,ListKungFo,其中大量使用了Ajax,目前為止網(wǎng)站運(yùn)行非常良好。而過去兩周里,我一直在尋找一些能夠進(jìn)一步提高UI性能的方法,現(xiàn)在寫出來和大家分享。

【51CTO.com 5月18日外電頭條】而過去兩周里,我一直在尋找一些能夠進(jìn)一步提高UI性能的方法,得到的成果主要是返回正確的HTTP狀態(tài)代碼,優(yōu)化瀏覽器的緩存功能。

51CTO推薦專題:Ruby On Rails開發(fā)教程

具體地說,會(huì)返回兩種狀態(tài)代碼:

◆ 返回200-“Ok”,這告知瀏覽器服務(wù)器能夠成功的對(duì)請(qǐng)求進(jìn)行響應(yīng)。響應(yīng)包含了從服務(wù)器返回的HTTP載荷中的數(shù)據(jù)。

◆ 返回304-“Not modified”,表示未修改,這告知瀏覽器所發(fā)出請(qǐng)求中的數(shù)據(jù)并沒有改變,因此可以從緩存中裝載數(shù)據(jù)。這種情況下,響應(yīng)不包含HTTP載荷。

既然“Not modified”消息包含的數(shù)據(jù)要少得多(沒有內(nèi)容,只有頭),這樣你就***返回到瀏覽器這里,當(dāng)然你需要先確保瀏覽器的緩存中已經(jīng)存在數(shù)據(jù)了。

在我的應(yīng)用中,我發(fā)現(xiàn)服務(wù)器返回的200-響應(yīng)比304-響應(yīng)要多得多。這造成了兩方面的問題:

◆ 不得不傳輸比所需的更多的數(shù)據(jù)

◆ UI不得不處理更多數(shù)據(jù)

這兩方面出現(xiàn)的問題都會(huì)讓應(yīng)用的速度變慢。雖然只是慢了一點(diǎn),但在UI端還是足夠讓人察覺到了。幸運(yùn)的是你只需要對(duì)Rails應(yīng)用做幾個(gè)小修改,就能獲得應(yīng)有的效果。

1在GET方法中使用stale?語句

  1. def show  
  2.   @list_item = @list.list_items.find( params[ :id ] )  
  3.   if stale?( :etag => @list_item, :last_modified => @list_item.updated_at.utc, :public => true )  
  4.     respond_with( @list_item )  
  5.   end  
  6. end  

stale?語句會(huì)通過響應(yīng)發(fā)送回一個(gè)etag與一個(gè)last_modified日期。如果下一個(gè)請(qǐng)求是相同的URL,那么瀏覽器會(huì)把這個(gè)etag和last_modified日期發(fā)送給服務(wù)器。然后stale?方法會(huì)對(duì)這兩個(gè)參數(shù)進(jìn)行分析,如果內(nèi)容相同,則返回304,如果出現(xiàn)參數(shù)值不同,那么說明有新的內(nèi)容,這樣返回200。

Rails 3新特性:提高Ajax應(yīng)用速度

想知道更詳細(xì)的stale?方法的用法,可以查閱Rails的API文檔,以及閱讀Rails的手冊(cè)。

2 確保瀏覽器對(duì)每次請(qǐng)求都接收新的數(shù)據(jù)

上面的修改完成后,發(fā)生了一些有趣的事情。在很短的時(shí)間內(nèi),相同的Ajax行為被觸發(fā)了許多次,而瀏覽器并沒有向服務(wù)器發(fā)送一次請(qǐng)求,而都是從緩存中取得數(shù)據(jù)。雖然顯然讓UI變得快了很多,但這并不完全是我所想要的。我的目標(biāo)是獲得***的性能,同時(shí)還要保證屏幕上出現(xiàn)正確與***的數(shù)據(jù)。

瀏覽器的緩沖行為受到了三個(gè)HTTP頭的flag狀態(tài)的影響:cache-controll、pragma和expires

想要關(guān)閉瀏覽器的緩存功能,你可以發(fā)送下面的代碼:

  1. def set_cache_buster  
  2.     response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"  
  3.     response.headers["Pragma"] = "no-cache"  
  4.     response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"  
  5.   end 

然而我想要做的是這樣:

  1. def set_must_revalidate  
  2.     response.headers["Cache-Control"] = "must-revalidate"  
  3.   end 

因?yàn)檫@么做可以讓瀏覽器在每次請(qǐng)求時(shí)檢查新加入的和被更新的數(shù)據(jù),我在我的application_controller.rb中添加了這個(gè)方法,并且在before_filter控制器中加以調(diào)用。

3在返回集合的GET方法中使用stale?(例如索引)

上面的stale?例子是從控制器的show方法中取出的,這是網(wǎng)絡(luò)上非常通用的做法。如果想要使用這個(gè)方法返回一個(gè)集合,比如一個(gè)典型的控制器索引方法,那么需要想辦法找出當(dāng)前的集合和上次請(qǐng)求中的是否相同。

我的ListKungFu網(wǎng)站有一個(gè)類型列表List,其中包含很多ListItem。每個(gè)ListItem從屬于一個(gè)List。為了在list_items_controller中找出某個(gè)ListItem集合是否有變化,我添加了名為list.updated_at的時(shí)間戳,每次寫入操作時(shí)都會(huì)更新。

在ListItem.rb中:

  1. class ListItem < ActiveRecord::Base 
  2.   belongs_to :list  
  3.   after_save :update_list  
  4.   after_destroy :update_list  
  5.    
  6.   # [...]  
  7.    
  8.   def update_list  
  9.     self.list.updated_at = Time.now  
  10.     self.list.save  
  11.   end  
  12. end 

這樣,list_items_controller的索引方法看上去就像這樣:

  1. def index  
  2.     @list_items = @list.list_items  
  3.    
  4.     if stale?( :last_modified => @list.updated_at )  
  5.       respond_with( @list_items )  
  6.     end  
  7.   end 

如果不使用updated_at字段,我也可以給List模型加上一個(gè)version字段,但這樣看起來沒什么必要。如果這個(gè)模型不適合你的應(yīng)用,那么你需要找到另一種方法,檢查集合是否被修改了,比如計(jì)算一下集合中所有對(duì)象的校驗(yàn)和,這也能行得通。

 

Rails 3.0 主要改進(jìn)內(nèi)容:

1. New Active Record query engine

示例代碼:

  1. users = User.where(:name => "david").limit(20)  
  2. users.where("age > 29")  
  3. # SELECT * FROM users  
  4. # WHERE name = "david" AND age > 29   
  5. # ORDER BY name  
  6. # LIMIT 20  
  7. users.order(:name).each { |user| puts user.name }  

2. New router for Action Controller

示例代碼:

  1. resources :people do  
  2.   resource :avatar  
  3.  
  4.   collection do  
  5.     get :winners, :losers  
  6.   end  
  7. end  
  8.  
  9. # /sd34fgh/rooms  
  10. scope ':token', :token => /\w{5,5}/ do  
  11.   resources :rooms  
  12. end  
  13.  
  14. # /descriptions  
  15. # /pl/descriptions  
  16. # /en/descriptions  
  17. scope '(:locale)', :locale => /en|pl/ do  
  18.   resources :descriptions  
  19.   root :to => 'projects#index'  
  20. end 

3. New Action Mailer

示例代碼:

  1. class Notifier < ActionMailer::Base 
  2.   default :from => 
  3.     "Highrise <system@#{APPLICATION_DOMAIN}>"   
  4.  
  5.   def new_project(digest, project, person)  
  6.     @digest, @project, @person = digest, project, person  
  7.  
  8.     attachments['digest.pdf'] = digest.to_pdf  
  9.     attachments['logo.jpg']   = File.read(project.logo_path)  
  10.  
  11.     mail(  
  12.       :subject => "Your digest for #{project.name}",  
  13.       :to => person.email_address_with_name  
  14.     ) do |format|  
  15.       format.text { render :text => "Something texty" }  
  16.       format.html { render :text => "Something <i>textyi>" }  
  17.     end  
  18.   end  
  19. end 

4. Manage dependencies with Bundler

5. 默認(rèn)啟用跨站點(diǎn)工具 XSS 保護(hù)

6. 告別字符編碼問題困擾

7. Active Model: Validations, callbacks, etc for all models

8. 官方的插件 API

9. 內(nèi)部重構(gòu)

10. Agnosticism with jQuery, rSpec, and Data Mapper

11. 文檔完善 

Rails 是一個(gè)用于開發(fā)數(shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序的完整框架。Rails基于MVC(模型- 視圖- 控制器)設(shè)計(jì)模式。從視圖中的Ajax應(yīng)用,到控制器中的訪問請(qǐng)求和反饋,到封裝數(shù)據(jù)庫的模型,Rails 為你提供一個(gè)純Ruby的開發(fā)環(huán)境。發(fā)布網(wǎng)站時(shí),你只需要一個(gè)數(shù)據(jù)庫和一個(gè)網(wǎng)絡(luò)服務(wù)器即可。

【編輯推薦】

  1. 程序員的另類境界:Rails創(chuàng)始人駕保時(shí)捷參加職業(yè)賽
  2. 在Nginx上運(yùn)行Ruby on Rails
  3. 解讀Ruby on Rails的成功秘籍
  4. Twitter從Rails遷移到了Java
  5. 基于Ruby On Rails開發(fā)高品質(zhì)Web應(yīng)用
責(zé)任編輯:陳貽新 來源: 51CTO
相關(guān)推薦

2015-10-14 17:27:18

性能

2015-10-10 11:00:05

RubyRails性能

2009-06-24 15:16:19

AJAX客戶端

2016-09-07 15:02:03

ElasticSear索引速度

2024-06-27 11:00:07

2024-03-11 15:47:11

RustPython代碼

2009-12-17 17:37:42

Ruby on Rai

2009-12-17 15:29:00

Rails方法exte

2022-05-23 09:48:47

Rails 3RubyMine升級(jí)

2009-12-31 16:18:44

Silverlight

2011-08-16 13:27:34

索引

2011-08-15 18:20:05

建立索引SQL Sever數(shù)據(jù)

2018-03-09 10:15:00

Linux應(yīng)用程序運(yùn)行速度

2011-05-30 13:15:05

PHP

2011-05-30 13:28:00

PHP

2010-08-23 13:55:25

Android

2010-05-21 17:27:33

IIS管理窗口

2011-11-17 15:30:34

JavaNIOIO

2018-10-24 14:15:15

機(jī)器學(xué)習(xí)人工智能谷歌

2010-08-09 09:53:14

RailsRake
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区二区在线91 | 成人精品一区 | 亚洲人成在线播放 | 中文字幕加勒比 | 精品欧美视频 | 午夜精品久久久久久久久久久久 | 99免费在线观看视频 | 免费精品 | 国产99视频精品免视看9 | 麻豆av网站 | 亚洲国产高清免费 | 亚洲综合无码一区二区 | 久久综合一区二区 | 成年人黄色免费视频 | 亚洲一区二区电影在线观看 | 欧美最猛性xxxxx亚洲精品 | 国产精品美女久久久久 | 精品久久久久香蕉网 | 白浆在线| 欧美一级在线免费 | 亚洲成av人片在线观看无码 | 久久精品黄色 | 欧美一级片 | 久久久久一区二区三区 | 日本 欧美 三级 高清 视频 | 欧美黄色一级毛片 | 男人的天堂亚洲 | 久久艹免费视频 | 欧美亚洲另类丝袜综合网动图 | 美女国内精品自产拍在线播放 | 国产第一区二区 | 日韩在线观看网站 | 日本久久一区二区三区 | 日本精品视频一区二区 | 日日噜噜噜夜夜爽爽狠狠视频, | 依人成人 | 国产精品久久久久久238 | 99成人| 成人av免费在线观看 | 国产黄色大片在线免费观看 | 伊人色综合久久天天五月婷 |