21

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

4

3 回答 3

20

require几乎所有将文件路径作为参数的函数(除了),都会在某一时刻使用fs模块中的函数来读取或写入它们。

fs 模块的 Node.js 文档说:

可以使用文件名的相对路径,但请记住,此路径将相对于 process.cwd()。

当您考虑它时,要使这些函数的行为有所不同,将需要很大的技巧。毕竟,fs 函数是常规的 Javascript,它们没有特殊的访问权限来获取调用者的信息。他们唯一__dirname可以访问的__dirname是他们自己的模块(核心 fs 模块)。

require函数可以解析相对于 current 的路径__dirname,而无需明确指定这一事实,因为require对于它出现的每个文件来说都是一个唯一的函数。这样,​​它可以访问当前模块的细节,尤其是它的路径。

您的代码恰好可以工作的原因是当前,app.js上面出现的(或类似的)代码恰好与当前所在的目录位于同一目录process.cwd()中。即启动应用程序node app.js会起作用,而启动应用程序node myappdir/app.js(从其父目录运行)则不会。process.cwd()会有所不同。

只要您记住相对路径将通过 解析process.cwd(),那么您可以使用较短的语法。在某些情况下,它可能是一个优势。它确实使您的代码依赖于它的调用方式。我个人更喜欢 using __dirname,因为它对于正在发生的事情更加透明,并且相对路径与您在require同一文件的语句中使用的路径一致。

于 2013-05-24T08:06:35.687 回答
8

__dirname版本是最健壮的,因为__dirname它将始终是包含当前执行.js文件的目录,它是一个更好的锚点,"my_folder"或者"./my_folder"它们都是相对路径,并且如果进程的当前工作目录 ( process.cwd()) 出现意外,这将失败,这是完全可能的。

请注意,传递给 的路径是另一回事require,因为相对路径是相对于调用模块的位置解析的,而不考虑进程的当前工作目录(同样,这使得它们不那么脆弱)。

于 2013-05-24T04:50:50.983 回答
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 安装的软件包的调用。

于 2013-05-24T03:17:59.563 回答