Может ли javascript_include_tag Rails игнорировать ранее загруженные скрипты? - PullRequest
2 голосов
/ 04 января 2011

Я использую эту строку:

= javascript_include_tag :all, :recursive => true, :cache => true

в нижнем колонтитуле приложения Rails сделать следующее:

  • Рекурсивно загружать все скрипты в public / javascripts
  • В процессе производства объедините их все в один файл (часть :cache)

Однако я хочу загрузить один из этих сценариев в голову, потому что от этого зависит какой-то встроенный JS.

Есть ли опция для javascript_include_tag, чтобы исключить файлы, которые уже были загружены?

Я знаю, что по умолчанию этого не происходит, потому что сейчас я вижу скрипт, на который дважды ссылаются в исходном HTML.

Ответы [ 2 ]

4 голосов
/ 04 января 2011

javascript_include_tag - простой html-помощник, который не отслеживает погоду или нет, что-то уже было включено на страницу, так что нет, здесь нет опции, отстой.

Вместо этого вы можете решить свою проблему несколькими способами:

  1. Используйте что-то вроде Jammit , которое я использую прямо сейчас, и это абсолютная радость. Он упаковывает все ваши javascripts в производство в один файл, позволяет вам сжать дерьмо из них, и делает то же самое для CSS. Вы конфигурируете его с помощью файла .yml в своем каталоге конфигурации, что делает его переносимым и простым для рекурсивного включения скриптов из каталогов, при этом все еще контролируя порядок, в котором они включены на страницу или добавлены в пакет. Альтернативой (менее крутой ИМХО) Jammit является Asset Packager .

  2. Используйте javascript_include_tag в голове. Не совсем конец света. Оптимизируй позже.

  3. Не совсем для Rails, но используйте head.js . head.js является довольно новым, но позволяет вам загружать множество сценариев быстро, параллельно, сохраняя порядок выполнения и вызывая обратные вызовы после запуска сценариев, но до того, как dom будет готов. Он включает в себя множество других полезностей, таких как удобство HTML5 в старых браузерах. Эта опция интересна тем, что вы храните свои скрипты отдельно или, по крайней мере, в разных пакетах для максимальной скорости параллельной загрузки. Я не уверен, стоит ли загружать один огромный сжатый пакет последовательно в <head> или даже прямо в нижнем колонтитуле, или загружать вещи параллельно с использованием head.js будет быстрее, но это, безусловно, облегчает управление этими вещами.

Я недавно использовал и head.js, и Jammit, и я должен сказать, что для тяжелых приложений Javascript они делают вещи на удивление легко.

1 голос
/ 04 января 2011

В config/application.rb вы можете установить значение :defaults в javascript_include_tag:

# JavaScript files you want as :defaults (application.js is always included).
config.action_view.javascript_expansions[:defaults] = %w(rails, jquery)

Затем вы можете использовать параметр: defaults для использования тега в application.erb.html,или где угодно:

<%= javascript_include_tag :defaults %>

Как только вы сделаете это в нижней части шаблона представления, вы, конечно, можете включить в него отдельные сценарии.

Теперь я понимаю, что выхотел использовать параметр :all и выполнять рекурсивную загрузку, но это решение дает вам больше контроля, который, я думаю, вам здесь понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...