Rails Engines: споделени зависимости на активи

Пиша монтируем двигател 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 на 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