require方法加载规则
-
优先从缓存中加载
- 如果文件已经加载过了,再次执行的时候,不会重新加载 (已经缓冲了)
- 可以拿到其中的接口对象(从缓冲当中拿到接口对象),但是不会重复执行里面的代码
- 这样做的目的是为了避免重复加载,提高模块的加载效率
-
判断模块标识
-
require('模块标识')
-
核心模块
-
第三方模块(如art-template)
1、先找到当前文件所处目录中的node_modules目录
2、node_modules/art-template
3、node_modules/art-template/package.json文件
- package.json叫包描述文件
4、node_modules/art-template/package.json文件中的main属性
5、main属性中就记录了art-template的入口模块
6、然后加载使用这个第三方包
7、实际上最终加载的还是文件
8、如果package.json文件不存在或者main指定的入口模块也没有
- 则node会自动找该目录下的index.js
- 也就是说index.js会作为默认备选项
9、如果以上所有任何一个条件都不成立,则会进入上一级目录中的node_mudules目录查找
-
如果上一级还没有,则继续往上一级查找node_mudules
-
如果直到当前磁盘根目录还找不到,最后会报错
can not find module xxx
10、当然,我们一个项目有且只有一个node_modules,放在项目根目录中,这样的话项目的子目录都可以加载到第三方包
- 不会出现多个node_mudules
-
自己写的模块
-
文件路径
-
路径形式的模块
./ (当前目录下)
../ (上级目录)
/xxx (绝对路径很少用,因为依赖于磁盘根路径)
/ (首位的/表示的是当前文件模块所属磁盘根路径)
-
-
-
核心模块的本质也是文件
-
核心模块文件已经被编译到了二进制文件中了,只需要安装加载模块对应的名字就可以了
-
require 加载模块的时候是同步还是异步
CommonJS 规范
node使用的是 CommonJS 规范
- nodejs的require是同步!
- require('name')同步加载模块的形式
requirejs
RequireJS 是一个 js 文件和模块加载器。它非常适合在浏览器中使用,但它也可以用在其他 js 环境,它解决了 CommonJS 规范不能用于浏览器端的问题
注意 requirejs可以异步也可以同步,需要导包
- requirejs(['name1', 'name2'],callback)异步加载模块的形式
require支持加载的资源类型
- 支持的资源类型有:js、json、node、any【任何类型文件->会通过js引擎【当作js代码】来解析】
- .js => module.exports / exports
- .json =>JSON.parse
- .node => process.dlopen 【调用c++插件】基本用不上