nodeJs模塊系統(tǒng)
nodeJs提供一個(gè)簡(jiǎn)單的模塊系統(tǒng)诺核。
模塊是nodeJs應(yīng)用程序的基本組成部分, 模塊與文件一一對(duì)應(yīng)(一個(gè)文件即一個(gè)模塊)情连。
下面舉一個(gè)學(xué)校的例子(學(xué)校里有班級(jí)算吩,班級(jí)有老師和學(xué)生);
新建一個(gè)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)
})
}
// 實(shí)例
exports.add = add
// 支持存在的東西 這種方式存在會(huì)忽視上一中方式的屬性和方法
//module.exports = add```
index.js,代碼如下:
```var klass = require('./class')
//因?yàn)閏lass為js內(nèi)置對(duì)象虑鼎,不能自己定義一個(gè)對(duì)象取名class梁肿,所以此處用klass
exports.add = function(klasses) {
klasses.forEach(function(item, index){
var _klass = item;
var teacherName = item.teacherName;
var students = item.students;
})
}```
這就是一個(gè)簡(jiǎn)約版的小學(xué)校啦顽分。主要通過(guò)export暴露模塊的接口舔清,然后通過(guò)require來(lái)請(qǐng)求模塊丝里。
##服務(wù)端的模塊
http,fs這種原生的模塊又是在哪呢体谒?
NodeJs中存在四類模塊(原生模塊和三種文件模塊),盡管require方法極其簡(jiǎn)單杯聚,但是內(nèi)部的加載卻是十分復(fù)雜的,其加載優(yōu)先級(jí)也各自不同.
Node.js 的 require方法中的文件查找策略如下:
```flow
st=>start: 開(kāi)始require
queryFileModule=>operation: 查詢文件模塊
loadFileModule=>operation: 根據(jù)擴(kuò)展名加載文件模塊
cacheFileModule=>operation: 緩存文件模塊
loadNativeModule=>operation: 加載原生模塊
cacheNativeModule=>operation: 緩存原生模塊
nativeModuleCache=>condition: 是否在原生模塊緩存區(qū)抒痒?
nativeModule=>condition: 是否原生模塊幌绍?
fileCache=>condition: 是否在文件緩存區(qū)中?
e=>end: 返回export
st-> fileCache
fileCache(yes)->e
fileCache(no)->nativeModule
nativeModule(yes)->loadNativeModule->cacheNativeModule->e
nativeModule(no)->queryFileModule->loadFileModule->cacheFileModule->e
ps:流程圖還沒(méi)找到解決方案- -有知道的小伙伴可以教我呀- -