资产管道中有条件的javascript需求

时间:2011-10-17 16:23:43

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

我正在努力应对资产管道。我正在从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中保留dojo。如何让资产管道服务回退。

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

由于

2 个答案:

答案 0 :(得分:2)

我建议你使用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帮助程序。

答案 1 :(得分:1)

谢谢理查德!

我不想让yepnope加载一个库。这将是矫枉过正的。以下是我提出的解决方案,基于你的帮助(用细长的书写):


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来处理所有工作。我们会看到。