Rails 3.1 asset pipeline y Javascript ordenado manualmente requiere


Estoy tratando de convertir una aplicación existente al nuevo diseño de canalización de activos 3.1, y quiero incluir una gran cantidad de archivos de proveedores que tienen que estar en un orden específico, (subrayado.js y backbone son un par). Como tal, no puedo usar un = require_tree . para extraer mis archivos de proveedor, (sin cambiar el nombre de cada archivo con un prefijo. Yuck).

Lo siguiente está dentro de mi archivo 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 .

He probado todas las combinaciones de extensiones con/out, con / out el require_tree y con / out el relativo caminos, y nada funciona. Todos mis archivos de proveedor están en /vendor/assets/javascripts/.

Siento que estoy siendo estúpido porque esto parece un caso de uso tan obvio, (incluir archivos específicos por nombre en un orden es común con JS, no?¿que debo estar haciendo algo idiota?

Author: New Alexandria, 2011-05-27

5 answers

Puede requerir cada archivo en un orden particular y luego agregar:

//= require_self

En lugar de:

//= require_tree .
 29
Author: martinciu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-25 21:25:32

Tienes dos estructuras posibles : la primera y la segunda. Con los dos ejemplos siguientes, se expone un paquete en /assets/externals.js. Puede javascript_include_tag este paquete, pero también puede requerirlo en su archivo application.js.

El primero

vendor/
├── assets
│   ├── javascripts
│   │   ├── externals.js
│   │   ├── modernizr-1.7.js
│   │   └── underscore-1.1.6.js
│   └── stylesheets
└── plugins

El archivo externals.js contiene :

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js

El segundo

vendor/
├── assets
│   ├── javascripts
│   │   └── externals
│   │       ├── index.js
│   │       ├── modernizr-1.7.js
│   │       └── underscore-1.1.6.js
│   └── stylesheets
└── plugins

El archivo index.js contiene :

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js
 48
Author: Romain Tribes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-27 15:07:49

Mi respuesta se aplica a Rails 3.1rc4, no se si funciona igual con otras versiones.

Puede poner todas las instrucciones require en app/assets/javascripts/application.js si o no .los archivos js están en app/assets/ javascripts/o vendor/assets/javascripts /

Así:

// 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

Incluí require_tree aquí porque tengo otros archivos javascript para mis controladores individuales (pages.js.café, usuarios.js.café) y una general para todo el sitio cosas (sitio.js.café)

Mientras tanto aquí está la estructura del archivo.

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

Esto me permite controlar el orden de carga de las bibliotecas de proveedores (que generalmente importa mucho) y no preocuparme por mi javascript interno, donde el orden generalmente importa menos.

Lo que es más importante, controlo todas las declaraciones require dentro de un archivo de uso frecuente, me parece que es más seguro y más limpio.

 8
Author: Olivier Lacan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 15:15:44

Creo que puedes poner un library.js en tu in vendor/assets/javascripts y luego simplemente

//= require library.js

De tu application.js, ¿no?

 6
Author: muxcmux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-25 17:32:48

Require_tree hace exactamente lo que usted le dice. Si se administra

//= require_tree .

Carga los archivos en el directorio actual donde se llama require_tree. Si se administra

//=require_tree ../../../vendor/assets/javascripts

Entonces obtendrá el javascript en vendor.

No me gustó el ../../.. notación, así que creé un archivo llamado vendor / assets/javascripts / vendor_application.js que contiene:

//= require_tree .

Que carga el javascript bajo el directorio vendor.

Nota, requiere no buscar el 3 ubicaciones de canalización (app, lib, vendor) para que el archivo requiera. require_tree es literal, que es probablemente la forma en que debería ser.

El railscast sobre esto es muy útil: http://railscasts.com/episodes/279-understanding-the-asset-pipeline

 4
Author: justingordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-31 08:28:52