2015-03-21 13 views
6

Come posso includere tutti i file in nodeJS comeCome posso richiedere moduli con pattern nel percorso?

require('./packages/city/model/cities') 
require('./packages/state/model/states') 
require('./packages/country/model/countries') 

come come

require('./packages/*/model/*') 

stesso grugnito come sta caricando i file.

risposta

4

Non è possibile (o almeno non si dovrebbe)

Per fare questo, si dovrebbe sovraccaricare nativa require la funzione del nodo, che è altamente sconsigliabile.

Il pattern CommonJS potrebbe sembrare noioso, ma è molto buono e non dovresti cercare di romperlo solo perché hai visto scorciatoie in altri linguaggi/framework.

Introducendo una qualche forma di magia nel modulo, si cambia improvvisamente tutto ciò che i programmatori possono (e dovrebbero essere in grado di) assumere con sicurezza sul modello CommonJS stesso.

+0

Grazie macek. – 9me

2

A causa della corrispondenza uno a uno nel sistema di caricamento del modulo del nodo, non sarà possibile in modo nativo, ma non sarebbe sorpreso se esiste un pacchetto per questo metodo.

Il meglio che puoi fare è creare un file index.js che carichi i moduli presenti nella directory e li esporti come se fossero i suoi.

module.exports = function() { 
    return { 
     city : require('./city/model/'), 
     state : require('./packages/state/model/'), 
     country : require('./packages/country/model/') 
    } 
} 

si dovrebbe caricare modelli in modo simile in tutte e tre le directory.

So che questa soluzione non è ciò che si sta cercando, ma nella mia esperienza, questo metodo consente di gestire meglio i pacchetti personalizzati in quanto è possibile aggiungere/rimuovere facilmente le funzionalità.

1

Node.js di require consente lo

  1. carico solo modulo alla volta solo

  2. moduli di carico in modo sincrono.

Ecco come funziona il sistema dei moduli in Node.js. Ma se si vuole avere tipo minimatch di funzionalità di corrispondenza, si può rotolare uno per conto proprio, come questo

var path = require("path"), 
    glob = require("glob"); 

function requirer(pattern) { 
    var modules = {}, 
     files = glob.sync(pattern); 

    files.forEach(function(currentFile) { 
     var fileName = path.basename(currentFile); 
     fileName = fileName.substring(0, fileName.lastIndexOf(".js")); 
     modules[fileName] = require(currentFile); 
    }); 

    return modules; 
} 

Questo dipende glob modulo, che consente di utilizzare i modelli minimatch per cercare i file e quindi si richiede la trova i file, li memorizza in un oggetto e restituisce l'oggetto. E questo può essere utilizzato in questo modo

var modules = requirer('./packages/*/model/*.js'); 
console.log(modules.cities); 

P.S: Sto lavorando a rendere questo un public module già.

Problemi correlati