模块定义和使用
在模块中, 上下文提供 require () 方法来引入外部模块。 对应引入的功能, 上下文提供了 exports 对象用于导出当前模块的方法或者变量,并且它是唯一导出的出口。在模块中,还存在 一个 module 对象,它代表模块自身,而 exports 是 module 的属性。在 Node 中,一个文件就是一个 模块,将方法挂载在 exports 对象上作为属性即可定义导出的方式:
// math.js
exports.add = function () {
var sum = 0,
i = 0,
args = arguments,
l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
在另一个文件中,我们通过 require () 方法引入模块后,就能调用定义的属性或方法了:
// program.js
var math = require('math');
exports.increment = function (val) {
return math.add(val, 1);
};
在 Node 中引入模块,需要经历如下 3 个步骤。
- (1) 路径分析
- (2) 文件定位
- (3) 编译执行
在 Node 中,模块分为两类:一类是 Node 提供的模块,称为核心模块;另一类是用户编写的 模块,称为文件模块。
- 核心模块部分在 Node 源代码的编译过程中,编译进了二进制执行文件。在 Node 进程启动 时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编 译执行这两个步骤可以省略掉, 并且在路径分析中优先判断, 所以它的加载速度是最 快的。
- 文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速 度比核心模块慢。
Reference
- 《深入浅出 Node.js》
FEATURED TAGS
algorithm
algorithmproblem
architecturalpattern
architecture
aws
c#
cachesystem
codis
compile
concurrentcontrol
database
dataformat
datastructure
debug
design
designpattern
distributedsystem
django
docker
domain
engineering
freebsd
git
golang
grafana
hackintosh
hadoop
hardware
hexo
http
hugo
ios
iot
java
javaee
javascript
kafka
kubernetes
linux
linuxcommand
linuxio
lock
macos
markdown
microservices
mysql
nas
network
networkprogramming
nginx
node.js
npm
oop
openwrt
operatingsystem
padavan
performance
programming
prometheus
protobuf
python
redis
router
security
shell
software testing
spring
sql
systemdesign
truenas
ubuntu
vmware
vpn
windows
wmware
wordpress
xml
zookeeper