多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、概述 在 Node.js 模块系统中,每个文件都被视为一个独立的模块; npm install 执行完毕后,我们可以在 nodemodules 中看到所有依赖的包。虽然使用者无需关注这个目录里的文件夹结构细节,只管在业务代码中引用依赖包即可;node\_modules是安装node后用来存放用包管理工具下载安装的包的文件夹。比如webpack、gulp、grunt这些工具。在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块。 ## 二、模块类型 node.js中模块有两种类型:核心模块和文件模块; ## 三、核心模块 Node.js 核心模块会被编译成二进制,核心模块定义在 Node.js 源代码的`lib/`目录下,`require()`总是会**优先**加载核心模块; 核心模块直接使用名称获取: ~~~ var http=require('http'); ~~~ ## 四、文件模块 如果按确切的文件名没有找到模块,则 Node.js 会尝试带上`.js`、`.json`或`.node`拓展名再加载。 ~~~js const circle = require('./circle.js'); console.log(`半径为 4 的圆的面积是 ${circle.area(4)}`); ~~~ 1、.js 文件会被解析为 JavaScript 文本文件, .json 文件会被解析为 JSON 文本文件。 .node 文件会被解析为通过 process.dlopen() 加载的编译后的插件模块。 2、以 '/' 为前缀的模块是文件的绝对路径。 例如, require('/home/marco/foo.js') 会加载 /home/marco/foo.js 文件。 3、以 './' 为前缀的模块是相对于调用 require() 的文件的。 也就是说, circle.js 必须和 foo.js 在同一目录下以便于 require('./circle') 找到它。 4、当没有以 '/'、 './' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。 5、如果给定的路径不存在,则 require() 会抛出一个 code 属性为 'MODULE_NOT_FOUND' 的 Error。 ## 五、目录模块 可以把程序和库放到一个单独的目录,然后提供一个单一的入口来指向它。把目录递给`require()`作为一个参数,有三种方式: 1、第一种方式是在根目录下创建一个`package.json`文件,并指定一个`main`模块。 例子,`package.json`文件类似: ~~~json { "name" : "some-library", "main" : "./lib/some-library.js" } ~~~ 如果这是在`./some-library`目录中,则`require('./some-library')`会试图加载`./some-library/lib/some-library.js`。 这就是 Node.js 处理`package.json`文件的方式。 如果目录里没有`package.json`文件,或者`'main'`入口不存在或无法解析,则 Node.js 将会试图加载目录下的`index.js`或`index.node`文件。 例如,如果上面的例子中没有`package.json`文件,则`require('./some-library')`会试图加载: * `./some-library/index.js` * `./some-library/index.node` 2、如果传递给`require()`的模块标识符不是一个[核心模块](http://nodejs.cn/api/modules.html#modules_core_modules),也没有以`'/'`、`'../'`或`'./'`开头,则 Node.js 会从当前模块的父目录开始,尝试从它的`/node_modules`目录里加载模块。 Node.js 不会附加`node_modules`到一个已经以`node_modules`结尾的路径上。如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录。 例如:如果在`'/home/ry/projects/foo.js'`文件里调用了`require('bar.js')`,则 Node.js 会按以下顺序查找: * `/home/ry/projects/node_modules/bar.js` * `/home/ry/node_modules/bar.js` * `/home/node_modules/bar.js` * `/node_modules/bar.js` 3、从全局目录加载 如果`NODE_PATH`环境变量被设为一个以冒号分割的绝对路径列表,则当在其他地方找不到模块时 Node.js 会搜索这些路径; * `$HOME/.node_modules` * `$HOME/.node_libraries` * `$PREFIX/lib/node`