node中的require是如何加载模块的

在使用node引入模块的时候,我发现node自带的模块或是npm安装的第三方模块,只需要require个名字就可以加载到了,像是

require('fs')
require('http')
require('express')

但是自己写的模块就必须要加上路径,比如

require('./a')
require('a')//这样就不行,

为什么第三方模块就不需要加路径呢?express的路径明明是node_modules/express/index.js

那是不是我把自己写的模块放到node_modules目录下就不需要写路径了呢,于是我在node_modules目录下创建了

然后直接require('a'),果然不报错了。

这其中必有蹊跷啊,查了一圈,终于弄明白了require的加载规则

node自带的核心模块

核心模块的本质也是文件,但是我们看不到,因为他们已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。

自定义模块

需要以路径形式引用,如果不写路径,会被认为是核心模块或是第三方模块,

require('a')就会去找这个名字的核心模块和第三方模块,找不到就报错了。

第三方模块

以express为例

node在require时会先判断你是不是核心模块,或者是不是路径形式的模块,如果都不是

就会先找到当前文件所处目录中的node_modules 目录,然后一级一级向下找

node_modules/express
node_modules/express/package.json 
node_modules/express/package.json 中的 main 属性

这个main属性中就记录了express的入口模块

然后加载使用这个第三方包

如果package.json文件不存在或者 main指定的入口模块也没有

则node会自动找该目录下的index.js

也就是说 index.js 会作为一个默认备选项

如果以上所有任何一个条件都不成立,则会进入上一级目录中的node_modules目录查找

如果上一级还没有,则继续往上上一级查找

如果直到当前磁盘根目录还找不到,最后报错:can not find module xxx

猜你喜欢

转载自www.cnblogs.com/imjtzhang/p/11951842.html