我正在与资产管道作斗争。我正在加载dojo从谷歌CDN把这个放在我的模板:
= 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是down。我想这样做:
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测试,并根据结果提供一个文件。
谢谢
我建议您使用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帮助器周围添加动词标记)
本地dojo文件将在assets/javascript文件夹中,但不包括在应用程序清单中。您需要将dojo文件添加到预编译数组中:
config.assets.precompile += 'your_local_file.js'
这将使它可用于asset_path帮助器
谢谢Richard!
我不想让yepnope加载一个库。在我看来,这太过分了。以下是我想到的解决方案,基于您的帮助(用细字体写的):
1/在vendor/assets/javascripts/中,我有我的dojo.js.
2/In 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谷歌组上发布了请求向javascript_include_tag
添加两个选项,:test和:local,这将照顾所有的工作。我们将会看到。