为了避免重复加载,提高模块加载效率,会优先从缓存加载,由于在 a 中已经加载 b 了,所以此时 require('./b');
并不会重复执行里面的代码,仅可以拿到里面的接口对象,如下
require(’模块标识符
’);
模块标识符:
- 核心模块(模块名)
- 核心模块的本质是文件,只是已经被编译到了 node 二进制文件中
- 例如:
require('fs'); require('http'); 等
- 第三方模块(模块名)
- 凡是第三方模块都必须通过 npm 来下载
- 使用的时候就可以通过
require('包名')
的方式进行加载才可以使用 - 不可能有任何一个第三方包和核心模块的名字是一样的
- 加载步骤:
- 先找到当前文件所处目录中的 node_modules 目录
- 再找到 node_modules/art-template/package.json 文件中的 main 属性
- main 属性中就记录了 art-template 的入口模块
- 然后加载使用这个第三方包(实际也是文件)
- 如果 package.json 文件不存在或 main 指定的入口模块没有,则 node 会自动找该目录下的 index.js ,即 index.js 会作为一个默认备选项
- 如果以上条件不成立,则会进入上级目录寻找 node_modules 目录,以此循环,直到找不到报错
can not find module xxx
- 注意:第 6 条仅供参考,实际项目有且仅有一个 node_modules 目录(放在项目根目录下)
- 自己的模块(路径)
./
(当前目录,不可省略,但文件操作中./
可以省略,如:fs.readFile('file/a.js',function(){})
)../
(上一级目录,不可省略)/xxx
(首位的 / 表示当前文件模块所属磁盘的根路径,如c盘下的文件,/ 等于 c:/,此路径几乎不用)