2014-11-19 10 views
6

Ich habe ein Szenario, in dem ich Daten von der Clientseite in CSV exportieren möchte. Ich habe ein Textfeld/einen Bereich oder was auch immer wo der Benutzer Daten eingeben kann und dann wird idealerweise mit einem Klick eine lokale CSV-Datei mit diesen Daten aktualisiert.Knoten JS FS-Modul im Browser

Dies ist leicht mit NodeJS mit Serverinteraktion und seinen Kernmodulen (speziell fs Modul) erreichbar, aber anscheinend nicht so sehr von einem Browser.

Ich fand heraus, dass bestimmte Knoten-Module (zum Beispiel underscore), unterstützen RequireJS Methode, ein bestimmtes Modul im Browser arbeiten. Also für Strich habe ich dies:

methods.js

define(['underscore'],function(_) { 

    var Methods = { 
     doSomething: function() { 

      var x = _.size({one: 1, two: 2, three: 3, xuz: 3}); 

      alert(x); 
     } 
    }; 

    return Methods; 
}); 

common.js

requirejs.config({ 
    baseURL: 'node_modules', 
    paths: { 
     underscore: 'underscore/underscore', 
    } 
}); 

require(['methods'], function(y){ 
    y.doSomething(); 
}); 

index.html

<script data-main="common" src="require.js"></script> 
<script> 
require(['common'], function() { 

    require(['methods.js']); 
}); 
</script> 

Das obige funktioniert gut und wird eine Warnung anzeigen: 4.

Aber wenn ich das gleiche mit dem fs Modul versuche, wird es nicht funktionieren. Es wird diesen Fehler zeigen:

Module name "util" has not been loaded yet for context: _. Use require([]) 

Soweit ich verstehen kann, ist dies, weil fs mehrere andere Module erfordert, einer von ihnen util zu sein.

Also fuhr ich fort, alle diese Module zur RequireJS Config hinzuzufügen. Aber immer noch kein Glück, so dass ich speziell util Modul selbst getestet, da dies nicht andere Module zu funktionieren scheint.

Und jetzt bin ich auf diesem Fehler fest: Uncaught ReferenceError: exports is not defined

ich versuchte, diese util Modul Modularisierung durch das gesamte Modul Quellcode in dieser Verkapselung:

define([], function() {}) 

Aber es hat nicht funktioniert entweder .. Ich habe auch versucht, underscore Modell zu kopieren, aber immer noch kein Glück.

Also habe ich mich gefragt, ob jemand util & fs Module (oder anderen Kern NodeJS Module) innerhalb des Browsers mit Bibliotheken wie RequireJS oder Browserify verwenden, verwaltet.

Antwort

3

Das ist richtig, exports ist Knoten-spezifische JS (verwendet, um einen Teil Ihres Moduls außerhalb des Moduls verfügbar zu machen) und wird nicht von Web-Browsern unterstützt.Obwohl NodeJS technisch JS ist, gibt es clientspezifische Eigenschaften (wie die window-Eigenschaft für Browser und exports für NodeJS-Anwendungen), die nicht vertauscht werden können.

Das sagte, here's eine Client-Seite JS Antwort auf das CSV-Problem.

+1

Beide Antworten, die ich erhielt, sind korrekt, wie ich auch nach mehr Forschung erfahren habe. Was ich jedoch für mein spezifisches Szenario getan habe (um alles von Datenbanken fernzuhalten und möglicherweise für den Benutzer clientseitig), sind zwei NodeJS-Server, die laufen (einer zum Lesen und anderer zum Schreiben). Diese warten auf CSV-Dateiänderungen und schreiben/lesen von/in das Dateisystem über das NodeJS fs-Modul auf diese Weise. Dieser Ansatz ist nicht vollständig Client-Seite, aber Sie vermeiden DB-Interaktion und Wartung und alles ist in JS von Client zu Server-Seite. – zalow517

+0

Nice one! Ich habe auch über http://browserify.org/ seit der Beantwortung erfahren. – FloatingRock

1

Ihre beste Wette (und wahrscheinlich nur eine) ist HTML5 FileSystem API zu verwenden. Mir ist keine andere Browserfunktion bekannt, die das Arbeiten mit Dateien auf Clientcomputern ermöglicht, außer vielleicht Flash und ähnliche Lösungen.

Ich bin etwas verwirrt von Ihrem browserify-Tag, da Sie offensichtlich nicht mit Browserify arbeiten. Das würde Ihr Problem mit "Exporte ist nicht definiert" beheben.