首页 文章

Rails引擎:共享资产依赖项

提问于
浏览
6

我'm writing a mountable Rails 3.1 engine that adds features to the main app (i.e. it isn' t隔离) . 引擎的JS依赖于jQueryjQueryUIDataTablesJSTree(以及其他库),因此引擎的清单看起来像:

// 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>

Sprocketrequire 指令只需要一个资产在同一个包中,但在这里我使用两个包 . 为了使其他开发人员能够实现我的引擎,我希望他们能够包含一行来检测是否已经包含共享依赖项 . 有没有很好的方法使用Sprockets这样做?

1 回答

  • 4

    最后,我选择不使供应商库具有硬依赖性,并且我已经在文档中写入了必须手动需要的文档 . 这为下游开发人员创造了更多的工作,但我认为它提供了最大的灵活性 .

    因此,引擎的清单文件 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? %>
    

    这个解决方案在技术上并没有回答我原来的问题,但这是我在对情况进行合理化之后所做的 .

相关问题