node模块加载分为三类
A.内置模块 require('http')或require('mymodule') 不已 / 、./、../、开头的模块
B.相对路径模块 require('./todo.js') 或 require('../node/demo/module/user.js') 相对于调用require方法的文件
C.绝对路径模块 require('/user/node/demo/module.js')
内置模块要么是核心模块,要么是node_modules文件夹中的模块
核心模块总是优先加载。例如,require('http') 总是返回内置的 HTTP 模块,即使该名称的文件存在;
如果没有找到确切的文件,Node 将尝试给所需的文件名添加 .js 后缀再加载,然后再尝试 .node。
*.js 文件被视为 JavaScript 文本文件,而 *.node 文件被视为已编译的插件模块
如果以相对路径或绝对路径的方式加载模块未找到对应的文件,但找到对应的文件夹时,node会尝试加载该文件夹下的package.json文件,如果未找到package.json文件,node还会尝试加载index.js,或者index.node
package.json文件格式为:
{
"name" : "some-library", "main" : "./lib/some-library.js" } node会加载该文件中的main模块
如果调用
require() 的文件已经在一个 node_modules 层级里,那么最顶层的 node_modules 文件夹将被视为搜索树的根。
例如,如果在文件 '/home/ry/projects/foo/node_modules/bar/node_modules/baz/quux.js' 中调用require('asdf.js'),那么 Node 将搜索下列位置:
/home/ry/projects/foo/node_modules/bar/node_modules/baz/node_modules/asdf.js
/home/ry/projects/foo/node_modules/bar/node_modules/asdf.js
/home/ry/projects/foo/node_modules/asdf.js
如果在文件 '/home/ry/projects/foo.js' 中调用 require('bar.js'),那么
Node 将在下列位置查找,顺序如下:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
一旦模块通过require方法被加载进node中,该模块便会被在全局环境中保持,但再次通过require方法加载该模块时,其实加载的是全局环境中模块