广泛地说:在Rails管道中组织JS的最佳实践是什么?
具体来说:我有快速增长的JS文件,我很好,包括在总体application.js
清单中,让Sprockets uglify。然而,每个单独的JS文件开始变得笨拙,我喜欢组织它们,这样我就不必挖掘数百行实用程序函数来获得代码。我认识到目标是某种命名空间/模块化,但我不知道将它与资产管道相结合的最佳实践是什么,尤其是Sprockets清单。
我已经考虑过的事情,并仔细阅读:
是的,我已经在其资产管道上阅读了整个Rails指南。我知道像require
和require_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,但是我现在想要组织它,而不是以后就足够了。
答案 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来执行此操作,并且它非常易于维护/调试。