在Rails资产管道中组织javascript

时间:2016-06-15 14:44:54

标签: javascript ruby-on-rails ruby-on-rails-4 asset-pipeline sprockets

广泛地说:在Rails管道中组织JS的最佳实践是什么?

具体来说:我有快速增长的JS文件,我很好,包括在总体application.js清单中,让Sprockets uglify。然而,每个单独的JS文件开始变得笨拙,我喜欢组织它们,这样我就不必挖掘数百行实用程序函数来获得代码。我认识到目标是某种命名空间/模块化,但我不知道将它与资产管道相结合的最佳实践是什么,尤其是Sprockets清单。

我已经考虑过的事情,并仔细阅读:

  • 是的,我已经在其资产管道上阅读了整个Rails指南。我知道像requirerequire_tree这样的Sprockets指令是如何工作的;问题是我想使用那些相同的指令,比如ES6 import命令,所以我可以做类似的事情

     // in, say, controller.js
     //= require 'utilities'
     ...
     more code
     ...
    
     // and in application.js, more confidently
     //= require 'controller'
    

    但我觉得不应该使用清单,或者至少每次我在utilities中更改一行时都会不必要地重新编译资产层。我还考虑过从application.js单独要求每个文件,但这并不能真正给出看似合适的模块性。

  • 宝石,如Paloma,CommonJS或RequireJS。这些似乎有点矫枉过正,似乎意味着要取代管道而不是补充它。

  • “现代”JS,如ES6,Babel或Browserify。 (我承认我还没有真正理解这些项目中的重叠,但我认为我得到了他们目的的主旨。)也许最终,因为JS似乎正朝这个方向发展,但也似乎有点矫枉过正。
  • 杯。与以前一样,过度杀伤和不必要的资产管道重写。
  • Rails 5和Sprockets 4.我们现在正在使用Rails 4,我知道Sprockets 4内置了一些ES6,但我不打算在Rails 5公开之后至少升级一段时间释放。

那我该怎么办?我想我需要咬紧牙关并选择其中一个,但我无法弄清楚哪个最有意义。该项目并不特别依赖于JS,但是我现在想要组织它,而不是以后就足够了。

1 个答案:

答案 0 :(得分:1)

我发现当我有大量特定于页面的js时,最好只为重复多次的js留下资源管道。显然,所有外部库都应继续进入vendor / js文件夹。将页面特定的js添加到您的应用程序(因此避免在一个页面中只需要一个库或脚本时在每个页面中加载js)的大多数rails-esque方法是添加到layouts / application.html的最底层。关闭正文标记之前的erb文件:

<%= yield :javascript %>

然后,在您希望运行一些javascript片段的视图上,您​​应该在关闭所有html标记后将其置于最底层。确保它不在某些div或该视图中的任何内容中,但位于其最底层。

<%= content_for :javascript do %>
  <script type="text/javascript">
   $(document).on('page:load', function() {
       all your page specific code here..
     });
  </script>
<% end %>

此代码现在将生成到布局视图的底部,仅加载到您需要的特定视图上,而不是与assets / js文件夹中的所有其他资源连接在一起。我使用非应用程序范围的所有自定义j来执行此操作,并且它非常易于维护/调试。