Node.js的模块
1.0、参考
1.1、Node.js的模块简介

Node.js使用的是JavaScript语言,Node.js的模块概念与JavaScript的模块概念完全一致。JavaScript中有4模块系统规范,而Node.js选择使用CommonJS规范。

1.2、加载模块

Node.js中,使用内置的全局函数require(str)来加载一个模块。

require(str)有一个参数,是String对象。

1.2.1、require(jsFilePath)

加载指定路径的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');
1.2.2、require(builtinModuleName)

用于加载Node.js内置模块

Node.js本身自带了很多的模块,称为内置模块

可以通过如下代码获得Node.js内置模块名称列表:

require('module').builtinModules;

Node.js内置模块有如下:

示例:

const os = require('os');
const fs = require('fs');
1.2.3、require(otherModule | packageName)

用于加载一个非内置模块或者中的主模块

一个中的主模块是package.json中的main字段指定的js文件。 如果package.json中缺失main字段,那么,会依次查找index.jsindex.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_PREFIXNode.js Runtime的安装路径,可以通过npm config get prefix命令获得。

只要找到一个,就停止寻找。

通常,在package.json所在的目录下,会有node_modules目录,该目录下就存在了该包所依赖的所有包。

1.2.4、require(str)的注意点

前面我们给出了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)无论被调用了多少次,只有第一次会加载代码

1.3、导出模块

require(str)函数是有返回值的,这个返回值是什么呢? 这个返回值实际上是你加载的这个模块里面的module.exports变量指向的内容, 那个模块里面把什么东西赋值给了module.exports变量,require(str)的返回值就是什么,你就可以直接在这个文件中使用它, 被加载的模块里没有被赋值给module.exports的东西不能在该模块中使用。

如果你只想提供一个函数供外部使用,就把函数赋值给module.exports就行了, 如果你想要提供多个函数给外部使用,你就把一个对象赋值给module.exports就行。

理论上,任何类型的东西都可以赋值给module.exports

1.4、第三方模块

成千上万的个人、组织、公司为Node.js开发第三方模块。

不过,第三方模块必须以的方式提供, 所以,第三方模块都是存在于某个里的。