node模块加载机制

来源:互联网 发布:淘宝手机端转换工具 编辑:程序博客网 时间:2024/06/10 19:52

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方法加载该模块时,其实加载的是全局环境中模块