在Rails资产管道中组织javascript

在Rails资产管道中组织javascript,javascript,ruby-on-rails,ruby-on-rails-4,asset-pipeline,sprockets,Javascript,Ruby On Rails,Ruby On Rails 4,Asset Pipeline,Sprockets,概括地说:在Rails管道中组织JS的最佳实践是什么 具体来说:我有快速增长的JS文件,我很乐意将其包含在最重要的application.JSmanifest中,让链轮变得丑陋。然而,每个单独的JS文件都开始变得笨拙,我希望对它们进行组织,这样我就不必钻研数百行实用程序函数来获取代码的实质内容。我知道目标是某种名称空间/模块化,但我不知道将其与资产管道(尤其是链轮)相结合的最佳实践是什么 我已经考虑过的事情,并仔细阅读了: 是的,我已经阅读了关于其资产管道的整个Rails指南。我知道链轮指令如

概括地说:在Rails管道中组织JS的最佳实践是什么

具体来说:我有快速增长的JS文件,我很乐意将其包含在最重要的
application.JS
manifest中,让链轮变得丑陋。然而,每个单独的JS文件都开始变得笨拙,我希望对它们进行组织,这样我就不必钻研数百行实用程序函数来获取代码的实质内容。我知道目标是某种名称空间/模块化,但我不知道将其与资产管道(尤其是链轮)相结合的最佳实践是什么

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

  • 是的,我已经阅读了关于其资产管道的整个Rails指南。我知道链轮指令如
    require
    require\u tree
    是如何工作的;问题是我想使用与ES6
    import
    命令相同的指令,这样我就可以执行以下操作

     // in, say, controller.js
     //= require 'utilities'
     ...
     more code
     ...
    
     // and in application.js, more confidently
     //= require 'controller'
    
    但我觉得这不是应该如何使用清单,或者至少在每次我更改
    实用程序中的一行时,它都会不必要地重新编译资产层。我还考虑过要求每个文件分别来自
    application.js
    ,但这并没有真正提供合适的模块化

  • 宝石,如帕洛玛、CommonJS或RequireJS。这些措施似乎有些过分,似乎是为了取代管道,而不是补充管道

  • “现代”JS,如ES6、Babel或Browserify。(我承认我还没有真正理解这些项目中的重叠,但我想我理解了它们的目的的要点。)也许最终,因为JS似乎正在朝着这个方向发展,但似乎也有点过头了
  • 大口喝。与前面一样,过度使用和不必要地重写资产管道
  • 导轨5和链轮4。我们现在使用的是Rails 4,我知道Sprocket 4内置了一些ES6,但我不打算升级,至少要等到Rails 5公开发布后一段时间

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

我发现当我有大量特定于页面的JS时,最好只为重复多次的JS保留资产管道。显然,所有外部库都应该继续放在您的vendor/js文件夹中。将特定于页面的js添加到应用程序(从而避免在一个页面只需要一个库或脚本时在每个页面中加载js)的最类似rails的方法是在结束正文标记之前添加到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 %>

$(文档).on('page:load',function()){
此处显示所有页面特定的代码。。
});

这段代码现在将被放在布局视图的底部,只加载所需的特定视图,而不是与assets/js文件夹中的所有其他资产连接在一起。我对所有非应用程序范围的自定义js都这样做,而且很容易维护/调试。

我刚才回答了关于Google Maps的问题,它详细介绍了如何在Rails应用程序中分解特定于页面的js——可能会有所帮助:我或多或少已经知道怎么做了(实际上,我正在做类似的事情。)问题是当我编写了类似于
my_map\u handler.js
的文件时,它非常庞大,我需要该文件的子模块化。基本上,我知道如何在视图中组织我的JS,这样它们就不会被重复使用(无论如何,我也可以接受)——这更多是关于我正在编写的JS文件中的代码卫生,以及在管道的framework.Cool中工作。我只是觉得我应该把它放在页面的特定性上,而不是你问题的其余部分。再说一次,我对获取页面特定的代码很在行——这实际上只是如何模块化地组织我的JS,也许是使用链轮。我想我应该编辑我的原始问题,以减少对任何页面特定代码的强调。