[英]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
標簽。 給img
、 script
、 link
或類似標簽一個src
或href
屬性=""
將解析到當前頁面。 因此,它會在嘗試加載資產時再次嘗試加載頁面。 它也可以在 CSS url()
屬性或 AJAX 調用中。
一種簡單的判斷方法是在您的<head>
部分中臨時放置諸如<base href="http://example.com" />
<head>
內容。 這將為頁面上的任何鏈接添加前綴,如果出現這種問題,這應該可以防止您的本地頁面被調用兩次。
我還看到一些瀏覽器擴展在單獨的請求中查詢頁面。 我在 Chrome 的Web Server Notifier和Web 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.