nodeJs模块系统
nodeJs提供一个简单的模块系统。
模块是nodeJs应用程序的基本组成部分, 模块与文件一一对应(一个文件即一个模块)。
下面举一个学校的例子(学校里有班级,班级有老师和学生);
新建一个student.js,代码如下:
console.log('Add Student:' + student);
}
exports.add = add ```
teacher.js,代码如下:
```function add(teacher) {
console.log('Add Teacher:' + teacher);
}
exports.add = add;```
class.js,代码如下:
```var student = require('./student');
var teacher = require('./teacher');
function add(teacherName, students) {
teacher.add(teacherName);
students.forEach(function(item, index){
student.add(item)
})
}
// 实例
exports.add = add
// 支持存在的东西 这种方式存在会忽视上一中方式的属性和方法
//module.exports = add```
index.js,代码如下:
```var klass = require('./class')
//因为class为js内置对象,不能自己定义一个对象取名class,所以此处用klass
exports.add = function(klasses) {
klasses.forEach(function(item, index){
var _klass = item;
var teacherName = item.teacherName;
var students = item.students;
})
}```
这就是一个简约版的小学校啦。主要通过export暴露模块的接口,然后通过require来请求模块。
##服务端的模块
http,fs这种原生的模块又是在哪呢?
NodeJs中存在四类模块(原生模块和三种文件模块),尽管require方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同.
Node.js 的 require方法中的文件查找策略如下:
```flow
st=>start: 开始require
queryFileModule=>operation: 查询文件模块
loadFileModule=>operation: 根据扩展名加载文件模块
cacheFileModule=>operation: 缓存文件模块
loadNativeModule=>operation: 加载原生模块
cacheNativeModule=>operation: 缓存原生模块
nativeModuleCache=>condition: 是否在原生模块缓存区?
nativeModule=>condition: 是否原生模块?
fileCache=>condition: 是否在文件缓存区中?
e=>end: 返回export
st-> fileCache
fileCache(yes)->e
fileCache(no)->nativeModule
nativeModule(yes)->loadNativeModule->cacheNativeModule->e
nativeModule(no)->queryFileModule->loadFileModule->cacheFileModule->e
ps:流程图还没找到解决方案- -有知道的小伙伴可以教我呀- -
网友评论