在使用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
原文地址:https://www.cnblogs.com/imjtzhang/p/11951842.html