Ответ 1
Вы можете потребовать каждый файл в определенном порядке, а затем добавить:
//= require_self
вместо:
//= require_tree .
Я пытаюсь преобразовать существующее приложение в новый макет конвейера активов 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, нет?), что я должен делать что-то идиотское?
Вы можете потребовать каждый файл в определенном порядке, а затем добавить:
//= require_self
вместо:
//= require_tree .
У вас есть две возможные структуры: первая и вторая.
В обоих приведенных ниже примерах вы обнаружите пакет в /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
Мой ответ относится к 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, где порядок вообще меньше.
Что еще более важно, я контролирую все требовательные утверждения в одном часто используемом файле, я считаю, что он безопаснее и чище.
Я считаю, что вы можете поместить library.js
в свой vendor/assets/javascripts
, а затем просто
//= require library.js
из вашего application.js
, no?
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