我正在努力应对资产管道。我正在从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测试,并根据结果提供文件。
由于
答案 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来处理所有工作。我们会看到。