版权声明:转载请注明出处 https://blog.csdn.net/weixin_43586120/article/details/89923302
Node.js采用模块化结构,按照CommonJS规范定义和使用模块。模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件。
1、概述
1> require命令用于指定加载模块,加载时可以省略脚本文件的后缀名。
//自定义模块
var circle = require('./circle.js');
// node的内置模块/第三方模块
var circle = require('./circle');//这时node会到模块的安装目录,去寻找已安装的模块
2> 有时候,一个模块本身就是一个目录,目录中包含多个文件。Node会在package.json文件中,寻找main属性所指明的模块入口文件。
//package.json
{
"name" : "bar",
"main" : "./lib/bar.js"
}
//模块的启动文件为lib子目录下的bar.js。当使用require('bar')命令加载该模块时,实际上加载的是./node_modules/bar/lib/bar.js文件
//如果模块目录中没有package.json文件,node.js会尝试在模块目录中寻找index.js或index.node文件进行加载。
var bar = require('bar/lib/bar.js')
//与上面写法效果同
模块一旦被加载以后,就会被系统缓存。如果第二次还加载该模块,则会返回缓存中的版本,这意味着模块实际上只会执行一次。如果希望模块执行多次,则可以让模块返回一个函数,然后多次调用该函数。
2、node的模块分为三类 : 内置模块、第三方模块、自定义模块。
1> 自定义模块
var circle = require('./circle');
2> 内置模块(node本身还提供了一系列功能模块,不用下载就可以使用,可与操作系统互动,加载时最优先加载)
http | 提供HTTP服务器功能 |
url | 解析URL |
fs | 与文件系统交互 |
querystring | 解析URL的查询字符串 |
child_process | 新建子进程 |
util | 提供一系列实用小工具 |
path | 处理文件路径 |
crypto | 提供加密和解密功能,基本上是对OpenSSL的包装 |
内置模块的源码都在Node的lib子目录中。为了提高运行速度,它们安装时都会被编译成二进制文件。
3> 第三方模块(需要先下载才能使用)
// foo.js
module.exports = function(x) {
console.log(x);
};
// index.js
var m = require('./foo');
m("这是自定义模块");
$ node index
这是自定义模块
module是整个模块文件的顶层变量,它的exports属性就是模块向外输出的接口。如果直接输出一个函数,那么调用模块就是调用一个函数。但是模块也可以输出一个对象。
// foo.js
var out = new Object();
out.print = (a)=>{
console.log(a);
};
module.exports = out;
// index.js
var m = require('./foo');
m.print("这是自定义模块");