2015-08-24 4 views
5

Manchmal möchte ich (in einem lokalen Node-Skript) mit einem Aspekt von Angular - z. Dienste, DI usw. - Dinge, die nichts mit dem Browser oder dem DOM zu tun haben. Gibt es eine Möglichkeit, das zu tun? d. h. Laden eines Teils der Eckigen Infrastruktur? Wenn ich nur verlangen ("Winkel") in einem Knoten Skript, es klagt:Eckig, ohne Browser?

ReferenceError: window is not defined 

, die sinnvoll, weil Angular Leben für das Browser-Fenster macht.

Aber es scheint, als könnten einige Teile von Angular für Nicht-Web-Anwendungen verwendet werden - obwohl das nicht mein Grund dafür ist, dies zu fragen. Ich versuche nur, mein Verständnis zu verbessern Angular und manchmal möchte ein kleines Experiment machen, während Sie so viel wie möglich strippen/ignorieren.

+3

Sandboxes wie [ploker] (http://plnkr.co/edit/?p=catalogue) sind ideal, da sie während des Schreibens neu laden und in Sekunden eine neue App erstellen können. – charlietfl

+0

Angular funktioniert nicht ohne a Browser. Dies ist etwas, das sie planen (ich habe irgendwo gelesen) für Nicht-Browser-Clients, die JS ausführen, aber noch nicht –

Antwort

3

Experimentieren mit Angular ist am besten in einem Browser durchgeführt, aufgrund window und andere API Angular stützt sich auf.

Wenn Sie jedoch Angular mit Knoten verwenden möchten, können Sie in das vm-Modul schauen, das Sie im Wesentlichen eval mit einem bestimmten Stand-in-Objekt als eine Art globales Proxy-Objekt codiert. Beispiel:

const vm = require('vm'); 
const fs = require('fs'); 

const test = fs.readFileSync('./test.js', 'utf-8'); 

const windowProxy = { 
    document: { 
     createElement: function() { 
      return { 
       setAttribute: function() {}, 
       pathname: '' 
      } 
     }, 
     querySelector: function() {}, 
     addEventListener: function() {} 
    }, 
    location: { 
     href: '' 
    }, 
    addEventListener: function() {} 
}; 
windowProxy.window = windowProxy; 

vm.createContext(windowProxy); 

vm.runInContext(test, windowProxy); 

wird zumindest Angular laden, ohne sich zu beschweren. Zweifellos würden Sie auf mehr Fehler treffen und müssten die fehlenden Browser-APIs selbst füllen.

Sie könnten auch in PhantomJS nach einer robusteren Testumgebung suchen, obwohl dies nicht länger Node wäre.