2013-05-24 13 views
12

Sto guardando Nodejs/expressjs e ho visto diversi tutorial utilizzare __diranme + "/my_folder", "./my_folder" o solo "my_folder".Nodi js/Express js percorsi relativi (punto o __dirname o senza alcun prefisso)?

Esempi:

app.use("/static", express.static(__dirname + "/my_folder")); 
app.use("/static", express.static("./my_folder")); 
app.use("/static", express.static("my_folder")); 

le ho provate tutte e tutti sembrano funzionare; quale dovrei usare per i percorsi relativi?

Ho anche visto require('./my_file.js') e require('my_file'). C'è una differenza? Cosa dovrei usare?

+0

Credo che l'ultimo modo di definire le posizioni si interromperà su Windows. Sto usando il 90% di '__dirname + '/ folder'' è l'approccio più sicuro (senza prove concrete, solo esperienze casuali che fanno casino con il nodo in Windows). –

risposta

15

Quasi tutte le funzioni (ad eccezione di require) che accettano percorsi di file come argomento, ad un certo punto utilizzeranno funzioni dal modulo fs per leggere o scrivere su di esse.

Node.js documentation for fs module dice:

percorso relativo al nome del file può essere utilizzato, ricorda, tuttavia, che questo percorso sarà relativo process.cwd().

Quando ci pensi, richiederebbe trucchi importanti per far sì che queste funzioni si comportino in modo diverso. Dopo tutto, le funzioni fs sono normali Javascript e non hanno accesso speciale alle informazioni sul chiamante. L'unico accesso a __dirname potrebbe essere il __dirname del proprio modulo (il modulo fs di base).

Il fatto che il require funzione di può percorsi resolve relativa alla corrente __dirname, senza specificare esplicitamente, è perché require è una funzione unica per ogni singolo file appare in. In questo modo, si ha accesso alla corrente specifiche del modulo, e in particolare il suo percorso.

La ragione per cui il codice capita di lavorare è che attualmente, il app.js (o simile) il codice di cui sopra appare in sembra essere nella stessa directory come quello che attualmente è process.cwd(). Cioè Avviare l'app con node app.js funzionerebbe, mentre l'avvio dell'app con node myappdir/app.js (eseguito dalla sua directory padre) non funzionava. process.cwd() sarebbe diverso.

Se si tiene presente che i percorsi relativi verranno risolti tramite process.cwd(), è possibile utilizzare la sintassi più breve. In alcuni casi può essere un vantaggio. Rende il tuo codice dipendente da come viene chiamato. Personalmente preferisco usare __dirname, perché è un po 'più trasparente su ciò che sta accadendo, e i percorsi relativi coerenti con i percorsi che si usano in una dichiarazione require per lo stesso file.

+0

Grazie, molto informativo. Quindi, se capisco: 'require' sarà sempre relativo al file corrente (usando' punto' o '__dirname'). Tutti gli altri percorsi - che probabilmente passano attraverso 'fs', possono essere relativi al processo con un' punto', e relativi al file di chiamata se passati con '__dirname' – Raekye

+1

Esattamente. Ma facendo '__dirname +" qualche percorso "' è solo una normale concatenazione di stringhe. È un modo speciale di chiamare una funzione o così. Risulta in un percorso assoluto, lasciando fuori qualsiasi spazio per l'interpretazione. –

0

Io uso app.use(express.static(path.join(__dirname, 'public'))); che ho poi ho tre cartelle all'interno dei miei pubblici, fogli di stile, JavaScript e le immagini che mi permette di accedere a tali file statici da

<link rel="stylesheet" href="/stylesheets/jquery-ui.css" /> 
    <script type="text/javascript" src="/javascripts/jquery-1.9.1.js"></script> 

l'approccio ./myfolder credo sia essenzialmente la stessa cosa. Non l'ho mai usato.
l'approccio /myfolder che non ho mai visto.

require('./my_file.js') I use as 
    require('./routes/my_file.js') aand is where I store all my express routes. 

Il require('myfile') è una chiamata a pacchetti che si installano o venire installare con espresso.

4

La versione __dirname è il più robusto dal __dirname sarà sempre la directory che contiene il .js di file attualmente in esecuzione, che è un ancoraggio migliore di "my_folder" o "./my_folder" che sono entrambi i percorsi relativi e non riuscirà se la directory di lavoro corrente del processo (process.cwd()) è qualcosa di inaspettato, che è del tutto possibile.

Si noti che si tratta di una storia diversa per i percorsi passati a require, poiché i percorsi relativi vengono risolti in relazione alla posizione del modulo di chiamata senza tenere conto della directory di lavoro corrente del processo (di nuovo, ciò li rende meno fragili).

+0

Per richiedere, dovrei includere l'estensione? Come vedo spesso 'require (__ dirname +"/something ")' ma perché non 'require (__ diranem +" /something.js ")' (che sembra funzionare anche)? – Raekye

+0

Modifica: Trovato 'Se il nome file esatto non viene trovato, il nodo tenterà di caricare il nome file richiesto con l'estensione aggiunta di .js, .json e quindi .node. Sui documenti (prima lo mancate, trovandolo in cerca per qualcos'altro). Così ora so come funziona, ma pensi che sia una buona abitudine essere espliciti o ... impliciti (mi ricorda python xD) – Raekye

+0

La convenzione non è un nome file (implicito) e penso che sia buona. Puoi anche passare da 'module.js' a' module/index.js' e i programmi che usano la tua libreria non devono preoccuparsi o essere aggiornati. –

Problemi correlati