Условный JavaScript требуется в конвейере активов - PullRequest
2 голосов
/ 17 октября 2011

Я борюсь с конвейером активов. Я загружаю додзе из Google 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 не работает. Я думал сделать это:

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 и в зависимости от результата подать файл.

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Я предлагаю вам использовать 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') ');
    }
  }
}])

(Примечание. Вам понадобятся теги erb вокруг помощника asset_path)

Локальный файл dojo будет находиться в папке assets / javascript, но не будет включен в манифест приложения. Вам нужно добавить файл dojo в массив прекомпиляции:

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

И это сделает его доступным для помощника asset_path.

1 голос
/ 18 октября 2011

Спасибо, Ричард!

Я не хочу иметь yepnope для загрузки одной библиотеки. Это было бы излишним ИМО. Вот решение, которое я придумал, основываясь на вашей помощи (написано на слим):


1 / В поставщиках / активах / 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, которые бы позаботились обо всей работе. Посмотрим.

...