【问题标题】:Conditional javascript require in the asset pipeline资产管道中的条件 JavaScript 要求
【发布时间】:2011-12-09 10:41:27
【问题描述】:

我在资产管道上苦苦挣扎。我正在从 Google CDN 加载 dojo,并将其放入我的模板中:

= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js', :'data-dojo-config' => %Q(dojoBlankHtmlUrl:'/blank.html', baseUrl: 'assets/', modulePaths: {custom: 'javascripts/modules'})

如果在本地运行或 CDN 已关闭,我只想回退到本地版本。我想过这样做:

script typeof(dojo) === "undefined" && document.write(unescape('%3Cscript src="js/libs/dojo-1.6.1.min.js"%3E%3C/script%3E'));

但我不喜欢它,因为它在资产管道之外起作用。我想在vendors/assets/javascripts/dojo 中保留道场。如何让资产管道提供后备服务。

有没有办法在资产管道中声明条件要求。我想要的是运行一些 javascript 测试,并根据结果提供一个文件。

谢谢

【问题讨论】:

  • CDN 最好的特性之一是它应该被客户端缓存,所以你不应该担心它被关闭。对于本地开发,您可以只做一个javascript_inlcude_tag。如果该解决方案对您来说不够节省,您应该将其放入您的资产/javascript 中并与您的其他 js all 一起提供。
  • 我明白了。但是,如果有一种方法可以通过资产管道处理文件而不将它们包含在模板中,那就太好了。因此,您可以生成一个可以通过 javascript 包含的 public/assets/javascripts/dojo-1.6.1.js 文件。 1.6.1 将充当指纹识别。两全其美。
  • 我不认为这是一个很酷的想法,但口味不同。

标签: ruby-on-rails asset-pipeline google-cdn


【解决方案1】:

我建议您使用 yepnope,它是一个轻量级库,用于并行加载此类库(以提高速度),它使您可以选择运行其他代码来测试库是否已加载。例如:


yepnope([{
  load: 'http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js',
  complete: function () {
    if (!window.jQuery) {
      yepnope('asset_path('you_local_copy_of_dojo') ');
    }
  }
}])

(注意:您需要在asset_path 助手周围使用erb 标签)

本地 dojo 文件将位于 assets/javascript 文件夹中,但不包含在应用程序清单中。您需要将dojo文件添加到预编译数组中:

config.assets.precompile += 'your_local_file.js'

这将使asset_path助手可以使用它。

【讨论】:

    【解决方案2】:

    谢谢理查德!

    我不想让 yepnope 加载一个库。这将是矫枉过正。这是我根据您的帮助提出的解决方案(用 slim 编写):


    1/ 在 vendor/assets/javascripts/ 中,我有我的 dojo.js。

    2/ 在 config/application.rb 中:

    # Precompile these assets files
    config.assets.precompile += ['dojo.js']
    

    3/ 在模板中:

    = javascript_include_tag "http://ajax.googleapis.com/ajax/libs/dojo/#{Settings.dojoVersion}/dojo/dojo.xd.js", :'data-dojo-config' => %Q(dojoBlankHtmlUrl:'/blank.html', baseUrl: 'assets/', modulePaths: {custom: 'javascripts/modules'})
    script = "typeof(dojo) === \"undefined\" && document.write(unescape('%3Cscript src=\"#{asset_path('dojo')}\"%3E%3C/script%3E'));".html_safe
    

    我还在 Rails Google Group 上发帖请求为 javascript_include_tag 添加两个选项,:test 和 :local 可以处理所有工作。我们拭目以待。

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多