Rails 3.1 Asset Pipeline для Javascript - PullRequest
5 голосов
/ 16 сентября 2011

Хорошо, я прочитал много информации о новом конвейере активов для Rails 3.1 и не смог найти правильный ответ на свои сомнения.

Я загружал свои файлы .js в соответствии сview # action, которую я рендерил, по требованию.Я делал это, чтобы предотвратить неправильные привязки и загрузить небольшие файлы .js.

андидат_opportunities # индекс

$(".sortable_drag_n_drop").sortable({
    update: function(event, ui) {
        $.post('/candidate_opportunities/sort', $(this).sortable('serialize'));
    },
    handle: 'span'
});

кандидат_компании # индекс

$(".sortable_drag_n_drop").sortable({
    update: function(event, ui) {
        $.post('/candidate_companies/sort', $(this).sortable('serialize'));
    },
    handle: 'span'
});
$(".sortable_drag_n_drop").disableSelection();

Какое сейчас лучшее решение?

  • Должен ли я изменить свои привязки и позволить Sprockets скомпилировать все мои файлы .js, используя //= require_tree .?
  • Или я должен попытаться загрузить свои .js в соответствии с моими взглядами, чтобы я не получил огромное application.js ?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Если вы обновляете это в конвейер, у вас есть несколько вариантов. Вероятно, вы должны принять решение о том, как должен работать конвейер при принятии решения.

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

На опции.

1. Как и сейчас.

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

config.assets.precompile += ['candidate_opportunities.js', 'candidate_companies']

Активы должны быть в активах / javascripts, но нет необходимости добавлять их в файл манифеста, так как вы добавляете каждый из них по отдельности.

Настоятельно рекомендуется придерживаться значений Rails по умолчанию для конвейера и предварительно скомпилировать ресурсы для производства.

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

2. Актив Трубопроводный путь (ТМ)

Чтобы сделать это с конвейером, вам нужно переместить эти файлы в assets / javascripts и require_tree, как вы говорите.

Проблема в вашем случае заключается в том, что фрагменты JS предназначены для одного и того же класса (но с другими URL-адресами записей), поэтому это не сработает. И с require_tree порядок файлов может быть не тем, что вы хотите.

Новое приложение 3.1 генерирует файлы для представлений (я думаю), но ожидается, что они будут нацелены на уникальные атрибуты (с точки зрения сайта) в разметке, потому что все файлы включаются в application.js

Чтобы обойти проблему столкновений JS. Я бы посоветовал вам выполнить рефакторинг фрагмента JS, чтобы он был более общим. Вы можете использовать атрибут data-post-url для сортируемого объекта:

<ul class="sortable_drag_n_drop" data-post-url="/candidate_opportunities/sort">

и затем соберите URL в вашем JS.

Мало того, что DRYer, но у вас меньше всего JS и вы можете полностью использовать конвейер, как предполагалось.

0 голосов
/ 22 декабря 2012

Я разочарован в конвейере активов Rails. Возможно, не весь процесс создания активов, но то, как Rails организует javascript, на самом деле не логично.

На данный момент Rails имеет отдельный файл javascript для каждого контроллера. Что несколько хорошо с точки зрения логической организации. Но затем конвейер ресурсов сжимает все эти файлы в один большой файл js. Таким образом, в основном ваши js-файлы хорошо организованы, но затем они загружаются одновременно, что приводит к конфликтам переменных, функциям, другим кодам и другому непредвиденному поведению. Потому что то, что мы действительно хотим как разработчики, - это простой способ выполнить или загрузить специфичный для страницы javascript.

Один из известных подходов состоит в том, чтобы просто включить определенный файл javascript на страницу. Да, это будет работать, но мы не используем повышение производительности, обеспечиваемое конвейером ресурсов, если мы запрашиваем разные файлы javascript на страницу.

Мое решение состоит в том, чтобы создать объект javascript, который содержит все специфичные для страницы функции, а затем извлекает и выполняет их, когда Rails выполняет соответствующую пару действий контроллера. Примерно так:

PageJs = {};
PageJs["users/new"] = function(){ 
  alert("I will be called when users/new action is executed");
};

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

Вот пример использования Paloma :

Файл Javascript:

Paloma.callbacks['users/new'] = function(params){
  // This will only run after executing users/new action
  alert('Hello New Sexy User');
};

Контроллер Rails:

def UsersController < ApplicationController
  def new
    @user = User.new
    # No special function to call, 
    # the javascript callback will be executed automatically
  end
end

Это лишь быстрый пример, но он может предложить гораздо больше, и я уверен, что он может решить вашу проблему. Легко.

Спасибо!

...