Конвейер ресурсов Rails 3.1 и заказанный вручную Javascript требует - PullRequest
52 голосов
/ 27 мая 2011

Я пытаюсь преобразовать существующее приложение в новый макет конвейера ресурсов 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 .

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

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

Ответы [ 5 ]

48 голосов
/ 27 мая 2011

У вас есть две возможные структуры: первая и вторая.В обоих следующих примерах вы выставляете пакет на /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
29 голосов
/ 26 июня 2011

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

//= require_self

вместо:

//= require_tree .
8 голосов
/ 19 июля 2011

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

Вы можете поместить все операторы require в 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, где порядок обычно имеет меньшее значение.

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

6 голосов
/ 06 июня 2011

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

//= require library.js

от вашего application.js, нет?

4 голосов
/ 31 декабря 2011

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

...