节点js / Express js相对路径(点或__dirname或没有任何前缀)?

时间:2013-05-24 02:58:20

标签: node.js express

我正在查看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')。有区别吗?我该怎么用?

3 个答案:

答案 0 :(得分:15)

几乎任何以文件路径为参数的函数(require除外)都会使用fs模块中的函数来读取或写入它们。

Node.js documentation for fs module说:

  

可以使用文件名的相对路径,但请记住,此路径将相对于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语句中使用的路径一致。

答案 1 :(得分:4)

__dirname版本最强大,因为__dirname将始终是包含当前正在执行的.js文件的目录,这是比"my_folder"或{{更好的锚点1}}这两个都是相对路径,如果进程的当前工作目录("./my_folder")出现意外情况,则会失败,这是完全可能的。

请注意,对于传递给process.cwd()的路径,它是一个不同的故事,因为相对于调用模块的位置解析相对路径而不考虑进程的当前工作目录(再次,这使它们不那么脆弱)

答案 2 :(得分:1)

我使用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安装的软件包的调用。