module
module的基本概念
为了构建实用和可维护(maintainable)的应用,应该避免在global中创建变量和函数
Node中每一个文件被认为是一个module(module中的变量的作用域仅在本文件中–相当于OOP中的类的private,如果外部想要使用module中的变量,就需要export它,变为public)每一个文件是一个作用域,在这个作用域中有一个对象(并不是global的属性)module
1
2
3
4
5
6
7
8
9
10module:Module {
id: '.',
path: 'D:\\CSS&HTML练习',
exports: {},
parent: null,
filename: 'D:\\CSS&HTML练习\\global.js',
loaded: false,
children: [],
paths: [ 'D:\\CSS&HTML练习\\node_modules', 'D:\\node_modules' ]
}main module:相当于主类
创建和加载一个module
创建一个module只需要新建一个文件即可,如果要export 一个function或variable,使用module.exports.xx=xxx;|| module.export = xx;
加载module:require(’path’);这样就引入了path路径文件中的module.exports对象
module是如何实现的?
- 为什么每个文件是一个独立的作用域?
其实就是在每个文件中创建了一个函数作用域
像这样 :(
function(exports,require,module,__filename,__dirname){
//在这里写入代码
}
)();
- 这也就是为什么在每个文件中都可用require引入(但是require又不是global的属性),因为require作为参数传入了每一个module中
nodejs内置module:
- fs(file system):里面所有的API都有async,sync模式,async(异步)都有一个callback函数
1 | const fs = require('fs'); |
Events module
Class:EventEmitter(是一个类)=>require(‘events’);
1 | const emitter = new EventEmitter(); |
- event传参
1 | emitter.addListener('logger',(eventArg)=>{ |
在一个对象中的emit和listener才能使listener生效
所以在一个module中创建EventEmitter对象调用emit。并在另一个module中创建EventEmitter对象on来监听是无效的。
这就用到了封装的思想。当 一个对象可能触发事件时,我们可以给他封装上eventEmitter
在log.js中:
1 | const EventEmitter = require('events'); |
在main.js中
1 | const Logger = require('./global'); |
- HTTP Module
1 | const http = require('http'); |