Nodejs自带的模块,路径是相对于运行时,还是引入的时候?
发布于 2 年前 作者 AmandaYi 2572 次浏览 来自 问答

比如,在一个file.js里面, 引入fs模块 然后, 其中的一个函数中有一条语句是 fs.readdir(“某一个路径”,(err, files)=>{

});

然后其他的文件调用这个文件,比如入口文件调用这个文件file.js 在index.js中写到

var file = require("./models/file.js"); 调用: file.上面友fs.readdir语句的函数, 那么, Nodejs自带的模块,路径是相对于运行时,还是引入的时候?

10 回复

1.index.js引用file.js,file.js开始运行。 2.file.js运行时引用fs模块。 应该是这样。

读文件相对的是你是用函数的那个文件

来自酷炫的 CNodeMD

a 引入 b,b 里的相对路径都是基于 a 的

模块引入时的路径解析,是require.resolve,情况很多建议仔细看下文档 fs中路径解析用的时类似path.resolve,基于cwd

二者规则是不同的。

前者,参考文档: require(X) from module at path Y 3. If X begins with ‘./’ or ‘/’ or ‘…/’ a. LOAD_AS_FILE(Y + X) b. LOAD_AS_DIRECTORY(Y + X)

后者,基于process.cwd()为起点的,也就是你启动node时,所在的路径

建议多动手做下实验,加深理解

@alwxkxk 应该是这个样子啊? 我实验了下,和你的刚好相反

@liuqipeng417 主要存在一个问题,一个是内置模块, 一个是自建模块

@mengdu 两种方式,

自己找到答案,了 内建API模块,的 路径调用问题,都是以入口文件index.js为主,然后进行相对路径的,(考虑的情况是,node启动的时候刚好和入口文件index.js在同一个文件夹下面)

然后文件包含或者文件,都是书写的时候的相对路径是什么,然后通过url.resolve进行补全路径之后的绝对路径,之后直接调用

你的理解是不对的,建议再好好看看文档和我上面的回答@AmandaYi

require()别的js文件的时候,将执行那个js文件。

注意: require()中的路径,是从当前这个js文件出发,找到别人。而fs是从命令提示符找到别人。 所以,桌面上有一个a.js, test文件夹中有b.js、c.js、1.txt a要引用b: 1 var b = require(“./test/b.js”); b要引用c: 1 var b = require(“./c.js”);

但是,fs等其他的模块用到路径的时候,都是相对于cmd命令光标所在位置。 所以,在b.js中想读1.txt文件,推荐用绝对路径: 1 fs.readFile(__dirname + “/1.txt”,function(err,data){ 2 if(err) { throw err; } 3 console.log(data.toString()); 4 });

回到顶部