2

我在资产管道上苦苦挣扎。我正在从 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 测试,并根据结果提供一个文件。

谢谢

4

2 回答 2

3

我建议您使用 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 助手可以使用它。

于 2011-10-17T17:43:02.957 回答
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 添加两个选项,以处理所有工作。我们拭目以待。

于 2011-10-18T02:41:36.993 回答