Node.js使用的是JavaScript语言,Node.js的模块概念与JavaScript的模块概念完全一致。JavaScript中有4
种模块系统规范,而Node.js选择使用CommonJS规范。
在Node.js
中,使用内置的全局函数require(str)
来加载一个模块。
require(str)
有一个参数,是String
对象。
加载指定路径的JavaScript
源文件。
jsFilePath
可以是绝对路径
,也可以是以./
或../
开头的相对路径
。
jsFilePath
中的文件后缀名
可以省略。后缀名.js
会尝试自己补上。
示例:
const myModule = require('/home/fpliu/xx/src/myModule.js');
const myModule = require('/home/fpliu/xx/src/myModule');
const myModule = require('../myModule.js');
const myModule = require('../myModule');
const myModule = require('./myModule.js');
const myModule = require('./myModule');
用于加载Node.js
的内置模块
。
Node.js
本身自带了很多的模块,称为内置模块
。
可以通过如下代码获得Node.js
的内置模块
名称列表:
require('module').builtinModules;
Node.js
的内置模块
有如下:
示例:
const os = require('os');
const fs = require('fs');
用于加载一个非内置模块
或者包中的主模块
。
一个包中的主模块是package.json
中的main
字段指定的js
文件。 如果package.json
中缺失main
字段,那么,会依次查找index.js
、index.node
。
示例:
const express = require('express.js');
const express = require('express');
我们假设/home/fpliu/blog/src/app.js
中有如下的加载express
模块的代码:
const express = require('express');
对于express
这个字符串,它既不是一个文件路径
,也不是Node.js
的内置模块
名称, 所以,它不符合前面2
种情况,这时候它可能就是要查找express.js
文件或者是要查找express
包。
查找符合条件的模块的过程如下:
$NODE_PREFIX
是Node.js Runtime的安装路径,可以通过npm config get prefix
命令获得。
只要找到一个,就停止寻找。
通常,在package.json
所在的目录下,会有node_modules
目录,该目录下就存在了该包所依赖的所有包。
前面我们给出了require(str)
函数的参数的3
种情况。 这3
种情况的优先级如下:
1、如果str
是文件路径
,那么就直接加载,如果不存在对应文件,就直接报告错误;
2、如果str
不是文件路径
,看它是不是内置模块
,如果是内置模块
,就直接加载对应的内置模块
;
3、如果str
不是内置模块
,就会依次从当前文件所在目录依次向向父目录、NODE_PATH
环境变量指定的目录, 查找node_modules
目录下的模块
或者包
的主模块
4、如果还没有找到,就去$HOME/.node_modules/
目录下查找;
5、如果还没有找到,就去$HOME/.node_libraries/
目录下查找;
6、如果还没有找到,就去$NODE_PREFIX/lib/node_modules
目录下查找;
7、如果还没有找到,就报告错误。
require(str)
无论被调用了多少次,只有第一次会加载代码
。
require(str)
函数是有返回值的,这个返回值是什么呢? 这个返回值实际上是你加载的这个模块里面的module.exports
变量指向的内容, 那个模块里面把什么东西赋值给了module.exports
变量,require(str)
的返回值就是什么,你就可以直接在这个文件中使用它, 被加载的模块里没有被赋值给module.exports
的东西不能在该模块中使用。
如果你只想提供一个函数供外部使用,就把函数赋值给module.exports
就行了, 如果你想要提供多个函数给外部使用,你就把一个对象赋值给module.exports
就行。
理论上,任何类型的东西都可以赋值给module.exports
。
成千上万的个人、组织、公司为Node.js
开发第三方模块。