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 52

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