2013-01-19 15 views
8

Ho scritto un semplice modulo npm per precompilare i miei modelli manubri quando uso il compressore django per eseguire la post-elaborazione per alcuni componenti lato client e ho scoperto che ho bisogno di spedire il modulo npm con alcuni file js.Come fare riferimento a file locali in un modulo npm?

Attualmente ho solo supporre che nessuno sta installando questo con il flag globale perché ho "hard coded" il percorso di queste dipendenze nel modulo NPM sé

esempio il layout del mio modulo NPM

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

Ora all'interno main.js che voglio usare la brace js file di ... Attualmente il mio duro approccio codificato assomiglia a questo

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

-questo Anche in questo caso funziona solo perché suppongo di installarlo locale, ma mi piacerebbe pensare node.js ha un modo più legittimo per ottenere file incorporati localmente

Qualcuno sa come posso migliorare questo per essere più "globale" amichevole?

risposta

1

Quello che puoi fare è ottenere la directory del file corrente e rendere i percorsi dei file relativi.

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'); 

Spero che questo aiuti!

3

Uno dei grandi punti di forza di Node.js è la rapidità con cui è possibile iniziare a funzionare. Lo svantaggio di questo approccio è che siete costretti ad adattare gli schemi di progettazione in cui è stato costruito.

Questo è un esempio in cui il vostro approccio differisce troppo dall'approccio Nodi. Il nodo si aspetta che tutto in un modulo sia esposto dalle esportazioni dei moduli, inclusi i modelli.

Spostare readFileSync nel modulo django-ember-precompile, quindi esporre il valore restituito tramite un modulo di esportazione in lib/main.js.

Esempio:

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

È possibile ottenere il modello tramite

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

Questo esempio può essere raffinato, ma l'idea di base è la stessa.

Problemi correlati