簡體   English   中英

Rails 似乎為該頁面提供兩次服務

[英]Rails seems to be serving the page twice

這是我在發出單頁請求時在本地日志文件中看到的內容:

Started GET "/" for 127.0.0.1 at Mon Apr 25 22:12:22 -0700 2011
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1
  Processing by PagesController#beta as HTML
Rendered pages/beta.html.erb within layouts/beta (16.2ms)
Completed 200 OK in 23ms (Views: 18.8ms | ActiveRecord: 7.7ms)


Started GET "/" for 127.0.0.1 at Mon Apr 25 22:12:23 -0700 2011
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1
  Processing by PagesController#beta as */*
Rendered pages/beta.html.erb within layouts/beta (17.9ms)
Completed 200 OK in 27ms (Views: 21.5ms | ActiveRecord: 6.6ms)

任何人都知道是什么導致了這種情況? 加工線有趣嗎?

PagesController#beta as HTML
PagesController#beta as */*

這意味着什么?

我已經看到這種情況發生是因為帶有空白src屬性的img標簽。 imgscriptlink或類似標簽一個srchref屬性=""將解析到當前頁面。 因此,它會在嘗試加載資產時再次嘗試加載頁面。 它也可以在 CSS url()屬性或 AJAX 調用中。

一種簡單的判斷方法是在您的<head>部分中臨時放置諸如<base href="http://example.com" /> <head>內容。 這將為頁面上的任何鏈接添加前綴,如果出現這種問題,這應該可以防止您的本地頁面被調用兩次。

我還看到一些瀏覽器擴展在單獨的請求中查詢頁面。 我在 Chrome 的Web Server NotifierWeb Technology Notifier擴展中特別注意到了這一點。 嘗試使用“隱身”窗口或單獨的瀏覽器,看看是否得到相同的結果。

我之前經歷過這種情況,罪魁禍首是 Turbolinks 的實施不佳(就我而言)。

我必須學習讓 Turbolinks 工作的正確方法(我在底部包含了我的學習資源)……順便觀看 Ryan Bates 視頻,看看正常工作的實現是什么樣的。

問題/罪魁禍首:

是 Javascript。 Turbolinks Github 頁面所述...

使用 Turbolinks 頁面將無需完全重新加載即可更改,因此您不能依賴 DOMContentLoaded 或 jQuery.ready() 來觸發您的代碼。 相反,Turbolinks 在文檔上觸發事件以提供進入頁面生命周期的鈎子。

基本上任何暗示“在 DOM/頁面加載后運行”的內容都會中斷/無法按預期工作......這將導致 Turbolinks 無效。 由於 Turbolinks 正常失敗,您的瀏覽器將加載頁面兩次(檢查日志/控制台)並為您隱藏問題。

在我的情況下,我能夠在“隱身模式”下注意到上述行為......我所有依賴於文檔/DOM/頁面就緒的Javascript......都壞了。 所以 ...

解決方案:

如果你的javascript中有這樣的東西(下面)......

$(function() {
  alert("DOM is ready!");
});

$(document).ready(function() {
  alert("DOM is ready!");
});

jQuery(document).ready(function() {
  alert("DOM is ready!");
});

改成這個...

$(document).on('page:change', function() {
  alert("DOM is ready!");
});

Turbolinks 實際上不會請求一個全新的頁面,因此您會注意到您的 Javascript 僅適用於整個頁面加載,但當您單擊啟用 Turbolink 的鏈接時則無效。

這意味着我們應該依靠 Turbolinks 來檢測 DOM 就緒實際上是什么。

在我看來,當前的答案(可能)是錯誤的,因為我有 Chrome 擴展程序、blank-hrefs 並且我的問題消失了。

進一步閱讀:

我們遇到了空白背景 url css 的問題,強制使用 rails 重新加載頁面。

如果cover_url 參數為空,則會強制重新加載頁面。

"style" = "background: url( #{cover_url} );"

由於SPOF-O-Matic Chrome 擴展程序,我發生了這種行為。 禁用它刪除了額外的請求。 您可以從 chrome://extensions/ 禁用它

根據上面的線索,我開始一一禁用 Chrome 擴展程序。 最終我禁用了 AdBlock Plus 擴展,這解決了問題。 奇怪的是,當我重新啟用擴展時,它仍然有效。 我不知道這可能是什么。

嘗試一些東西,但我只是關閉了標簽並打開了一個新標簽,這為我解決了問題。

只需添加我遇到的問題,即上面提到的問題以及 application.js 中 turbolinks 的順序

首要問題

在錯誤的地方需要 Turbolinks

//= require jquery3
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require turbolinks
//= require_tree .

第一個解決方案

在 jquery3 之后需要 turbolinks

//= require jquery3
//= require turbolinks
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require_tree .

在此更改后,我注意到頁面加載速度更快,但仍加載兩次。

第二期

AddBlocker extension 

第二種解決方案

Use Incognito

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM