Node js/Express js относительные пути (точка или __dirname или без какого-либо префикса)?

Я смотрю на Nodejs/expressjs и видел разные учебники, используя либо __diranme + "/my_folder", "./my_folder", либо просто "my_folder".

Примеры:

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

Я попробовал их всех, и все они, похоже, работают; который я должен использовать для относительных путей?

Я также видел require('./my_file.js') и require('my_file'). Есть ли разница? Что я должен использовать?

Ответ 1

Почти любая функция (кроме require), которая принимает пути к файлам в качестве аргумента, в какой-то момент будет использовать функции из модуля fs для чтения или записи на них.

Node.js документация для модуля fs говорит:

Относительный путь к имени файла можно использовать, помните, однако, что этот путь будет относиться к process.cwd().

Когда вы думаете об этом, это потребует значительного обмана, чтобы эти функции вели себя по-другому. В конце концов, функции fs являются регулярными Javascript, и у них нет специального доступа к информации о вызывающем. Единственным __dirname, к которому они могли получить доступ, будет __dirname собственного модуля (модуль ядра fs).

Тот факт, что функция require может разрешать пути относительно текущего __dirname, без указания этого явно, заключается в том, что require является уникальной функцией для каждого отдельного файла, в котором он появляется. Таким образом, он имеет доступ к текущим спецификациям модуля и, в частности, к его пути.

Причина, по которой ваш код работает, заключается в том, что в настоящее время app.js (или аналогичный) приведенный выше код находится в том же каталоге, что и process.cwd(). То есть запуск приложения с помощью node app.js будет работать, а запуск приложения с помощью node myappdir/app.js (выполняется из его родительского каталога) не будет. process.cwd() будет отличаться.

Пока вы помните, что относительные пути будут разрешены с помощью process.cwd(), тогда вы можете использовать более короткий синтаксис. В некоторых случаях это может быть преимуществом. Это делает ваш код зависимым от того, как он называется. Я лично предпочитаю использовать __dirname, потому что он несколько более прозрачен в отношении того, что происходит, и относительные пути, согласованные с путями, которые вы используете в инструкции require для того же файла.

Ответ 2

Версия __dirname является самой надежной, так как __dirname всегда будет каталогом, содержащим текущий исполняемый файл .js, который лучше привязан, чем "my_folder" или "./my_folder", которые являются как относительными путями, так и если текущий рабочий каталог процесса (process.cwd()) является чем-то неожиданным, что вполне возможно.

Обратите внимание, что это другая история для путей, переданных в require, поскольку относительные пути там разрешены относительно местоположения вызывающего модуля независимо от текущего рабочего каталога процесса (опять же, это делает их менее хрупкими). ​​

Ответ 3

Я использую app.use(express.static(path.join(__dirname, 'public')));, который затем имеет три папки внутри моего общедоступного, стилей, javascripts и изображений, что позволяет мне получить доступ к этим статическим файлам с помощью

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

Подход ./myfolder, который я считаю, по сути, является одним и тем же. Я никогда не использовал его.
подход /myfolder, который я никогда не видел.

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

require('myfile') - это вызов пакетов, которые вы устанавливаете или устанавливаете с помощью express.