2012-07-16 6 views
15

Vorrei utilizzare Dojo Toolkit con Meteor.Come impedire a Meteor di guardare i file?

  1. ho prima copia tutto l'albero Dojo Toolkit in /public

  2. Poi, ho includerlo sul lato client con:

    <script src="/dojo/dojo.js" data-dojo-config="async: true"></script>` 
    

Tutto funziona bene, tranne Meteor è monitorare effettivamente ogni singolo file in /public per le modifiche, in modo che possa riavviare il server. Ciò causa effettivamente un ritardo molto lungo durante la prima richiesta su localhost:3000.

C'è un modo per impedire a Meteor di guardare i file da una determinata directory?


Dojo Toolkit è 10k + file in modo ottengo l'errore EMFILE dichiarato here, corretto con

sudo sh -c 'echo 16384 > /proc/sys/fs/inotify/max_user_watches' 
+7

Ho finalmente trovato una soluzione alternativa. Sto mettendo tutto in/public/lib /. Poi, la linea 286 di /usr/lib/meteor/app/run.js, sto aggiungendo la cartella Non voglio Meteor a guardare: 'self.exclude_paths = [ path.join (app_dir, '.meteor', 'local'), path.join (app_dir, 'public', 'lib') ]; ' In questo modo posso avere tutti i file che voglio in lib e non rallentano tutto. include path è '/lib/dojo/dojo.js'. – Mathieu

+0

nice fix, dovresti inviare loro una patch e postare questa risposta come risposta sotto – Milimetric

+0

La soluzione suggerita da @Mathieu dovrebbe funzionare bene per questo scopo, ma Meteor dovrebbe supportare qualcosa di simile in questo modo. Questo è anche archiviato come un problema GitHub, che è il luogo appropriato per continuare a discutere di questo argomento, o per tracciare la sua risoluzione. https://github.com/meteor/meteor/issues/437 – avital

risposta

2

Questo è un grosso problema per le applicazioni su larga scala costruiti in Meteor. Ho parlato con Matt a Meteor, e ha detto che il loro team sta lavorando a una soluzione a questo problema per una delle loro prossime versioni. Quindi vai alla loro newsletter e sarai avvisato quando sarà disponibile.

Mathieu, il tuo commento:

ho finalmente trovato una soluzione. Sto mettendo tutto in/public/lib /. Quindi, riga 286 di /usr/lib/meteor/app/run.js, sto aggiungendo la cartella che non voglio che Meteor guardi: self.exclude_paths = [path.join (app_dir, '.meteor', ' local '), path.join (app_dir,' public ',' lib ')]; In questo modo posso avere tutti i file che voglio in lib e non rallentano tutto. include path è '/lib/dojo/dojo.js'.

è un buon trucco per ora, e qui ci sono le altre questioni che si riferiscono, che saranno anche trattate nella prossima release:

  • Alcuni pacchetti hanno dipendenze si sovrappongono, ma non li escludono come in PHP require_once().

  • Originario/richiedono definire loader sceneggiatura dinamica, quindi non tutti i file vengono caricati in entrata che può calcolare ordine di dipendenza, senza dover passare i livelli, lib o principali. *

  • un modo ufficiale per creare e distribuire pacchetti in un repository. Attualmente utilizza Meteorite (mrt) e Atmosphere.

+0

L'obiettivo è avere meteor service ma non guardare i file di asset in una directory, preferibilmente tutti i file video di grandi dimensioni che ho in pubblico. La tua riga exclude_paths continua a servire i file? –

3

realizzato questo è duplicato per: generating and serving static files with Meteor

vedi: https://github.com/meteor/meteor/issues/437

Questo è stato un grosso problema per me. Devo servire ~ 12000 immagini statiche, che inizialmente ho inserito nella cartella pubblica. Ciò ha causato l'utilizzo costante del nodo quasi al 100% di un core della CPU. Con memoria limitata, l'app si arresta in modo anomalo.

La soluzione che sto utilizzando per il momento

  • creare la cartella public/.#static/ e spostare tutti i beni statici in esso. Questa cartella non viene osservata da meteora
  • gli URL prefisso con statica (/img/cat.png -> /static/img/cat.png)
  • installare il pacchetto mimo NPM

    cd ~/.meteor/tools/latest/lib/node_modules/ 
    npm install mime 
    
  • creare un rawConnectionHandler per servire gli attivi (crediti a: https://stackoverflow.com/a/20358612) del server /static_files_handler.coffee

    fs = Npm.require('fs') 
    mime = Npm.require('mime') 
    WebApp.rawConnectHandlers.use (req, res, next) -> 
        re = /^\/static\/(.*)$/.exec(req.url) 
        if re isnt null # Only handle URLs that start with /static/* 
        filePath = process.env.PWD + "/public/.#static/" + re[1] 
        type = mime.lookup(filePath) 
        data = fs.readFileSync(filePath, data) 
        res.writeHead 200, 
         "Content-Type": type 
    
        res.write data 
        res.end() 
        else # Other urls will have default behaviors 
        next() 
        return 
    

Limitazioni di questo approccio:

  • non adatto a servire le risorse con parametri di query. La regex corrisponderebbe anche a /static/html/image.html?src=/static/img/cat.png cercando di servire un file con il nome del file che include i parametri. Questo è facile da cambiare.
  • Meteor è completamente all'oscuro dei file, pertanto non vengono inclusi nel manifest dell'appcache. Se si vuole renderli disponibili offline, controlla l'opzione addPaths ho aggiunto al https://github.com/buildhybrid/appcache-extra

Se non si vuole risolvere i problemi, prendere in considerazione al servizio dei beni da un servizio esterno (es. AWS S3) .

+0

c'è un problema se andrai a distribuire questa app su * .meter.com - questo causerà un errore - questo perché Meteor ignora (e in realtà non ha). –