Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用react rails gem删除rails中的渲染阻塞javascript_Javascript_Ruby On Rails_Reactjs_React Rails - Fatal编程技术网

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

使用react rails gem删除rails中的渲染阻塞javascript,javascript,ruby-on-rails,reactjs,react-rails,Javascript,Ruby On Rails,Reactjs,React Rails,我有一个Ruby on Rails应用程序。对于我的观点,我使用的是react rails gem。 我想通过Google pagespeed来提高pagespeed。我的主要问题是删除渲染阻塞JavaScript,所以我在JavaScript\u include\u标记帮助器方法中添加了async:true。然后,当我刷新站点时,控制台中有一个空白的白色窗口浏览器,其中包含以下消息: ReferenceError: $ is not defined $(document).ready(r

我有一个Ruby on Rails应用程序。对于我的观点,我使用的是react rails gem。 我想通过Google pagespeed来提高pagespeed。我的主要问题是删除渲染阻塞JavaScript,所以我在JavaScript\u include\u标记帮助器方法中添加了async:true。然后,当我刷新站点时,控制台中有一个空白的白色窗口浏览器,其中包含以下消息:

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({
My 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,我需要做什么?

由于页面上几乎所有内容都依赖于JQuery,因此任何成功的页面呈现都需要加载JQuery才能开始。因此,根据我的经验,没有办法绕过阻塞Javascript

从用户的角度来看,投入大量的工作来防止JQuery阻塞可能会允许加载DOM,但在重写DOM时加载JQuery和所有相关插件之后,可能会有很多跳跃,这会使体验比稍微长一点的页面加载更糟糕

总的来说,我会集中精力确保JQuery和所有相关的JS和CSS文件都是通过CDN交付的,这样您就可以从与主域并行的第二个域中获取HTTP,并确保您不会破坏JQuery和其他资产的浏览器缓存,这样它们就不会在后续请求中阻塞

编辑

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

config.assets.compile = false
这将防止任何丢失的资产导致混乱的延迟,并在您的编译处于活动状态时可能导致无效编译

关于从web服务器服务资产的附加说明:

4.1.1远期到期报头

预编译资产存在于文件系统上,由 您的web服务器。默认情况下,它们没有未来很远的头,因此 获得指纹识别的好处您必须更新您的服务器 配置以添加这些标头

对于Apache:


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

谢谢你的解释。
# 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>
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;

  add_header ETag "";
  break;
}