turbolinks:load 事件适用于本地计算机,不适用于 Heroku

turbolinks:load event works on local machine not on Heroku

我正在将 Webpacker 与 Rails 6 一起使用。turbolinks:load 事件在本地正常工作,但在部署到 Heroku 时却无法正常工作。我通过将 'ready.js' 文件导入我的应用程序文件夹来使用标准 jquery $(document)on.('turbolinks:load' ()=>{})。在事件处理程序中添加控制台日志在我的计算机上有效,但在部署的应用程序上无效。

我正在将代码粘贴到我的 application.js 文件中的 packs 文件夹中。 application.html.erb 形成布局文件夹和 ready.js 文件。我对为什么这行不通一无所知。我已经搞砸了大约一个星期但没有成功。我已经尝试过在 application.js 文件中只包含 turbolinks:load 事件侦听器。我也刚刚尝试做一个简单的 console.log 没有其他代码,以确保没有其他东西可能会阻止代码。即使是最简单的情况仍然无法正常工作。我还清除了位于 cloudflare 后面的我的站点的缓存,并清除了 Heroku 的构建缓存。

如果有任何帮助,我将不胜感激。如果我一直遇到我不想做的问题,我接下来的步骤就是不使用 turbolinks。

aplication.html.erb:

<!DOCTYPE html>
<html lang="en-US" prefix="og: http://ogp.me/ns#">
  <head>
    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-160236437-1"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());

      gtag('config', 'UA-160236437-1');
    </script>

    <%if content_for?(:title)%>
      <title>ᐈ <%=  yield(:title)  %></title>
      <%else%>
      <title> Home On Call | Quality Local Contractors</title>
    <%end%>
    <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload', :defer => "defer" %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= "<link rel='canonical' href='#{yield(:canonical)}'/>".html_safe if content_for?(:canonical)%>
    <meta name="description" content="<%=yield(:meta_description)%>"/>
    <meta name="robots" content="<%=yield(:robots)%>"/>
    <meta property="og:title" content="<%=yield(:og_title)%>"/>
    <meta property="og:description" content="<%=yield(:og_description)%>"/>
    <meta property='og:image' content="<%=yield(:og_image)%>"/>
    <meta property="og:url" content="<%=request.url%>"/>
    <meta property="og:site_name" content="Home On Call" />
    <meta property="og:type" content="business.business"/>
    <meta property="business:contact_data:locality" content="<%=yield(:locality_town)%>"/>
    <meta property="business:contact_data:region" content="<%=yield(:locality_state)%>"/>
    <%# <meta property="business:contact_data:postal_code" content="07604"/> %>
    <meta property="business:contact_data:country_name" content="USA"/>
    <meta property="business:contact_data:website" content="https://www.homeoncall.com/"/>
    <meta name="twitter:card" content="summary" />
    <meta name="twitter:title" content="<%=yield(:title)%>"/>
    <meta name="twitter:description" content="<%=yield(:meta_description)%>" />

    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<%= favicon_link_tag 'favicon/favicon.ico' %>
<%= favicon_link_tag "favicon/apple-touch-icon.png", rel: 'apple-touch-icon', type: 'image/png' %>
<%= favicon_link_tag "favicon/android-chrome-192x192.png", rel: 'android-chrome-icon', type: 'image/png', sizes: "192x192" %>
<%= favicon_link_tag "favicon/android-chrome-512x512.png", rel: 'android-chrome-icon', type: 'image/png', sizes: "512x512" %>

<script type="application/ld+json">
{ "@context" : "http://schema.org",
  "@type" : "Organization",
  "name" : "HomeOnCall",
  "alternateName" : "Home On Call",
  "url" : "https://www.homeoncall.com/",
  "contactPoint": [
    { "@type": "ContactPoint",
      "telephone": "+1-201-675-6069",
      "contactType": "Customer Service"},
      {"@type": "ContactPoint",
      "email": "info@homeoncall.com",
      "contactType": "Customer Service"}],
  "sameAs" : [ "https://www.facebook.com/HomeOnCall"]
}
</script>
  </head>

  <body id="page-top">
    <%= render "layouts/nav"%>
      <%= render "layouts/flash"%>
      <%= render "layouts/header"%>
      <%= yield %>
      <%= render "layouts/footer"%>
      <%= render "layouts/admin"%>

    <link href="https://fonts.googleapis.com/css?family=Varela+Round" rel="stylesheet" > 
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet" >

  </body>
