Файлы javascript для конкретных страниц в Rails 3.1

Я проводил исследования по этому поводу:

Использование Rails 3.1, где вы помещаете код javascript для своей страницы?

Но я еще не видел удовлетворительного ответа, что также заставляет меня задуматься, не делаю ли я что-то не так.

Вот моя ментальная модель: для разных взглядов у меня будут разные

$(document).ready(....)

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

Моя интуиция, правда, не подкрепленная никакими предварительными экспериментами, состоит в том, что в идеале было бы:

  1. Загрузите код всего приложения из application.js.
  2. Загрузите код общего контроллера из чего-то вроде assets/имя_контроллера/shared.js
  3. Загрузите код, специфичный для представления, из чего-то вроде assets/имя_контроллера/show.js

С верхней части моей головы. Помощник при первом запуске проверит, существует ли файл, и, если да, выполнит для него javascript_include.

Возможно, это имеет некоторые проблемы с производительностью по сравнению с подходом «давайте просто завернем все это в большой липкий шар и отправим все это», но кажется лучшим подходом к разделению кода.

Однако, как и выше, у меня такое чувство, что я что-то упускаю. Является ли $(document).ready для каждой страницы плохой идеей? Должно ли это быть просто в шаблоне и вызывать специфичный для страницы бит JS из application.js? Связанная статья выше приходит к такому выводу, но мне не нравится образ, который я получаю в своей голове одного огромного $(document).ready, пронизанного, если это, если это, если другое.


person David N. Welton    schedule 13.12.2011    source источник
comment
Мы опубликовали гем, который решает эту проблему, проверьте сообщение в блоге eng.wolox.com.ar/blog/2013/04/19/introduction-loadjs   -  person GuidoMB    schedule 25.04.2013


Ответы (2)


То, что вы предлагаете, звучит хорошо, но не в стиле рельсов 3.1.

Говорят, что нужно разделить JS на множество файлов, но служить пользователю как единое целое. Это обеспечивает лучшую производительность и масштабируемость, поэтому хорошо, если конечный большой кусок грязи не такой большой. Действительно, 3 http-запроса дают худшую производительность, чем 1 http-запрос.

Итак, вы уже разделили свой код на части, потому что у вас разные файлы Coffeescript с разными областями действия.

Чтобы загрузить приложение, просто стандартизируйте способ инициализации отдельного фрагмента кода, например вызов метода «myapp.users.init()».

Вы даже можете автоматизировать этот кусок кода с помощью помощника, чтобы он был прозрачным для контроллера.

person Matteo Collina    schedule 13.12.2011
comment
Что я нахожу странным, так это то, что нигде не упоминается стандартный способ ведения дел, когда это должна быть довольно стандартная проблема. Кроме того, вы можете довольно легко объединить файлы контроллера/действия, оставив вам только две загрузки, а не три, что не так уж и плохо. - person David N. Welton; 14.12.2011

Задний план

(Зачем вообще использовать Asset Pipeline?)

Одной из основных предпосылок конвейера ресурсов Rails является идея о том, что предпочтительнее загружать все JS и CSS для сайта один раз, а затем кэшировать их на неопределенный срок (по крайней мере, до тех пор, пока сайт не будет обновлен). Конвейер активов позволяет вам делать это относительно автоматически, при этом организуя файлы JS и CSS src логическим образом.

Это, конечно, влечет за собой первоначальные затраты на загрузку, обещая сэкономить время на дополнительных циклах загрузки отдельных файлов. Если эта предпосылка вас не устраивает, вероятно, конвейер ассетов не для вас.

Орех проблемы

Итак, мы хотим объединить все наши JS в один файл, чтобы загружать его более эффективно. Тот факт, что мы собираемся загружать все наши JS, не означает, что мы хотим запускать все наши JS.

В реальности сложного веб-приложения у вас, вероятно, будет много специфичных для страницы функций, на выполнение которых вы не захотите тратить ресурсы, когда пользователь не просматривает соответствующую страницу. Нам нужна единая стратегия для выполнения только той части нашего большого монолитного JS-файла, которая применима к текущей странице.

Конвенция на помощь

Я не знаком с официальной стратегией Rails для решения этой проблемы, но есть несколько отличных решений, которые устанавливают, а затем используют хорошее соглашение (что делает вещи «рельсовыми»). Общая идея состоит в том, чтобы определить весь код JS, специфичный для вашей страницы, в литерал объекта, а затем запустить только код, относящийся к текущей странице при загрузке.

Подробную информацию о стратегии организации и условного выполнения кода JS см. в ответе @welldan97 на этот вопрос:
Используя Rails 3.1, куда вы помещаете специфичный для вашей страницы код javascript?

который, в свою очередь, основан на этой статье Джейсона Гарбера:
http://viget.com/inspire/extending-paul-irishs-comprehensive-dom-ready-execution

person jshkol    schedule 15.12.2012