Rails Engines: общие ресурсы - PullRequest
6 голосов
/ 06 марта 2012

Я пишу монтируемый движок Rails 3.1, который добавляет функции в основное приложение (т. Е. Он не изолирован).JS движка зависит от jQuery , jQueryUI , DataTables и 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 директива будет требовать актив только один раз в пределах одного пакета, но здесь я работаю с двумя пакетами.Чтобы было проще для других разработчиков, реализующих мой движок, я бы хотел, чтобы они могли включать одну строку, которая определяет, включены ли общие зависимости или нет.Есть ли хороший способ сделать это с помощью Sprockets?

1 Ответ

4 голосов
/ 27 марта 2012

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

Итак, файл манифеста движка, 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? %>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...