Подтвердить что ты не робот

Конвейер ресурсов Rails 3.1 и вручную заказываемый Javascript требует

Я пытаюсь преобразовать существующее приложение в новый макет конвейера активов 3.1 и хочу включить в него множество файлов поставщиков, которые должны быть в определенном порядке (underscore.js и базовая сеть - одна пара). Таким образом, я не могу просто использовать = require_tree . для загрузки файлов своего поставщика (без переименования каждого файла с префиксом Yuck).

В моем файле app/assets/javascripts/application.js находится следующее:

//= require modernizr-1.7
//= require jquery-1.6.1
//= require underscore-1.1.5
//= require backbone-0.3.3
//= require_tree .

Я пробовал каждую комбинацию с расширениями /out, с/out require_tree и с /out относительными путями, и ничего не работает. Все файлы моего поставщика находятся в /vendor/assets/javascripts/.

Я чувствую, что я глуп, потому что это похоже на такой очевидный случай использования (включая определенные файлы по имени в порядке, свойственном JS, нет?), что я должен делать что-то идиотское?

4b9b3361

Ответ 1

Вы можете потребовать каждый файл в определенном порядке, а затем добавить:

//= require_self

вместо:

//= require_tree .

Ответ 2

У вас есть две возможные структуры: первая и вторая. В обоих приведенных ниже примерах вы обнаружите пакет в /assets/externals.js. Вы можете javascript_include_tag этот пакет, но вы также можете потребовать его в своем application.js файле.

Первый

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

Ответ 3

Мой ответ относится к Rails 3.1rc4, я не знаю, будет ли он работать с другими версиями.

Вы можете поместить все требуемые утверждения в app/assets/javascripts/application.js независимо от того, находятся ли файлы .js в app/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 для моих отдельных контроллеров (pages.js.coffee, users.js.coffee) и общий для всего сайта (site.js.coffee)

Между тем здесь файловая структура.

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, где порядок вообще меньше.

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

Ответ 4

Я считаю, что вы можете поместить library.js в свой vendor/assets/javascripts, а затем просто

//= require library.js

из вашего application.js, no?

Ответ 5

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 является буквальным, что, вероятно, так и должно быть.

Рельсы на этом очень полезны: http://railscasts.com/episodes/279-understanding-the-asset-pipeline