Rails Engines: общие зависимости активов

Я пишу монтируемый движок 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?


person tristanm    schedule 05.03.2012    source источник


Ответы (1)


В конце концов, я решил не делать библиотеки поставщиков жесткими зависимостями и написал в документации, что они должны требоваться вручную. Это создает немного больше работы для нижестоящих разработчиков, но я думаю, что это обеспечивает наибольшую гибкость.

Итак, файл манифеста движка, my_engine.js, теперь просто:

//= require_tree .

и пример основного приложения:

application.js:

//= require jquery
//= require jquery_ujs
//= require_tree .

my_engine_requirements.js:

//= require jquery-ui
//= require jstree_pre1.0_fix_1/jquery.jstree.js
//= require my_engine/my_engine

application.html.erb:

<%= javascript_include_tag 'application' %>
<%= javascript_include_tag 'my_engine_requirements' if user_logged_in? %>

Это решение технически не отвечает на мой первоначальный вопрос, но это то, что я сделал после того, как немного рационализировал ситуацию.

person tristanm    schedule 26.03.2012