</html>

application.js:

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

import 'bootstrap'
import './src/application.scss'
import './ready'
import fontawesome from './fontawesome'

fontawesome()

// Uncomment to copy all static images under ../images to the output folder and reference
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
// or the `imagePath` JavaScript helper below.
//
// const images = require.context('../images', true)
// const imagePath = (name) => images(name, true)

ready.js

import greyscale from './greyscale';
import easing from './easing';

console.log("OUTSIDE DOCUMENT READY")
$(document).on('ready turbolinks:load', function () {
 console.log("INSIDE DOCUMENT READY")
  greyscale();
  easing();

  // Multi Step Lead Form.

  $("#next-1").click(function (e) {
    e.preventDefault();
    $("#second").show();
    $("#first").hide();
    $("#progressBar").css("width", "40%");
    $("#progressText").text("Step - 2");
  });

  $("#next-2").click(function (e) {
    e.preventDefault();
    $("#third").show();
    $("#second").hide();
    $("#progressBar").css("width", "60%");
    $("#progressText").text("Step - 3");
  });

  $("#next-3").click(function (e) {
    e.preventDefault();
    $("#fourth").show();
    $("#third").hide();
    $("#progressBar").css("width", "80%");
    $("#progressText").text("Step - 4");
  });

  $("#next-4").click(function (e) {
    e.preventDefault();
    $("#fifth").show();
    $("#fourth").hide();
    $("#progressBar").css("width", "100%");
    $("#progressText").text("Step - 5");
  });

  $("#prev-2").click(function (e) {
    e.preventDefault();
    $("#second").hide();
    $("#first").show();
    $("#progressBar").css("width", "20%");
    $("#progressText").text("Step - 1");
  })

  $("#prev-3").click(function (e) {
    e.preventDefault();
    $("#third").hide();
    $("#second").show();
    $("#progressBar").css("width", "40%");
    $("#progressText").text("Step - 2");
  })

  $("#prev-4").click(function (e) {
    e.preventDefault();
    $("#fourth").hide();
    $("#third").show();
    $("#progressBar").css("width", "60%");
    $("#progressText").text("Step - 3");
  });

  $("#prev-5").click(function (e) {
    e.preventDefault();
    $("#fifth").hide();
    $("#fourth").show();
    $("#progressBar").css("width", "80%");
    $("#progressText").text("Step - 4");
  });

  // Modal toggle
  $('#myModal').modal();

  // Show characters left for meta description. 
  $('#meta-word-text').keyup(function(e){
    var numWords = $.trim($("#meta-word-text").val()).split("").length;
    $('#meta-word-label').text(`Characters left ${120-numWords}`)
  })

  // FAQ Collapse
  $(".collapsible-item").click(function(e){
    $(e.target).siblings().toggle()
    $(this).toggleClass("active")
  })
});

事情是这样的:

  • 每当我单击 link 时,我的注销都会触发“INSIDE DOCUMENT READY”。
  • 当 link 在不应该的情况下被点击时,网站闪烁并重新加载。

在网络选项卡中查看时,应用程序包由 Rocket 加载程序(一种用于加速 JS 的 Cloudflare 工具)异步加载。

当点击 link 时,turbolinks 执行了 xhr 调用,它在 rocket loader 启动之前工作了一小段时间。从站点排序的底部删除 rocket loader 脚本修复了它,尽管应用程序包当时没有正确加载。

问题出在 Cloudflare 的 Rocketloader 和 Turbolinks 上。在这个 link (https://docs.deadlinefunnel.com/en/articles/4160226-how-to-disable-cloudflare-rocket-loader) 之后,我在 Cloudflare 仪表板中禁用了火箭装载机,世界上一切都很好。

非常感谢我的朋友 Steffan H,他找到了这个问题的根源。

吸取教训。不要点击你在 Cloudflare 上看到的每个按钮,并承诺在没有彻底测试首先发生的事情的情况下加速你的网站。