每个文件都视为独立的模块,每个模块都有Module对象
require.main === module 判断该文件是否直接运行,而不是被引用
如何加载模块
exports 模块方法导出对象
require() 引入模块方法(首次引入时会执行一次)
require 引入后的对象就是一个引入文件的exports
注: 1.一个模块能被引用多次,返回的相同的对象,首次引用时将模块运行并加载在缓存中,之后每次引用都是从缓存加载,不再重新运行加载
2.模块加载时基于解析传入的文件名进行缓存,并且区分大小写
require默认参数形式:
不带后缀:会尝试带着.js、.json、.node拓展名再加载
携带前缀:’/’寻找绝对路径;’./’相对路径,与该文件同目录;’../’核心模块或来自node_modules目录
未加前缀:
①核心模块
②从当前父级目录开始,尝试在该目录的/node_modules寻找,没找到则移至再父一级尝试,直到文件系统根目录,例:require(‘str.js’);
/1/2/3/4/node_modules/str.js
/1/2/3/node_modules/str.js
/1/2/node_modules/str.js
/1/node_modules/str.js
/node_modules/str.js
目录:试图加载路径下package.json(需指定一个main模块{”main”:”./lib/main.js”})、index.js、index.node文件
如果给定路径或文件不存在,require()会抛出一个ERROR:cannot find module
exports与module.exports
module.exports对象是由模块系统创建的,而exports是一个快捷方式,是module.exports更简短的引用形式;
exports 变量是在模块的文件级别作用域内有效的,在模块被执行前被赋予module.exports的值。如果将一个新值赋值给exports,exports指向新的内存地址,它不再绑定到module.exports,而是成为一个模块内的普通变量,不再向外导出
在第7行赋值之前依然有效,
之后则转变为普通变量
aaaaa