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.