首页 > 试题广场 >

在文件homesomebodyworkspaceso

[单选题]
在文件/home/somebody/workspace/somemodule.js中第一行引用了一个模块:require(‘othermodule‘),请问require查找模块的顺序是:

A. /home/somebody/workspace/node_modules/othermodule/index.js
B. /home/somebody/workspace/node_modules/othermodule. Js
C.CORE MODULES named othermodule
D./home/somebody/node_modules/othermodule/index.js
  • C D A B
  • C B D A
  • C B A D
  • C D B A
推荐
(1):首先,Node在当前目录下查找package.json(CommonJS包规范定义的包描述文件),通过JSON.parse()解析出包描述对象,从中取出main属性指定的文件名进行定位。如果文件缺少扩展名,将会进入扩展名分析的步骤。   (2):而如果main属性制定的文件名错误,或者压根没有package.json文件,Node会将index当做默认文件名,然后依次查找index.js、index.node、index.json.   (3):如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败异常。   按照上面的思路,首先应该查找package.json文件,看看里面有没有核心模块,应该是C最先,othermodule不是核心模块,那么接着应该进入扩展名分析的步骤,就应该是查找othermodule. js,对应B,紧接着就是以index为默认文件名,也就是A,再接下来就是上一个文件目录D了,
所以答案是: C B A D
编辑于 2015-02-03 14:58:00 回复(12)
首先加载核心模块,不管有没有同名/同目录的情况下,核心模块优先加载.

其次按照相对路径/绝对路径加载文件模块(加载顺序,首先试图按照路径查找 .js 扩展名的文件,如果没有,试图按照路径查找 .json 扩展名的文件,如果还是没有,就按照路径查找 .node 扩展名的c++模块了)

最后搜索 node_modules 目录下通过npm下载的第三方模块. 

注意:首次加载这类模块最慢,因为执行文件所在目录的node_mondel 文件夹下找不到时,会去父级node_mondel 文件夹里查找,如果还是找不到会去父级的父级node_mondel 文件夹里查找.......但是,只要首次加载成功后,node就会缓存起来,它缓存的是编译后的二进制模块,所以以后的加载速度和效率都的有保证的.

编辑于 2017-09-04 17:29:30 回复(3)
发表于 2020-02-14 16:28:27 回复(0)
答案:  C. C B A D
考察点:nodejs模块分类、模块查找策略
一、题目中的'othermodule'模块属于文件模块下的自定义模块
二、加载顺序:缓存->核心模块->文件模块
这里找到了😀C.CORE MODULES named othermodule 

三、文件模块路径分析

1、查找当前目录下的node_modules目录,看是否有匹配项,如有,命中文件
这里找到了😀B. /home/somebody/workspace/node_modules/othermodule. Js 
接着结合“文件定位”的知识点,找到了😀A. /home/somebody/workspace/node_modules/othermodule/index.js 
2、寻找父目录的下的node_modules,如有,命中文件
这里找到了😀D./home/somebody/node_modules/othermodule/index.js

3、按照这个规则一直往父目录搜索直到到根目录下的node_modules

四、完成路径分析后,进行文件定位

1、情况1:当前路径命中的是一个文件

(1)有扩展名 => 找到了

(2)没有扩展名:按照.js,.node,.json这个顺序逐个进行尝试

2、情况2:当前路径命中的是一个目录

(1)首先会在命中的目录下寻找package.json这个文件并用JSON.parse进行解析,取出json文件中main属性的值,作为命中的文件

(2)如果找不到package.json或者对应的main属性,那么会用这个目录下面index文件作为命中文件,依旧是按照.js,.node,.json这个顺序逐个进行尝试

(3)如果依旧找不到index,那么此次文件定位失败,将会按照上面提到的路径遍历规则,往上一级继续寻找
五、完整的模块加载顺序示意图:

编辑于 2021-11-18 17:00:13 回复(0)
引用依依

(1):首先,Node在当前目录下查找package.json(CommonJS包规范定义的包描述文件),通过JSON.parse()解析出包描述对象,从中取出main属性指定的文件名进行定位。
如果文件缺少扩展名,将会进入扩展名分析的步骤。

(2):而如果main属性制定的文件名错误,或者压根没有package.json文件,Node会将index当做默认文件名,然后依次查找index.js、index.node、index.json.

(3):如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败异常

-----------
按照上面的思路,首先应该查找package.json文件,看看里面有没有核心模块,应该是C最先,othermodule不是核心模块,那么接着应该进入扩展名分析的步骤,就应该是查找othermodule. js,对应B,紧接着就是以index为默认文件名,也就是A,再接下来就是上一个文件目录D了,所以答案是: C B A D

发表于 2018-10-27 09:23:59 回复(0)
这里有详细的模块引入机制的分析 https://owenlittlewhite.top/2018/10/05/nodejs-require/
发表于 2019-08-23 11:46:53 回复(0)
(1):首先,Node在当前目录下查找package.json(CommonJS包规范定义的包描述文件),通过JSON.parse()解析出包描述对象,从中取出main属性指定的文件名进行定位。如果文件缺少扩展名,将会进入扩展名分析的步骤。   (2):而如果main属性制定的文件名错误,或者压根没有package.json文件,Node会将index当做默认文件名,然后依次查找index.js、index.node、index.json.   (3):如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败异常。   按照上面的思路,首先应该查找package.json文件,看看里面有没有核心模块,应该是C最先,othermodule不是核心模块,那么接着应该进入扩展名分析的步骤,就应该是查找othermodule. js,对应B,紧接着就是以index为默认文件名,也就是A,再接下来就是上一个文件目录D了, 所以答案是: C B A D
发表于 2017-04-07 07:42:35 回复(0)
node会优先查找package.json这个文件,然后查找package.json文件里的main属性对应的xxx.js。如果没有main这个键或者没有找到xxx.js,则开始找当前目录下的index.js,没有就进入上一层目录找,直到报错!
发表于 2019-04-25 10:15:32 回复(0)
首先加载核心模块,不管有没有同名/同目录的情况下,核心模块优先加载.

其次按照相对路径/绝对路径加载文件模块(加载顺序,首先试图按照路径查找 .js 扩展名的文件,如果没有,试图按照路径查找 .json 扩展名的文件,如果还是没有,就按照路径查找 .node 扩展名的c++模块了)

最后搜索 node_modules 目录下通过npm下载的第三方模块. 

注意:首次加载这类模块最慢,因为执行文件所在目录的node_mondel 文件夹下找不到时,会去父级node_mondel 文件夹里查找,如果还是找不到会去父级的父级node_mondel 文件夹里查找.......但是,只要首次加载成功后,node就会缓存起来,它缓存的是编译后的二进制模块,所以以后的加载速度和效率都的有保证的.
发表于 2017-10-23 10:29:41 回复(0)
①加载核心模块
②加载文件模块(先找js拓展名,再找json拓展名,之后找c++拓展名)
③加载第三方模块
发表于 2022-03-05 19:50:18 回复(0)
先从当前的node_modules目录下查找,如果没有找到, 则从自身出发向父级的node_modules目录下查找,直到找到为止
发表于 2021-12-11 21:11:39 回复(0)
见notability的node_1 ‘
发表于 2021-10-13 09:32:33 回复(0)
哈哈哈哈,我就按照就近原则来做了
发表于 2020-09-01 10:40:21 回复(0)