2012-07-16 2 views
15

Ich möchte Dojo Toolkit mit Meteor verwenden.Wie kann Meteor daran gehindert werden, sich Dateien anzusehen?

  1. ich den ganzen Dojo Toolkit Baum in, ich schließe es mit auf der Client-Seite Dann /public

  2. zuerst kopieren:

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

Alles funktioniert gut, außer Meteor ist überwacht tatsächlich jede einzelne Datei in /public auf Änderungen, damit sie den Server neu starten kann. Dies verursacht tatsächlich eine sehr lange Verzögerung während der ersten Anfrage unter localhost:3000.

Gibt es eine Möglichkeit, Meteor daran zu hindern, Dateien aus einem bestimmten Verzeichnis anzusehen?


Dojo Toolkit ist 10k + Dateien, damit ich die EMFILE Fehler here angegeben erhalten, korrigiert mit

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

fand ich endlich eine Abhilfe. Ich setze alles in/public/lib /. Dann , Linie 286 von /usr/lib/meteor/app/run.js, Ich füge den Ordner Ich möchte nicht Meteor sehen: 'self.exclude_paths = [ path.join (APP_DIR, '.meteor', 'lokal'), path.join (APP_DIR, 'öffentlich', 'lib') ]; ' So kann ich beliebig viele Dateien in lib haben, und sie verlangsamen nicht alles. Include Pfad ist '/lib/dojo/dojo.js'. – Mathieu

+0

schön fix, sollten Sie sie einen Patch und poste dies als eine Antwort unter – Milimetric

+0

Die Abhilfe @Mathieu schlägt vor, sollte okay sein für diesen Zweck schicken, aber Meteor sollte nativ so etwas wie dieses unterstützen. Dies wird auch als eine GitHub-Ausgabe eingereicht, die der geeignete Ort ist, um diese Angelegenheit weiter zu diskutieren oder ihre Lösung zu verfolgen. https://github.com/meteor/meteor/issues/437 – avital

Antwort

2

Dies ist ein großes Problem für Anwendungen in großem Maßstab in Meteor gebaut. Ich habe mit Matt bei Meteor gesprochen und er sagte, dass ihr Team an einer Lösung für dieses Problem für eine ihrer bevorstehenden Veröffentlichungen arbeitet. Holen Sie sich ihren Newsletter und Sie werden benachrichtigt, sobald sie verfügbar ist.

Mathieu, Ihr Kommentar:

fand ich endlich eine Abhilfe. Ich stelle alles in/public/lib /. Dann, Zeile 286 von /usr/lib/meteor/app/run.js, füge ich den Ordner hinzu, den Meteor nicht sehen soll: self.exclude_paths = [path.join (app_dir, '.meteor', ' local '), path.join (app_dir,' public ',' lib ')]; Auf diese Weise kann ich beliebig viele Dateien in lib haben und sie verlangsamen nicht alles. Include-Pfad ist '/lib/dojo/dojo.js'.

ist ein guter Hack für jetzt und hier sind die anderen Fragen, die das wird auch in der kommenden Version abgedeckt beziehen:

  • Einige Pakete überlappende Abhängigkeiten, aber nicht ausschließen, sie nicht wie in PHP require_once().

  • Eine native benötigen/dynamischen Skript loader definieren, so dass nicht alle Dateien auf Eintrag geladen werden, eine, die Abhängigkeit Ordnung berechnen kann, ohne Ebene, lib oder Haupt gehen. *

  • Ein offizieller Weg zu schaffen und Bereitstellen von Paketen in einem Repository Derzeit verwendet es Meteorite (mrt) und Atmosphere.

+0

Das Ziel ist Meteor haben dienen aber nicht die Asset-Dateien in einem Verzeichnis ansehen, vorzugsweise alle großen Videodateien, die ich öffentlich habe. Unterstützt Ihre exclude_paths-Zeile weiterhin die Dateien? –

3

realisiert dies ist zu duplizieren: generating and serving static files with Meteor

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

Dies ist ein großes Problem für mich war. Ich muss ~ 12000 statische Bilder liefern, die ich zuerst in den öffentlichen Ordner gelegt habe. Dies führte dazu, dass der Knoten konstant fast 100% eines CPU-Kerns verwendete. Mit begrenztem Speicher stürzt die App ab.

Die Abhilfe, die ich bin im Moment mit

  • erstellen Sie den Ordner public/.#static/ und alle statischen Vermögenswerte hinein bewegen. Dieser Ordner wird nicht von Meteor beobachtet
  • Präfix Urls mit statischen (/img/cat.png -> /static/img/cat.png)
  • das Paket mime npm

    cd ~/.meteor/tools/latest/lib/node_modules/ 
    npm install mime 
    
  • erstellen rawConnectionHandler installieren, um die Vermögenswerte (Kredite: https://stackoverflow.com/a/20358612) dienen 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 
    

Einschränkungen dieses Ansatzes:

  • nicht geeignet, um Assets mit Abfrageparametern zu versorgen. Die Regex würde auch /static/html/image.html?src=/static/img/cat.png versuchen, eine Datei mit dem Dateinamen einschließlich der Parameter zu liefern. Das ist leicht zu ändern.
  • Meteor ist völlig ahnungslos von den Dateien, also sie nicht in das AppCache Manifest enthalten bekommen. Wenn Sie wollen, dass sie offline verfügbar machen, die addPaths Option Besuche ich https://github.com/buildhybrid/appcache-extra hinzugefügt

Wenn Sie nicht um die Probleme arbeiten wollen, sollten Sie die Vermögenswerte von einem externen Dienst dient (ex. AWS S3) .

+0

Es gibt ein Problem, wenn Sie diese App auf * .meter.com deployen - dies wird einen Fehler verursachen - das liegt daran, dass Meteor ignoriert (und tatsächlich keine). # Statisches Verzeichnis –

Verwandte Themen