Я пишу монтируемый движок Rails 3.1, который добавляет функции в основное приложение (т.е. он не изолирован). JS движка зависит от jQuery, jQueryUI, таблицы данных и JSTree (среди других библиотек), поэтому манифест движка выглядит примерно так:
// my_engine.js
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require jstree_pre1.0_fix_1/jquery.jstree.js
//= require_tree .
Затем я могу условно загрузить этот файл в макет основного приложения, используя:
<%= javascript_include_tag 'application' %>
<%= javascript_include_tag 'my_engine/my_engine' if user_logged_in? %>
Однако, если манифест основного приложения уже включает одну из зависимостей (скорее всего, jQuery и jQuery_UJS), эти зависимости будут загружены дважды. Я увижу что-то вроде:
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
...
<script src="/assets/application.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script>
<script src="/assets/jstree_pre1.0_fix_1/jquery.jstree.js?body=1" type="text/javascript"></script>
...
<script src="/assets/cms/application.js?body=1" type="text/javascript"></script>
Директива require
Sprocket потребует актив только один раз в одном пакете, но здесь я работаю с двумя пакетами. Чтобы упростить другим разработчикам реализацию моего движка, я бы хотел, чтобы они могли включить одну строку, которая определяет, включены ли уже общие зависимости. Есть ли хороший способ сделать это с помощью Sprockets?