node 系统中,每个文件都是独立的模块,利用require,来加载模块。所以说由于模块的存在,require类似全局对象。
可以通过require.main === module来判断一个文件是否被直接运行。
require()
的文件是基于实际路径来查找的,模块在第一次加载后会被缓存。 多次调用 require()
不会导致模块的代码被执行多次。
模块是基于其解析的文件名进行缓存 所以说文件命名时大小写要注意一致,防止多次加载。
Node.js 有些模块会被编译成二进制, require会优先加载核心模块。
文件加载规则:‘/’,绝对路径。‘./’,当前路径。‘../’父路径。当没有任何参数时,表示加载核心模块或者加载node_module模块
加载node_module模块的规则:从当前模块的父目录开始,尝试从它的 /node_modules
目录里加载模块。 Node.js 不会附加 node_modules
到一个已经以 node_modules
结尾的路径上。如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录。
__dirname:获取到当前父文件的绝对路径
__filename:获取到当前文件的绝对路径
require.cache:被引入的模块被缓存在这个对象中,将其对象改变,会导致下一次require会重新加载被删除的模块。
require.resolve(url):返回改路径的绝对路径,字符串。
require.resolve.paths(request):返回改路径的绝对路径,数组。
模块主要api有,module.exports,exports 则是前一个参数的缩写,require()这种加载方式是动态加载,是common.js语法。与es6静态加载有所不同