Rails 3.1 конвейер активов и вручную заказанный Javascript требует
Я пытаюсь преобразовать существующее приложение в новый макет конвейера активов 3.1 и хочу включить много файлов поставщиков, которые должны быть в определенном порядке (подчеркивание.js и позвоночник - одна пара). Таким образом, я не могу просто использовать = require_tree .
тянуть в Мои файлы поставщика (без переименования каждого файла с префиксом. Фу.)
следующее находится в пределах моего app/assets/javascripts/application.js
file:
//= require modernizr-1.7 //= require jquery-1.6.1 //= require underscore-1.1.5 //= require backbone-0.3.3 //= require_tree .
Я пробовал каждую комбинацию с / из расширений, с / из require_tree и с / из относительных путей, и ничего не работает. Все мои файлы поставщика находятся в /vendor/assets/javascripts/
.
Я чувствую, что я глуп, потому что это похоже на такой очевидный случай использования (включая конкретные файлы по имени в порядке, общем для JS, нет? что я, должно быть, делаю что-то идиотское?
5 ответов:
вы можете потребовать каждый файл в определенном порядке, а затем добавить:
//= require_self
вместо:
//= require_tree .
у вас есть две возможные структуры : первый и второй. В обоих следующих примерах вы предоставляете пакет по адресу
/assets/externals.js
. Вы можетеjavascript_include_tag
этот пакет, но вы также можете потребовать его в свой .первый
vendor/ ├── assets │ ├── javascripts │ │ ├── externals.js │ │ ├── modernizr-1.7.js │ │ └── underscore-1.1.6.js │ └── stylesheets └── plugins
файл
externals.js
содержит ://= require ./underscore-1.1.6.js //= require ./modernizr-1.7.js
второй
vendor/ ├── assets │ ├── javascripts │ │ └── externals │ │ ├── index.js │ │ ├── modernizr-1.7.js │ │ └── underscore-1.1.6.js │ └── stylesheets └── plugins
файл
index.js
содержит ://= require ./underscore-1.1.6.js //= require ./modernizr-1.7.js
мой ответ относится к Rails 3.1rc4, я не знаю, работает ли он так же с другими версиями.
вы можете фактически поместить все требуемые операторы в приложение / активы/javascripts / application.js ли или нет.файлы js находятся в приложении / assets / javascripts / или vendor/assets/javascripts/
вот так:
// this is in app/assets/javascripts/application.js //= require modernizr-2.0 //= require jquery //= require jquery_ujs //= require jqueryui-1.8.12 //= require jquery.easing-1.3 //= require jquery.noisy //= require jquery.jslide-1.0 //= require respond //= require smoke //= require_tree
Я включил require_tree здесь, потому что у меня есть другие файлы javascript для моих отдельных контроллеров (страниц.js.кофе, пользователи.js.кофе) и общий один для всего сайта (Сайт.js.кофе)
между тем вот файловая структура.
app/ ├── assets │ ├── javascripts │ │ ├── application.js │ │ ├── pages.js.coffee │ │ ├── users.js.coffee │ │ └── site.js.coffee │ └── stylesheets └── plugins vendor/ ├── assets │ ├── javascripts │ │ ├── jquery.easing-1.3.js │ │ ├── jquery.jslide-1.0.js │ │ ├── jquery.noisy.js │ │ ├── jqueryui-1.8.12.js │ │ ├── modernizr-2.0.js │ │ ├── respond.js │ │ └── smoke.js │ └── stylesheets └── plugins
Это позволяет мне контролировать порядок загрузки библиотек поставщиков (что обычно имеет большое значение) и не беспокоиться о моем внутреннем javascript, где порядок обычно имеет меньшее значение.
что еще более важно, я контролирую все операторы require в одном часто используемом файле, я считаю, что это безопаснее и чище.
Я считаю, что вы можете поставить
library.js
в вvendor/assets/javascripts
и просто//= require library.js
из своего
application.js
, нет?
require_tree делает именно то, что вы говорите ему. Если вы дадите его
//= require_tree .
он загружает файлы в текущий каталог, где вызывается require_tree. Если вы дадите его
//=require_tree ../../../vendor/assets/javascripts
тогда вы получите javascript под поставщиком.
мне не понравилось ../../.. нотация, поэтому я создал файл с именем vendor/assets/javascripts / vendor_application.js который содержит:
//= require_tree .
который загружает javascript под поставщиком справочник.
Примечание, require выполняет поиск в 3 местоположениях конвейера (app, lib, vendor) для файла, который требуется. require_tree является буквальным, что, вероятно, так и должно быть.
railscast на этом очень полезно:http://railscasts.com/episodes/279-understanding-the-asset-pipeline