2013-01-19 7 views
8

Ich schrieb ein einfaches npm-Modul, um meine Lenkervorlagen vorkompilieren, wenn ich Django-Kompressor verwende, um Nachbearbeitung für einige clientseitige Komponenten durchzuführen, und stellte fest, dass ich das npm-Modul mit ein paar js-Dateien versenden musste.Wie referenzieren lokale Dateien in einem NPM-Modul?

Derzeit gehe ich davon nur niemand dies mit dem globalen Flag installiert, weil ich auf diese Abhängigkeiten im npm Modul selbst

Beispiel Layout meiner npm Modul

„hart codiert“ den Pfad habe

/
*/bin
* /lib/main.js
* /vendor/ember.js

Jetzt innen main.js ich möchte die Glut verwenden js-Datei ... Derzeit ist mein hart codiert Ansatz sieht wie folgt aus

var emberjs = fs.readFileSync('node_modules/django-ember-precompile/vendor/ember.js', 'utf8'); 

Wieder -Diese funktioniert nur, weil ich Sie es lokale nehmen installieren, aber ich möchte node.js denken, hat eine mehr legit Weg zu bekommen lokal eingebettete Dateien

Wer weiß, wie ich dies verbessern kann, um mehr "global" freundlich zu sein?

Antwort

1

Sie können das Verzeichnis der aktuellen Datei abrufen und Ihre Dateipfade relativ dazu erstellen.

var path = require('path') 
, fs = require('fs'); 

var vendor = path.join(path.dirname(fs.realpathSync(__filename)), '../vendor'); 
var emberjs = fs.readFileSync(vendor + '/ember.js', 'utf8'); 

Hoffe, dass hilft!

3

Eine der großen Stärken von Node.js ist, wie schnell Sie in Betrieb gehen können. Der Nachteil dieses Ansatzes besteht darin, dass Sie gezwungen sind, die Entwurfsmuster anzupassen, um die es herum gebaut wurde.

Dies ist ein Beispiel, bei dem sich Ihr Ansatz zu sehr vom Ansatz der Knoten unterscheidet. Der Knoten erwartet, dass alles in einem Modul aus den Modulen exportiert wird, einschließlich der Vorlagen.

Verschieben Sie die readFileSync in das Modul django-ember-precompile, und geben Sie den zurückgegebenen Wert über einen Modulexport in lib/main.js frei.

Beispiel:

package.json 
    { 
    "name": "django-ember-precompile", 
    "main": "lib/main.js" 
    } 
lib/main.js 
    module.exports.ember = readFileSync('vendor/ember.js') 
vendor/ember.js 

Sie erhalten Ihre Vorlage über

var template = require('django-ember-precompile').ember 

Dieses Beispiel kann verfeinert werden, aber die Grundidee ist die gleiche.

Verwandte Themen