在学习node时,最先接触的概念就是 “模块化”,我们将一些 .js 文件看做是一个模块进行封装起来,并通过exports、require来暴露出去、导入进来使用。
模块系统:
-
node中没有全局作用域的概念
-
node中,只能通过
require
方法来加载执行多个js脚本文件 -
require 会形成模块作用域
- 模块是完全封闭的
- 内外部无法互相访问
-
构成: 核心模块(fs、path、http等),自己写的模块
/*
思考:exports、require
1.window不是node的全局变量
2.node中只有一个全局变量 global
3.exports、require本质上是函数的参数
通过arguments(函数的标识)来获取函数的所有参数
通过打印 arguments.callee 来获取函数自身
arguments.callee.toString()
4.本质上node模块外部是一个函数
所有模块中的代码都是包装在一个函数中执行的,并且在函数执行的同时传递进去5个参数
function (exports, require, module, __filename, __dirname) {
...函数体(就是该 .js 模块文件中的内容)...
}
剖析node模块结构:
exports:该对象将函数内部的局部变量或局部函数暴露到外部
require:用来引入外部的模块
module:代表的是当前模块本身,exports就是起属性,可以使用exports或module.exports导出
__filename:当前文件的完整路径
__dirname:当前文件所在文件件的路径
exports、module.exports的主要区别:
exports只能通过 .语法 来向外暴露内部语法, exports.*** = ***;
module.exports 即可以通过 .语法 也可以通过直接赋值一个对象 module.exports = {***:***};
二者之间的关系:
let md = new Object();
md.exports = new Object({});
let exports = md.exports;
exports.name = "***";
这样操作之后,exports 的本质发生了变化,不在是module.exports对象了
*/
console.log(module.exports === exports); //true
node 中的模块化require做的事情:
- 执行导入模块中的代码;
- 获取导入模块的
exports
对象; - 但是js中的模块引入是为了共享使用各个模块中的内容;
扩展IP和端口号:
ip 地址目的是为了找到对应的机器;
端口号是为了找到机器上的应用程序;
任何需要联网通信的程序都需要对应端口号才能精确定位;