首页 文章

使用react-rails gem删除rails中阻止javascript的渲染

提问于
浏览
1

我有一个Ruby on Rails应用程序 . 对于我的观点,我正在使用react-rails gem . 我想通过Google PageSpeed改进pagespeed . 我的主要问题是删除渲染阻止JavaScript,所以我添加了async:true到我的javascript_include_tag帮助方法 . 然后,当我刷新网站时,我在控制台中有这些消息的空白白窗口浏览器:

ReferenceError: $ is not defined
   $(document).ready(ready);
ReferenceError: jQuery is not defined
   }(jQuery);

ReferenceError: jQuery is not defined
   })( jQuery );

ReferenceError: React is not defined
    this.About = React.createClass({

我的applicaton.js文件:

//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require react
//= require react_ujs
//= require semantic-ui
//= require components
//= reqiore custom
//= require_tree .

var ready;
ready = function() {

};

$(document).ready(ready);
$(document).on('page:load', ready);

我需要做什么才能删除阻止javascript?

1 回答

  • 1

    由于页面上几乎所有内容都依赖于JQuery,因此任何成功的页面呈现都需要加载JQuery才能启动 . 因此根据我的经验,无法阻止Javascript .

    从用户的角度来看,为防止JQuery阻塞而投入大量工作可能会允许DOM加载,但是在Jquery和所有相关插件在DOM被重写后加载时可能会大量跳转,这使得体验变得更糟而不是一个稍长的页面加载 .

    总的来说,我将重点放在确保您的JQuery以及所有相关的JS和CSS文件都是通过CDN提供的,这样您就可以从第二个域并行地向主服务器提取HTTP,并确保您不会破坏浏览器缓存JQuery和其他资产,以便它们不会阻止后续请求 .

    EDIT

    我还要提一下,使用预编译的资产进行测试是值得的(如果使用CDN,这是必要的),关闭资产实时编译以查找缺少的项目

    config.assets.compile = false
    

    这样可以防止任何丢失的资产造成令人困惑的延迟,并且可能会在您生效后进行无效的编辑 .

    An additional note regarding serving assets from your web server:

    根据http://guides.rubyonrails.org/asset_pipeline.html

    4.1.1远期过期 Headers 预编译资产存在于文件系统中,由Web服务器直接提供 . 默认情况下,它们没有远期标头,因此要获得指纹识别的好处,您必须更新服务器配置以添加这些标头 . 对于Apache:

    # The Expires* directives requires the Apache module
    # `mod_expires` to be enabled.
    <Location /assets/>
      # Use of ETag is discouraged when Last-Modified is present
      Header unset ETag
      FileETag None
      # RFC says only cache for 1 year
      ExpiresActive On
      ExpiresDefault "access plus 1 year"
    </Location>
    

    对于NGINX:

    location ~ ^/assets/ {
      expires 1y;
      add_header Cache-Control public;
    
      add_header ETag "";
      break;
    }
    

    最后,确保测试在模拟最终 生产环境 环境的服务器上运行,因为Rails开发服务器不会提供相同的响应 .

相关问题