2010-05-23 13 views
30

le mie applicazioni rails (tutte 2.3.5) utilizzano un mix totale di javascript, rjs, prototype e jquery in linea. Chiamiamo apprendimento o dolori in crescita. Ultimamente sono stato sempre più infatuato di javascript non invadente. Rende il tuo html pulito, nello stesso modo in cui lo ha ripulito.best practice per i rails dove posizionare discreto javascript

Ma la maggior parte esempi che ho visto sono piccoli esempi, e hanno messo tutto javascript (jQuery) all'interno application.js

Ora ho una abbastanza grande applicazione, e sto pensando a modi per strutturare i miei js. Mi piace in qualche modo che il mio script è ancora vicino alla vista, in modo che io sto pensando qualcosa di simile

orders.html.erb 
orders.js 

dove orders.js contiene il JavaScript discreto specifico per quella vista. Ma forse sono solo io che sono troppo prudente :)

Ho letto alcuni post di Yehuda Katz su questo stesso problema here e here, dove affronta questo problema. Passerà attraverso i file js e caricherà solo quelli rilevanti per la tua vista. Ma purtroppo non riesco a trovare un'implementazione corrente.

Così le mie domande:

  • come si fa a struttura migliore Javascript discreto; gestisci il tuo codice, come fai ad assicurarti che sia ovvio dall'html che cosa si suppone debba fare qualcosa. Suppongo che i nomi di una buona classe siano molto lunghi :)
  • come sistemare i file, caricarli tutti? solo alcune? usi content_for :script o javascript_include_tag nella tua vista per caricare gli script rilevanti. O ... ?
  • scrivi funzioni molto generiche (come una cancellazione), con parametri (aggiungi attributi extra?), O scrivi funzioni molto specifiche (DRY?). So che in Rails 3 c'è un set standard e tutto è discreto lì. Ma come iniziare in Rails 2.3.5?

In breve: quali sono le migliori pratiche per fare javascript discreto nei binari? :)

risposta

10

Non penso ci sia una buona pratica, ma ti farò sapere cosa faccio.

  1. Ho una serie di file js ciascuno per con la propria finalità nella directory public/javascripts/. Alcuni esempi potrebbero essere utility.jschat.jsshopping_basket.js e così via.

  2. Io uso asset packager e definire una grande raccolta di grassi per tutte le mie funzionalità di uso generale e un'altra per le sole funzionalità di amministrazione. I viaggi di andata e ritorno al server costano troppo. Fondamentalmente includo tutti i js sul carico della prima pagina ridimensionato in un blob (in generale)

  3. Consente alle barre di base $(document).ready incorporate nelle pagine e di mantenerle molto corte.

  4. I dati a cui i miei file js devono accedere sono resi in linea con la pagina. (Di solito nel DOM, a volte come vars - Eg var xyz = 100.)

  5. io di solito sviluppare le mie controller con javascript off (e assicurarsi che tutte le opere), poi lo accendo e cospargere alcune if request.xhr? dove necessario.


Tenete a mente, ferroviario 3.1 introduce una best practice built-in, vedi: http://guides.rubyonrails.org/asset_pipeline.html - su una nota personale ho avuto problemi di prestazioni e di configurazione con il nuovo gasdotto, ma molti altri hanno avuto grande successo con esso.

+0

Questo è molto interessante. Completo. Sono ancora interessato a ciò che gli altri hanno da dire. – nathanvda

3

Recentemente ho documentato come sono stato managing javascript in Ruby on Rails. Fondamentalmente suddivido le cose in tanti piccoli file granulari, ciascuno con uno spazio dei nomi appropriato e li unisco tutti in un unico file per la produzione usando asset_packager.

+0

Mi piace come è possibile caricare automaticamente un file .js con lo stesso nome del controller per le visualizzazioni. Sembra un buon inizio almeno :) – nathanvda

1

Ho trovato questo post durante il tentativo di risolvere lo stesso problema, ma nessuna delle soluzioni esistenti mi ha colpito come quella giusta. Ho scritto il mio approccio here. Mi piace la convenzione di Rails sulla configurazione, quindi volevo lo stesso approccio per includere Javascripts applicabili solo a una particolare pagina di azione. Se non altro, è almeno un altro approccio da aggiungere alle tue opzioni.

+0

Mi piace molto il tuo suggerimento, ed è molto vicino a quello che vorrei davvero. Quello che faccio ora è separare il js nei file per controller in ogni caso, ma poi bloccare un grande js combinato perché si carica più velocemente (1 big js invece di una tonnellata di file separati). – nathanvda

Problemi correlati