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


 上一篇
linux虚拟机安装 linux虚拟机安装
1.win10中自带了hyper-v虚拟机软件,选中hyper-v后重启电脑2.可以在开始菜单中找到hyper-v管理器,
2020-03-26
下一篇 
webpack学习 webpack学习
webpack五大核心概念核心概念入口module.exports = { entry: './path/to/my/enter/file.js' }; /* 告知webpack从哪个文件开始去阅读去查验代码 */ 输出const
2019-07-24
  目录